上个月把博客站从php5.5.7升级到了php7.3.4,一个月的时间已经发生多次服务器卡死的情况,之前顾不上深究,直接重启了事。今天抽点时间处理了下,顺便把相关的知识点记录下来。
一、php-fpm 介绍
虽然对php不熟,但是本着虽不求甚解,但不能不了解的思想,所以我还是去阅读了一些php-fpm的相关知识。php-fpm是php-fastcgi process manager的简称。所以了解php-fpm不得不稍微了解下fastcgi以及cgi的相关知识。下面是一些笔者觉得不错的参考文章:
其实看了许多文章,但是对比理解发觉,许多文章描述有误或语焉不详,比如对于nginx的fastcgi和php的fastcgi的关系,这里我稍微总结梳理下:
- cgi: 对接标准输入和标准输出的程序,其实现与语言无关。HTTP服务器每次收到请求后,启动一个CGI进程并将请求传入,CGI进程完成后退出。这种fork-and-execute模式导致性能低下。
- php-cgi: 包含php解释器的CGI程序(不是用php写的CGI程序),能够处理php请求。
- fastcgi:一种用于更好的提供CGI功能的协议;fastcgi协议采用C/S结构,http服务器只需要包含fastcgi的C端模块,通过socket与支持fastcgi S端的CGI程序通信。这样既解决了CGI反复加载的问题,又可以将CGI程序和http服务器分离。nginx的fastcgi模块即fastcgi的C端。
- php-fpm: 包含php解释器,实现了fastcgi的S端,并且提供了进程管理功能的程序。可以常驻内存并持续接受和处理php请求,并且能够控制进程的数量和生存周期。
二、php-fpm 配置和优化
php-fpm一直存在一些固有问题,如内存泄漏,进程僵死等;这些问题会导致占用内存一直增加,进程数不停增加,直到服务器资源耗尽死机。所以php-fpm的配置主要是围绕控制进程数和进程生命周期进行的(用这种方法来解决性能问题不得不说php团队也是对这个语言的没辙了)。
php中主要有这么两个配置文件:php.ini, php-fpm.conf; 前者是php解释器的配置,后者是php-fpm的配置。php的性能优化主要是调整进程管理相关参数即php-fpm.conf。
这里列举一些重要的配置,并做一些说明:
1 | error_log = /usr/local/var/log/php-fpm.log #错误日志 |
额外说明:
emergency_restart
功能,process_control_timeout
和slowlog
功能默认都是关闭的,若有频繁假死,进程过多,死机等情况,建议都打开。进程的数量要根据服务器的实际情况调整,不然也会耗尽资源。比如,每个php-fpm占用内存一般在30M到50M之间,对于1G内存的服务器,可能不到30个就会耗尽内存,所以可以设置:
1 | pm = dynamic |
其实也不确定这样是否能高枕无忧,观察一段时间再看。对于解决不了的,网上还有一种终极大法:利用linux定时器任务执行脚本(或者后台持续运行脚本),在脚本中监测php-fpm的进程数量或系统内存占用,达到条件重启php-fpm,简单有效。
一个根据memory重启的例子:
checkmem.sh
1 |
|
后台启动:
1 | nohup ./checkmem.sh > checkmem.log 2>&1 & |