我的nginx在浏览器中不断崩溃并报告“坏门户”错误。 Nginx和PHP-FPM不会预先configuration来处理大stream量负载。 为了确保我的网站在停留时间不会太长,我必须在每个小时将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)运行太久,我会得到网关错误。 我已经尝试了三次以下的教程,现在调整设置,但它仍然不好。 现在我已经有了各种各样的设置,但是我从来没有这样做过。
/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耗尽处理客户端请求的可用subprocess。 这将导致502 Bad Gateway错误。 您可以尝试增加pm.max_children池的pm.max_children设置,因为这会导致错误。 这可以消除可伸缩性症状,但不能解决应用程序/数据库低效的根本原因。
如果您不使用www池,则可以将其删除以保存其使用的资源。
pm.max_requests的理想设置是零,也就是说,不应该重新启动PHP工作。 如果您的PHP工作人员不会由于库编码错误而泄漏内存,那么您可以在那里使用零。 否则,您可以使用保持工人的内存使用情况的任何值。 关于这个设置真的没有任何其他的好build议。
这里没有太多可以用nginx设置,因为它是有时不可用的PHP-FPM。 您可以将gzip_comp_level更改为1 ,这使得nginx可以less花一点CPU压缩输出。 但是与应用程序优化相比,这个效果非常小。
(这应该是一个评论,但它有点长)
我的网站不断崩溃
….不是一个容量问题,除非你的服务器是如此糟糕的configuration,OOM杀手踢英寸而不是你从日志引用的错误。
你为什么要在12G RAM的机器上进行半个交换?
你的keepalive太高了。
您已禁用访问日志logging(您的日志是开始寻找容量问题的地方)。
最重要的输出提示了mysql性能的问题。
您的pm.max_requests太低。
你没有限制listen_backlog。
你们在这里展示的一切都有问题,只是冰山一angular。 投票结束
它是离线的web3网站? 这个日志条目似乎是build议的原因:
[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)
对于www站点,start_servers / max_spare_servers的值非常高,但web3的值要低得多。
你似乎不是内存不足,所以给更多的MySQL可能会有所帮助。 除非你的php应用程序从不查询mysql,否则将mysql留在优化过程中是一个错误。
首先,你会想看看你的MySQLconfiguration。 我相信大多数发行版在内存设置和线程数方面都相当保守。 查找mysql示例configuration,例如:my-large.cnf my-medium.cnf并将它们与您的相比较。 基于Debian的发行版在/ usr / share / doc / mysql-server-xy / examples /(其中xy是主要版本)
调整各种旋钮时,我build议小调整。 例如,将一个值从8M更改为16M。
如果这是你的PHP应用程序,你也想看看Tero Kilkanen的答案build议的慢查询日志。
希望有所帮助。
根据我的经验,特别是对于一个大型网站,php-fpm使用了大量的处理器function。 如果没有可用的caching,则会发生这种情况,并且必须等待页面在本地加载并呈现,然后将其caching到服务器caching中。 之前我曾遇到过与大型网站相同的问题。 最好的办法是使用httrack抓取您的网站,在httrack中设置速度限制,以免超载您的服务器。 这将build立你的nginxcaching,然后一旦cachingbuild立,你会看到即时加载的网页和很less的CPU或RAM使用情况。 主要原因是页面渲染,可能是由很多JS或CSS引起的,或者很可能是由于许多SQL请求或configuration不良的sql数据库引起的。 确保索引经常使用的数据库表。
htop似乎表示与MySQL关联的15个PID中的每一个都使用了大于1:nn.nn的TIME,并且每个至less有1G的VIRT RAM在使用中。 既然你总共有12GB内存,是时候和你分享一下了
SHOW GLOBAL STATUS; SHOW GLOBAL VARIABLES; SHOW ENGINE INNODB STATUS;
允许对你的MySQLconfiguration进行一些合理的检查,即使这不是问题? 正常运行时间为1天,11个小时是令人鼓舞的。
任何想到PID 6148正在做什么,都有28年的时间:+投入的努力?
从今天早些时候的@xendi回应….“每当发生这种情况,所有网站上的所有页面,不pipe是什么脚本或内容,错误的网关错误,这发生在所有页面和网站”
你有没有看过php.ini session.gc_maxlifetime = nnnn垃圾回收秒作为一个可能的原因?
09/24/2017 nginx.conf可能会有影响的问题
client_max_body_size 9000m; # really 9G in one body? client_body_timeout 10; # seconds to receive the client body seems short. open_file_cache max=200000 inactive=20s; may be causing churn at 20s https://www.linode.com/docs/web-servers/nginx/configure-nginx-for-optimized-performance/
可能是有用的链接。
这似乎是关于记忆的一切。
尝试减lessphp服务器的数量,并限制php和mysql服务器的内存。