我正在使用 PHP 开发面向服务的架构。
我团队的一名成员建议,由于每个服务仅提供 HTTP 流量,仅以 JSON 形式提供响应(无静态资产等),因此最好仅运行 FPM 并让负载均衡器将流量直接发送到实例的 IP 地址以及 FPM 暴露的端口。
我以前只听说过 PHP-FPM 和 Nginx 一起运行。所有在线文献都建议同时运行 NGINX 和 FPM,但没有解释原因。NGINX 提供的唯一好处是能够提供静态资产以及 PHP 生成的输出吗?
如果 NGINX 以另一种方式增加价值,它在做什么以及在哪里可以找到支持文档。
我的 PHP OPcache 达到 100% 内存使用率
General info
Zend OPcache 7.0.4-dev
PHP 5.5.23-1+deb.sury.org~trusty+2
Server Software nginx/1.6.2
Run Code Online (Sandbox Code Playgroud)
这是我的缓存设置:
zend_extension=opcache.so
opcache.memory_consumption=1024
opcache.max_accelerated_files=50000
opcache.revalidate_freq=180
opcache.consistency_checks=0
Run Code Online (Sandbox Code Playgroud)
还有一些关于缓存命中的更多信息:
total memory: 1024.000MB
used memory: 1010.398MB
free memory: 35.086KB
wasted memory: 13.568MB (1.32%)
number of cached files: 10,724
number of hits: 9,576,431
number of misses: 21,450
blacklist misses: 0
number of cached keys: 12,971
max cached keys: 65,407
Run Code Online (Sandbox Code Playgroud)

我应该担心 100% 内存使用率吗?有人可以用外行术语解释 OPcache 内存使用吗?
服务器有 8GB 内存(Linode)
我在 php.ini 中增加了 params 值:
upload_max_filesize = 10M
post_max_size = 12M
Run Code Online (Sandbox Code Playgroud)
而php --ini在控制台命令显示我:
post_max_size => 12M => 12M
upload_max_filesize => 10M => 10M
Run Code Online (Sandbox Code Playgroud)
但无论如何,当我尝试发送大于 1mb 的文件时,我会出错。在 nginx 日志中,我看到:
2017/06/03 12:06:40 [error] 16254#16254: *7 client intended to send too large body: 1778665 bytes
Run Code Online (Sandbox Code Playgroud)
fastcgi_param PHP_VALUE "upload_max_filesize = 10M \n post_max_size=12M" 在 nginx conf 中也没有帮助。
那么,如何增加最大上传文件大小?
我的 nginx 不断崩溃并在浏览器中报告“坏网关”错误。Nginx 和 PHP-FPM 没有预先配置来处理大流量负载。我必须systemctl restart php7.0-fpm每小时安排一次cron 工作,以确保我的网站在运行时不会停留太久。让我们开始吧。
我从中得到的一些错误/var/log/php7.0-fpm.log:
[20-Sep-2017 12:08:21] NOTICE: [pool web3] child 3495 started
[20-Sep-2017 12:08:21] NOTICE: [pool web3] child 2642 exited with code 0 after 499.814492 seconds from start
[20-Sep-2017 12:32:28] WARNING: [pool web3] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 7 idle, and 57 total children
Run Code Online (Sandbox Code Playgroud)
nginx 日志中没有任何内容让我感到意外。如果我让它运行太长时间而不重新启动它 (PHP-FPM),我会收到网关错误。我已经尝试按照教程 3 次调整设置,但仍然不好。现在我可能已经完成了各种设置,但无论哪种方式都行不通。
/etc/nginx/nginx.conf:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
worker_rlimit_nofile 100000;
events …Run Code Online (Sandbox Code Playgroud) 所以,我一直在我的 docker 容器(nginx 连接到 php-fpm)上运行一些基准测试,它比裸机慢 70 倍以上。与每秒 7,000 个裸机相比,我每秒可以管理 100 个请求。
docker-compose.yml:
version: '3'
services:
#web
frontend:
build:
context: ./environment/nginx
dockerfile: ./Dockerfile
container_name: nginx_software
restart: always
ports:
- 80:80
volumes:
- ./environment/nginx/nginx.conf:/etc/nginx/nginx.conf
links:
- php
php:
build:
context: ./environment/php
args:
version: 7.3-fpm
dockerfile: ./Dockerfile
container_name: php_software
restart: always
ports:
- 9000:9000
volumes:
- ./api:/var/www/software:cached
links:
- mysql
mysql:
build:
context: ./environment/mysql
args:
version: 5.7
dockerfile: ./Dockerfile
container_name: mysql_software
command: --default-authentication-plugin=mysql_native_password
restart: always
ports:
- 3306:3306
volumes:
- ./environment/mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: …Run Code Online (Sandbox Code Playgroud) 这是一个常见问题,但我仔细检查了建议的解决方案,但没有成功。
这些是来自 PHP 的错误:
Warning: move_uploaded_file(images/img01.jpg): failed to open stream: Permission denied in /usr/share/nginx/html/media/test.php on line 28
Warning: move_uploaded_file(): Unable to move '/tmp/phpRvUCVx' to 'images/img01.jpg' in /usr/share/nginx/html/media/test.php on line 28
Run Code Online (Sandbox Code Playgroud)
服务器已经安装了 nginx 和 php 7.3 (php-fpm)
上传文件夹的权限:
drwxrwxrwx. 2 nginx nginx 6 Apr 5 03:11 images
Run Code Online (Sandbox Code Playgroud)
信息来自ps aux | grep php
centos 24211 0.0 0.0 112708 980 pts/0 S+ 16:01 0:00 grep --color=auto php
root 24674 0.0 0.6 285532 11452 ? Ss Apr04 0:04 php-fpm: master process (/etc/opt/remi/php73/php-fpm.conf)
nginx 24675 …Run Code Online (Sandbox Code Playgroud) 通过访问 /fpm-status 页面,使用工具定期检索 Prometheus 指标。有时,该工具无法访问 /fpm-status 页面,因为 php-fpm 响应“服务器忙”。请稍后再试。' (HTTP 503) 在此期间 php-fpm 仅记录以下内容:
注意:[pool www]状态:记分板已在使用。
我们经营一个非常小的游泳池,只有两个静态的孩子。
pm = static
pm.max_children = 2
Run Code Online (Sandbox Code Playgroud)
对 /fpm-status 的请求可能会排队。但这通常不是问题。对 fpm 池的请求数量也非常低。所以我预计队列不会很长。(当然我不能确定,因为没有收集那段时间的指标)
查看fpm 源代码,我可以看到它无法获取记分牌上的锁。但它不会等待它可用。所以当没有获取到锁时,就会返回错误。但这是否意味着当另一个请求写入记分板(更新状态)时,fpm-status 不可用?
这是什么意思(即我该如何解决这个问题)?
尝试了很多示例,但似乎没有任何效果。我不想使用 yum/apt-get 我想从源头做所有事情,这样我才能更好地理解。Yum/apt-get 只是欺骗系统,您必须等待版本,而且您没有配置控制。