Loading... ## php-fpm 与 nginx 通信流程 nginx 加载 fast-cgi 模块 nginx 的 fast-cgi 模块与 php-fpm 通信(tcp socket / unix socket) php-fpm 接收到请求,启用 worker 进程处理请求 php-fpm 处理完请求,返回给 nginx nginx 将结果通过 http 返回给浏览器 ## php-fpm 进程管理 php-fpm 采用的是 master-worker 的进程方式。其中, * master 主进程 * worker 工作进程 master 进程并不直接处理客户端请求,而是负责管理多个 php 进程池,这些 php 进程池才是真正处理请求的 worker 进程。这些 php 进程池内的 worker 进程是由 master 进程动态创建和管理的 ## php-fpm 优化 ### 进程管理 **`pm = dynamic`** 使用哪种进程数量管理方式 - **`dynamic`**: - `php-fpm` 进程数是动态的。 - 启动时进程数量为 `pm.start_servers` 值 - 如果请求较多,则会自动增加,保证空闲的进程数不低于 `pm.min_spare_servers` 、不高于`pm.max_spare_servers` - 如果进程空闲,会进行清理,保证空闲的进程数不低于 `pm.min_spare_servers` - **`static`** - `php-fpm` 进程数是静态的 - 进程数自始至终都是 `pm.max_children` 指定的数量,不再增加或减少。 - `pm.min_spare_servers` 和 `pm.max_spare_servers` 参数不生效 `pm.max_children = 20`:静态方式下开启的 php-fpm 进程数量 `pm.start_servers = 10`:动态方式下的起始php-fpm进程数量 `pm.min_spare_servers = 8`:动态方式下的最小php-fpm进程数量 `pm.max_spare_servers = 20`:动态方式下的最大php-fpm进程数量 `pm.max_requests = 10240`:每个子进程处理的最大请求数 `pm.process_idle_timeout = 10s`:空闲进程的超时时间,超时后空闲的 php-fpm 进程将被回收 > 对于内存大的服务器(比如8G以上)来说,用静态的 `max_children` 实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。数量可以根据 `总内存/30M` 得到,比如 8 GB 内存可以设置为 100,那么 php-fpm 耗费的内存就能控制在 2G-3G。 > 如果内存稍微小点,比如 1~2G,那么指定静态的进程数量更加有利于服务器的稳定。这样可以保证php-fpm只获取够用的内存,将不多的内存分配给其他应用去使用,会使系统的运行更加畅通。 > 对于小内存的服务器来说,比如 256M 内存的 VPS,即使按照一个 20M 的内存量来算,10 个 php-cgi 进程就将耗掉 200M 内存,那系统的崩溃就应该很正常了 > 因此应该尽量地控制 php-fpm 进程的数量,大体明确其他应用占用的内存后,给它指定一个静态的小数量,会让系统更加平稳一些。 > 或者使用动态方式,因为动态方式会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或 VPS 上使用,具体最大数量根据 `总内存/20M` 得到。 比如说 512M 的 VPS,建议 `pm.max_spare_servers`设置为 20。至于`pm.min_spare_servers`,则建议根据服务器的负载情况来设置,比较合适的值在 5~10 之间。 配置文件参数说明: ```ini [global] ; php-fpm 的 pid 文件路径 pid = /usr/local/php/var/run/php-fpm.pid ; php-fpm 的错误日志文件路径 error_log = /usr/local/php/var/log/php-fpm.log ; php-fpm 的日志级别 log_level = notice [www] ; php-fpm 监听的 socket 文件路径,用于接收来自 web 服务器的 FastCGI 请求 listen = /tmp/php-cgi.sock ; 连接队列的长度,-1不限制 listen.backlog = -1 ; 允许连接的客户端IP listen.allowed_clients = 127.0.0.1 ; 监听 socket 的所有者和所属组 listen.owner = www listen.group = www ; 监听 socket 的权限 listen.mode = 0666 ; PHP-FPM 进程运行用户和组 user = www group = www ; 进程管理方式 pm = dynamic ; 静态方式下开启的 php-fpm 进程数量 pm.max_children = 20 ; 动态方式下的起始php-fpm进程数量 pm.start_servers = 10 ; 动态方式下的最小php-fpm进程数量 pm.min_spare_servers = 8 ; 动态方式下的最大php-fpm进程数量 pm.max_spare_servers = 20 ; 每个子进程处理的最大请求数 pm.max_requests = 10240 ; 空闲进程的超时时间,超时后空闲的 php-fpm 进程将被回收 pm.process_idle_timeout = 10s ; 请求终止的超时时间 request_terminate_timeout = 100 ; 请求记录慢日志的超时时间,超时会被记录到慢日志 request_slowlog_timeout = 5s ; 慢日志文件的路径 slowlog = var/log/slow.log ``` ## 参考资料 https://juejin.cn/post/7132767043165618189 https://blog.mydns.vip/2385.html 最后修改:2024 年 05 月 11 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏