为什么需要 php-fpm
MediaWiki 默认使用 Apache 服务器,由于我的服务器上已经有了 Nginx,所以打算直接用 Nginx 转发。但是如果直接转发就会发现,访问index.php
时会变成文件下载而不是网页,所以需要在 Nginx 中转发给 php-fpm,让 php-fpm 处理成 Html。
php-fpm 安装
首先得确认 php 版本,安装的 php-fpm 版本必须和 php 版本一致,我使用的 php 版本是 8.1
1 | apt install php8.1-fpm |
默认 php-fpm 配置文件路径为/etc/php/8.1/fpm/php-fpm.conf
,使用systemctl start php8.1-fpm
启动 php-fpm 服务,使用systemctl status php8.1-fpm
查看 php-fpm 服务状态,使用systemctl enable php8.1-fpm
设置 php-fpm 为开机启动服务。
Nginx 配置
在 443(HTTPS)端口监听中加入如下配置,因为我不是部署在根目录上,所以稍微麻烦一点,需要使用alias
1 | location /YOUR_WEB_PATH/ { |
错误排查
某天发现配置的 Mediawiki 报错 502 BadGateway
- 查询 Nginx 访问日志,Nginx 转发 php-fpm 报错
connect() to unix:/run/php/php-fpm.sock failed (2: No such file or directory) while connecting to upstream
- 查询 php-fpm 运行状态
systemctl status php8.1-fpm
,是 php-fpm 没有启动 - 查看日志
journalctl -u php8.1-fpm
,php-fpm 自动重启失败 - 查看 php-fom 日志,默认位置
/var/log/php8.1-fpm.log
,显示
1 | [31-Mar-2025 23:35:13] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it |
说明有两个问题,一是子进程超过上限爆了,二是无法用 root 启动
- 前往
/etc/php/8.1/fpm/pool.d/www.conf
把pm.max_children = 30
改大一点,默认是 5 - 前往
/etc/php/8.1/fpm/pool.d/www.conf
确认 user 和 group 都是 root- 理论上可以不用 root 启动,但是要用 Nginx 转发,启动进程用户权限不同会出问题,因为 Nginx 已经跑了很久不好动配置所以动 php-fpm 的
- 修改
/lib/systemd/system/php8.1-fpm.service
文件, 在 ExecStart 最后 加上 -R
- 完成