PHP 怎么PHP 运维手册

wen PHP项目 2

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

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)。
  • 策略:使用 phpbrewremi 源(CentOS)或 ondrej/php PPA(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 dynamicondemand 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 增大)。
  • CPUtop + 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

部署流程(代码上线)

  1. 下代码:git pull / rsync 到发布目录。
  2. 清缓存:执行 opcache_reset()(可自动触发)。
  3. 重载配置:如果修改了 php.ini 或 FPM 配置 → systemctl reload php8.1-fpm
  4. 验证:检查 php -m 是否有新扩展,网站首页是否返回 200。

扩展管理

# 安装扩展(以 APCu 为例)
pecl install apcu
# 编辑 php.ini 添加:
extension=apcu.so
# 查看已安装扩展
php -m | grep -i apcu
# 禁用扩展(临时)
# 在 php.ini 中注释掉 extension 行或使用 PHP 的 -d 参数

PHP运维的核心在于:

  1. 进程管理(FPM):根据内存动态调整 max_children
  2. 缓存策略(OpCache):开缓存、定大小、调频率。
  3. 安全基线:禁函数、限开放目录、隐藏版本。
  4. 日志监控:看慢日志、看FPM status、关注error log。 整理成企业内部 Wiki,并结合实际服务器配置定期更新数字值(如内存、并发量)。

抱歉,评论功能暂时关闭!