• 作者:SuperPaxxs扶摇直上九万里,绝云气,负青天,不知图哪了,正在努力搜索中..
    • 请在Chrome、Firefox等现代浏览器浏览本站。 有事 点击这里 联系博主
    • 想在魔帆博客投稿? 点击这里 联系博主
    • [ 既然来了就多看两篇文章嘛,你好意思走么? ]
    • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏魔帆博客吧

chenjunyu19 的 PHP-FPM 折腾记(解决 Nginx + PHP-FPM 频繁 502 的问题)

目录
[隐藏]

前言

大家是否发现本站前段时间访问非常缓慢?因为网站程序从万网免费空间迁到的阿里云 ECS 上,而数据库还留在万网空间,数据库就是远程访问,造成数据库查询速度十分慢。最近将数据库迁到了 ECS 上,速度也杠杠的,平均处理时间都低于 1 秒,访问量也有所增加。但是随着访问量的增加,PHP-FPM 撑不住了,基本上一个多小时就炸,导致 Nginx 连接不上 PHP-FPM,发生 502 错误,只有重启 PHP-FPM 才能解决。问题是没有理由整天去看他有没有炸啊对不对,于是我便开始了搜索折腾之旅。

上网一搜,好像这个问题也挺普遍的,大部分解决方案都是增加系统内核连接数、PHP 队列最大任务数(好像是这么叫吧,不清楚),不过似乎并没有什么卵用,该 502 的还是照样 502。经过我的多次实践,现在给出我的解决方案。

解决方案

增加 PHP-FPM 子进程数

使用 sudo netstat -napo |grep "php-fpm" | wc -l 来查看当前运行的 PHP-FPM 子进程数。

打开 /etc/php5/fpm/pool.d/www.conf

找到下面的内容

; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
; This value sets the limit on the number of simultaneous requests that will be
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
; CGI. The below defaults are based on a server without much resources. Don't
; forget to tweak pm.* to fit your needs.
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
; Note: This value is mandatory.
pm.max_children = 5

如果正在运行的数量已经达到或者接近最大数量,将 pm.max_children 改为 50。我认为这是个比较合适的值,不过要注意单个 PHP-FPM 进程的内存占用,避免内存不足造成尴尬。

另外,在配置 pm = dynamic 的情况下,适当的提高 pm.start_serverspm.min_spare_serverspm.max_spare_servers 的数值也是不错的方法,这里不做建议,请移步这里

; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 2

; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 1

; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 3

定时重启 PHP-FPM

定时重启 PHP-FPM 是一个保持 PHP-FPM 稳定运行的好方法,我设置的是每天 3:00 重启一次,我使用 cron 定时执行重启命令(我是在 ubuntu 环境下)

编辑定时任务文件

sudo crontab -e

添加下行

0 3 * * * service php5-fpm restart
不保证所有的 PHP-FPM 重启命令都一致,请自行尝试

将 TCP 切换为 UNIX 域套接字

UNIX 域套接字相比 TCP 套接字在 loopback 接口上能提供更好的性能(更少的数据拷贝和上下文切换)。

但有一点需要牢记:仅运行在同一台服务器上的程序可以访问UNIX域套接字(显然没有网络支持)。

同样打开 /etc/php5/fpm/pool.d/www.conf

找到 listen = ...,修改为 listen = /dev/shm/php5-fpm.sock

同时修改 Nginx 的 fastcgi_passfastcgi_pass unix:/dev/shm/php5-fpm.sock;

结语

修改完配置记得保存。这个方案我还没来得及检验就发出来了,不保证一定有效,更多方法请看这里


魔帆博客 , 版权所有丨如未注明 , 均为原创丨本网站均采用BY-NC-SA协议进行授权 , 转载请注明chenjunyu19 的 PHP-FPM 折腾记(解决 Nginx + PHP-FPM 频繁 502 的问题)
喜欢 (1)
[]
分享 (0)
关于作者:
一只爱好计算机爱玩 Minecraft 的初中狗。兼本站运维?
发表我的评论
取消评论
表情 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 目前访问速度还是可以的.但是如果以后流量更多.升级更好的服务器才是王道.
    恶搞大王2017-02-15 11:40 回复
×
订阅图标按钮