我的 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
nginx 日志中没有任何内容对我产生影响。如果我让它运行太久而不重新启动它(PHP-FPM),我会收到网关错误。我已经尝试按照教程 3 次调整设置,但仍然不行。现在,我可能已经完成了各种设置,但无论哪种方式,它都无法正常工作。
/etc/nginx/nginx.conf
:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
worker_rlimit_nofile 100000;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
sendfile on;
reset_timedout_connection on;
client_body_timeout 10;
send_timeout 2;
keepalive_timeout 30;
keepalive_requests 100000;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
fastcgi_read_timeout 300000;
client_max_body_size 9000m;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
access_log off;
}
/etc/php/7.0/fpm/php-fpm.conf
:
[www]
pm = dynamic
pm.max_spare_servers = 200
pm.min_spare_servers = 100
pm.start_servers = 100
pm.max_children = 300
[global]
pid = /run/php/php7.0-fpm.pid
error_log = /var/log/php7.0-fpm.log
include=/etc/php/7.0/fpm/pool.d/*.conf
/etc/php/7.0/fpm/pool.d/www.conf
:
[www]
user = www-data
group = www-data
listen = /run/php/php7.0-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 300
pm.start_servers = 100
pm.min_spare_servers = 100
pm.max_spare_servers = 200
pm.max_requests = 500
我的网站之一(/etc/php/7.0/fpm/pool.d/web3.conf
):
[web3]
listen = /var/lib/php7.0-fpm/web3.sock
listen.owner = web3
listen.group = www-data
listen.mode = 0660
user = web3
group = client1
pm = dynamic
pm.max_children = 141
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500
chdir = /
env[HOSTNAME] = $HOSTNAME
env[TMP] = /var/www/clients/client1/web3/tmp
env[TMPDIR] = /var/www/clients/client1/web3/tmp
env[TEMP] = /var/www/clients/client1/web3/tmp
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
来自 htop 的资源/proc 使用情况:
问题在于您的数据库访问。您有多个使用 CPU 的 MySQL 进程,这表明执行数据库查询需要很长时间。
您需要查看您的应用程序,寻找以下内容:
然后,缓慢的数据库查询会导致 PHP-FPM 用尽处理客户端请求的可用子进程。这将导致
502 Bad Gateway
错误。您可以尝试增加池的pm.max_children
设置web3
,因为这会导致错误。这可以消除可伸缩性症状,但不能解决应用程序/数据库效率低下的根本原因。如果您不使用该
www
池,您可以将其移除以节省其使用的资源。的理想设置
pm.max_requests
为零,即 PHP 工作者永远不应该重新启动。如果您的 PHP 工作人员没有由于库的错误编码而泄漏内存,那么您可以在那里使用零。否则,您可以使用使工作人员的内存使用保持得当的任何值。关于这个设置,真的没有任何其他好的建议可以提供。在这里你可以用 nginx 设置做的不多,因为它是 PHP-FPM 有时不可用。您可以更改
gzip_comp_level
为1
,这使得 nginx 花费更少的 CPU 压缩输出。但这与应用程序优化相比影响非常小。(这应该是一个评论,但它有点长)
....不是容量问题,除非您的服务器配置如此糟糕以至于 oom 杀手正在启动。而且不是您从日志中引用的错误。
为什么你在一个有 12 GB RAM 的盒子上有半 GB 的交换空间?
你的keepalive太高了。
您已禁用访问日志记录(您的日志是开始查找容量问题的地方)。
最上面的输出暗示了 mysql 性能的问题。
您的 pm.max_requests 太低。
你没有限制listen_backlog。
您在这里向我们展示的所有内容都有问题,这只是冰山一角。投票结束
是离线的web3网站吗?此日志条目似乎暗示了原因:
www 站点的 start_servers / max_spare_servers 的值非常高,但 web3 的值要低得多。
你似乎没有内存不足,所以给 mysql 更多可能会有所帮助。除非您的 php 应用程序从不查询 mysql,否则将 mysql 排除在优化过程之外是一个错误。
首先,您需要查看您的 mysql 配置。我相信大多数发行版在内存设置和线程数方面都相当保守。查找 mysql 示例配置,例如:my-large.cnf my-medium.cnf 并将它们与您的进行比较。基于 Debian 的发行版将它们放在 /usr/share/doc/mysql-server-xy/examples/ (其中 xy 是主要版本)
在调整各种旋钮时,我建议进行小的调整。例如,将值从 8M 更改为 16M。
如果它是您的 php 应用程序,您还需要查看 Tero Kilkanen 的回答所建议的慢查询日志。
希望有帮助。
以我的经验,尤其是在大型网站上,php-fpm 使用了大量的处理器能力。如果没有可用的缓存并且它必须等待您的页面在本地加载和呈现然后缓存它然后服务器缓存,就会发生这种情况。我以前在大型网站上遇到过同样的问题。最好的办法是使用 httrack 抓取您的网站,在 httrack 中设置速度限制,以免服务器过载。这将构建您的 nginx 缓存,然后一旦构建缓存,您将看到页面的即时加载和很少的 cpu 或 ram 使用。主要原因实际上归结为页面渲染,这可能是由过多的 JS 或 CSS 或最有可能由许多 SQL 请求或配置不当的 sql 数据库引起的。确保索引经常使用的数据库表。
htop 似乎表明与 MySQL 关联的 15 个 PID 中的每一个都使用了超过 1:nn.nn 的 TIME,并且每个都有至少 1G 的 VIRT RAM 正在使用中。由于您总共有 12 GB RAM,是时候与我们分享您的
允许对您的 MySQL 配置进行一些合理的检查,即使这不是问题?1 天 11 小时的正常运行时间令人鼓舞。
知道 PID 6148 在做什么,而 TIME 是 28:+ 吗?
从@xendi 今天早些时候的回复中......“无论何时发生这种情况,所有站点上的所有页面,无论是什么脚本或内容,都会出现网关错误。所有页面和站点都会发生这种情况”
你看过 php .ini session.gc_maxlifetime = nnnn 垃圾收集秒数是可能的原因吗?
2017 年 9 月 24 日 nginx.conf 可能会产生影响的问题
可能是一个有用的链接。
似乎都是关于记忆的。
尽量减少php服务器的数量,限制php和mysql服务器的内存。