php-fpm优化总结经验分享
Nginx 与 php-fpm 运行流程
- Nginx 查看 nginx.conf 配置文件
- 加载 nginx 的 fast-cgi 模块
- php-fpm 监听 127.0.0.1:9000
- php-fpm 接收到请求,启用 worker 进程处理请求
- php-fpm 处理完请求,返回给 nginx
- nginx 将结果通过 http 返回给浏览器\
Nginx 与 php-fpm 通信机制
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | www.test.com | | Nginx | | 路由到 www.test.com/index.php | | 加载 nginx 的 fast-cgi 模块 | | fast-cgi 监听 127.0.0.1:9000 地址 | | www.test.com/index.php 请求到达 127.0.0.1:9000 | | 等待处理... |
Nginx 与 php-fpm 的结合
- 在 Linux 上,nginx 与 php-fpm 的通信有 tcp socket 和 unix socket 两种方式。
- tcp socket 的优点是可以跨服务器,当 nginx 和 php-fpm 不在同一台机器上时,只能使用这种方式。
- Unix socket 又叫 IPC (inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信,这种方式需要在 nginx 配置文件中填写 php-fpm 的 socket 文件位置。
两种方式的数据传输过程如下图所示:
php-fpm 进程管理
php-fpm 采用的是 master-worker 的进程方式。其中,
- master 负责监听端口,等待链接;其次,注册信号,可以通过信息好 master 进行管理
- worker 负责处理具体的逻辑
查看 php-fpm 日志信息 - 默认路径 -/usr/local/php/var/log
php-fpm 优化
php.ini 优化
?1 2 3 4 5 6 7 | // 默认情况下服务器对上传文件的大小是有限制的,如果想修改上传文件的限制可以修改php.ini文件 file_uploads = On; // 是否允许上传文件 upload_max_filesize = 1024M; // 上传文件的最大限制 post_max_size = 1024M; // 通过post提交的最多数据 max_execution_time = 300; // 脚本最长的执行时间 单位为秒 max_input_time = 30000; // 接收提交的数据的时间限制 单位为秒 memory_limit = 256M; // 每个脚本使用的最大内存 ;在安全模式下,你不能用ini_set()在运行时改变这个设置。 |
php-fpm.conf 优化
(1)进程数设置
?1 2 3 4 5 | pm = dynamic pm.max_children = 15 // 静态方式下开启的php-fpm进程数量 pm.start_servers = 5 // 动态方式下的起始php-fpm进程数量 pm.min_spare_servers = 5 // 动态方式下 空闲时间最小的php-fpm进程 pm.max_spare_servers = 5 // 动态方式下 空闲时间最大的php-fpm进程 |
(2)最大处理请求数
最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn新的。
该配置可以避免php解释器自身或程序引起的memory leaks。
默认值是500, pm.max_requests = 1024 这样的规划,1秒钟
最大请求数:15*1024=15360 最小请求数:5*1024=7120
如何避免程序 hang 死
方法 1:设置 php-fpm 执行的超时时间为固定值
?1 | vi php-fpm.conf 修改为request_terminate_timeout = 60 |
方法 2:定时 reload php-fpm
在负载较高的服务器上定时重载 php-fpm
reload 可以平滑重启而不影响生产系统的 php 脚本运行,每 15 分钟 reload 一次
?1 | 0-59 /15 * * * * /usr/local/php/sbin/php-fpm reload |
方法 3:优化进程池配置
php-fpm 根据配置文件内容和实际情况,动态创建子进程来处理请求。
当达到能够创建的最大值时,只能阻塞。一个个地进行执行。
进程数优化
?1 2 3 4 5 | pm = dynamic pm.max_children = 300 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35 |
最大请求数优化
?1 | pm.max_requests = 10240 |
提示:这个用来处理因为 PHP 解析器或引用的第三方库时,造成的内存泄露问题。
最大请求数:指一个 php-fpm 的工作进程在处理多少个请求后就终止掉。
最长执行时间优化(php.ini)
?1 | request_terminate_timeout = 20 |
提示:这个是用来处理因为 PHP 执行时间超长而报 502 错误的解决。
这个时长配置可以在 php.ini(max_execution_time)或 php-fpm.conf 中配置均可,为了不影响全局配置,可在 php-fpm.conf 中实现 crontab 定时任务把 php-fpm 平滑重启,这种方式就是使用 crontab 定时任务去定时查询网站是否 502 了,如果 502 了,就把 php-fpm 平滑重启
首先在 /root/ 目录下面创建脚本
?1 | vim restart-php-fpm.sh |
然后给这个脚本赋予执行权限
?1 | chmod +x /root/restart-php-fpm .sh |
然后就是编写脚本内容了,上代码
?1 2 3 4 5 6 | #!/bin/bash MY_URL= "http://www.****.com/" RESULT=`curl -I $MY_URL| grep "HTTP/1.1 502" ` if [ -n "$RESULT" ]; then /etc/init .d /php7 .2-fpm restart fi |
注意:
我是使用的 /etc/init.d/php7.2-fpm restart 这种方式重启的
然后编写定时任务
?1 2 | crontab -e /root/restart-php-fpm .sh |
用 crontab -l 查看定时任务列表
以上就是php-fpm优化总结经验分享的详细内容,更多关于php-fpm优化经验的资料请关注服务器之家其它相关文章!
原文链接:https://juejin.cn/post/7132767043165618189
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。