这是一份PHP运维手册纲要,它涵盖了从基础环境配置、性能调优、安全加固到日常故障排查的全流程,这份手册旨在帮助运维人员(而非开发者)管理PHP生产环境。

PHP 运维手册 v1.0
环境部署与版本管理
1 版本选择
- 生产推荐:PHP 8.1 / 8.2 / 8.3 (根据项目兼容性选择),PHP 7.4 已于2022年11月停止安全支持(EOL)。
- 禁止使用:PHP 5.x (绝对禁止)、PHP 7.0/7.1/7.2/7.3 (均已EOL)。
- 策略:使用
phpbrew、remi源(CentOS)或ondrej/phpPPA(Ubuntu)实现多版本共存。
2 编译安装关键参数
# 生产环境建议开启
./configure --enable-fpm --with-fpm-user=www --with-fpm-group=www \
--enable-mbstring --enable-bcmath --enable-pcntl \
--with-openssl --with-curl --with-mysqli --with-pdo-mysql \
--enable-opcache --with-zlib --with-zip
注意:禁用不安全的函数:
disable_functions = exec,system,passthru,shell_exec,popen,proc_open,eval,assert,pcntl_exec
3 Web 服务器整合
- Nginx (首选): 通过
FastCGI代理到 PHP-FPM。 - Apache: 使用
mod_php(旧) 或mod_proxy_fcgi。 - 配置示例 (Nginx):
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; # 或 unix:/run/php/php8.1-fpm.sock fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
PHP-FPM 核心调优
PHP-FPM 是PHP进程管理器,是性能调优的核心。
1 进程管理策略
修改 /etc/php/8.1/fpm/pool.d/www.conf:
| 参数 | 推荐值 | 说明 |
|---|---|---|
pm |
dynamic 或 ondemand |
ondemand 适合高内存低并发,dynamic 适合稳定负载 |
pm.max_children |
50-200 |
最大子进程数,由内存决定:总内存 / 单个进程平均内存 |
pm.start_servers |
10-20 |
启动时创建的进程数 |
pm.min_spare_servers |
5-10 |
空闲最少进程数 |
pm.max_spare_servers |
10-30 |
空闲最多进程数 |
pm.max_requests |
1000-5000 |
每个进程处理多少请求后重启(防内存泄漏) |
2 内存计算公式
# 单进程内存估算(查看当前平均值)
ps -ylC php-fpm | awk '{x+=$8;y+=1} END {print "Average RSS (MB):",x/y/1024}'
# 最大进程数 = 服务器总内存 * 0.8 / 单进程平均内存
示例:8GB 内存,单进程 50MB => max_children = 8000 * 0.8 / 50 = 128
3 开启慢日志
用于定位慢代码:
slowlog = /var/log/php-fpm/slow.log request_slowlog_timeout = 2s # 超过2秒记录 request_terminate_timeout = 30s # 超时强制终止
OpCache 配置
OpCache 是 PHP 的字节码缓存,必须开启。
[opcache] opcache.enable=1 opcache.memory_consumption=128 # 缓存内存大小(128-256MB) opcache.max_accelerated_files=8000 # 缓存文件数量上限 opcache.revalidate_freq=60 # 检查文件更新的时间间隔(秒) opcache.fast_shutdown=1 # 快速关闭 opcache.validate_timestamps=0 # 生产环境设为0,禁止每次请求检查文件修改;部署时手动清除或重启
重要:validate_timestamps=0 后,代码变更需通过 opcache_reset() 函数或重启 PHP-FPM 生效。
安全加固清单
| 类别 | 操作 |
|---|---|
| 文件权限 | PHP 文件属主非www,但 FPM 运行用户为 www (644/755) |
| 函数禁用 | disable_functions = exec,system,passthru,shell_exec,... |
| 危险配置 | expose_php = Off (隐藏HTTP头中的PHP版本) |
| 文件上传 | file_uploads = On 但设置 upload_max_filesize = 10M post_max_size = 12M |
| 会话安全 | session.cookie_httponly = 1 session.cookie_secure = 1 (HTTPS) |
| 错误暴露 | display_errors = Off log_errors = On error_log = /var/log/php_errors.log |
| 开放路径 | open_basedir = /home/wwwroot:/tmp (限制PHP可访问的目录) |
日常运维命令
# 启动/重启/停止(Systemd) systemctl restart php8.1-fpm systemctl status php8.1-fpm # 平滑重载(不中断已有请求) systemctl reload php8.1-fpm # 检查配置语法 php-fpm8.1 -t # 查看进程状态(需开启 pm.status_path) curl http://127.0.0.1/php-fpm-status?full # 实时查看慢查询 tail -f /var/log/php-fpm/slow.log # 清理 OpCache(代码部署后) # 方法1:重启PHP-FPM systemctl restart php8.1-fpm # 方法2:触发自定义脚本(更优雅) curl http://your-site/opcache-reset.php # 内容:<?php opcache_reset();
性能监控与故障排查
1 监控指标
- 进程数:
pm.max_children是否触顶(listen.xxx queue增大)。 - CPU:
top+htop,关注php-fpm进程组。 - 内存:
free -m/proc/meminfo检查Swap使用(Swap高说明内存不足)。 - 慢查询:数量趋势明显增加说明数据库或代码瓶颈。
2 常见故障
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 502 Bad Gateway | PHP-FPM 崩溃或没启动 | systemctl restart php8.1-fpm |
| 504 Gateway Timeout | 脚本执行超时 + request_terminate_timeout 触发 |
调大时间或优化代码 |
| 内存耗尽/进程数爆满 | pm.max_children 过大 |
降低 max_children,启用 ondemand |
| 慢请求变多 | 代码性能问题、数据库慢查询 | 使用 Xdebug 或 Blackfire 做性能分析 |
/tmp 目录写满 |
Session 文件积累或临时文件 | 清理 session.gc_probability 或者使用 Redis 存储 Session |
部署流程(代码上线)
- 下代码:git pull / rsync 到发布目录。
- 清缓存:执行
opcache_reset()(可自动触发)。 - 重载配置:如果修改了 php.ini 或 FPM 配置 →
systemctl reload php8.1-fpm。 - 验证:检查
php -m是否有新扩展,网站首页是否返回 200。
扩展管理
# 安装扩展(以 APCu 为例) pecl install apcu # 编辑 php.ini 添加: extension=apcu.so # 查看已安装扩展 php -m | grep -i apcu # 禁用扩展(临时) # 在 php.ini 中注释掉 extension 行或使用 PHP 的 -d 参数
PHP运维的核心在于:
- 进程管理(FPM):根据内存动态调整
max_children。 - 缓存策略(OpCache):开缓存、定大小、调频率。
- 安全基线:禁函数、限开放目录、隐藏版本。
- 日志监控:看慢日志、看FPM status、关注error log。 整理成企业内部 Wiki,并结合实际服务器配置定期更新数字值(如内存、并发量)。