当你第一次在CentOS上成功编译安装PHP后,那种成就感无与伦比。但很快,你会发现这只是开始——如何优雅地管理php-fpm服务成为新的挑战。本文将带你从手动启动的初级阶段,逐步过渡到系统服务化的专业运维水平。
编译安装PHP后,你会发现/usr/local/php/etc/目录下缺少必要的配置文件。这不是错误,而是设计——PHP希望你自己决定如何配置环境。
关键配置文件的初始化步骤:
php.ini:这是PHP的核心配置文件
bash复制cp /usr/local/php/etc/php.ini-development /usr/local/php/etc/php.ini
php-fpm.conf:主配置文件
bash复制cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
www.conf:进程池配置
bash复制cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
提示:在生产环境中,建议使用
php.ini-production作为基础配置,它包含了更严格的安全设置。
常见配置项调整:
ini复制; php-fpm.conf中的关键配置
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
直接运行/usr/local/php/sbin/php-fpm虽然简单,但缺乏生产环境所需的可靠性。让我们将其转化为标准的Systemd服务。
创建服务单元文件:
bash复制vim /etc/systemd/system/php-fpm.service
服务文件内容示例:
ini复制[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target
[Service]
Type=forking
PIDFile=/var/run/php-fpm/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -INT $MAINPID
[Install]
WantedBy=multi-user.target
启用并管理服务:
bash复制systemctl daemon-reload
systemctl enable php-fpm
systemctl start php-fpm
常用服务命令对比:
| 操作 | 手动命令 | Systemd命令 |
|---|---|---|
| 启动 | /usr/local/php/sbin/php-fpm |
systemctl start php-fpm |
| 停止 | kill -INT <pid> |
systemctl stop php-fpm |
| 重启 | kill -USR2 <pid> |
systemctl restart php-fpm |
| 重载 | kill -USR1 <pid> |
systemctl reload php-fpm |
| 状态 | `ps aux | grep php-fpm` |
PHP-FPM的master进程响应多种信号,理解这些信号是高级管理的关键。
核心信号及其作用:
信号使用场景示例:
日志轮转:
bash复制kill -USR1 $(cat /var/run/php-fpm/php-fpm.pid)
配置更新后重载:
bash复制kill -USR2 $(cat /var/run/php-fpm/php-fpm.pid)
注意:USR2信号会保留旧worker进程直到它们完成当前请求,确保零停机更新。
PID文件管理:
bash复制mkdir -p /var/run/php-fpm
chown -R www-data:www-data /var/run/php-fpm
日志配置优化:
ini复制; www.conf中的日志设置
access.log = /var/log/php-fpm/$pool.access.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
进程池调优参数:
ini复制pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
健康检查脚本示例:
bash复制#!/bin/bash
RESPONSE=$(SCRIPT_NAME=/status SCRIPT_FILENAME=/status REQUEST_METHOD=GET \
cgi-fcgi -bind -connect /var/run/php-fpm/www.sock)
if [[ $RESPONSE != *"pool:"* ]]; then
systemctl restart php-fpm
fi
启动失败检查清单:
配置文件语法检查:
bash复制/usr/local/php/sbin/php-fpm -t
端口/Socket冲突检查:
bash复制ss -lnp | grep php-fpm
权限问题检查:
bash复制namei -l /var/run/php-fpm/php-fpm.sock
性能监控命令:
bash复制watch -n 1 "echo 'show status' | nc -U /var/run/php-fpm/www.sock"
慢日志配置:
ini复制slowlog = /var/log/php-fpm/$pool-slow.log
request_slowlog_timeout = 5s