为什么需要 php-fpmMediaWiki 默认使用 Apache 服务器,由于我的服务器上已经有了 Nginx,所以打算直接用 Nginx 转发。但是如果直接转发就会发现,访问index.php时会变成文件下载而不是网页,所以需要在 Nginx 中转发给 php-fpm,让 php-fpm 处理成 Html。

php-fpm 安装首先得确认 php 版本,安装的 php-fpm 版本必须和 php 版本一致,我使用的 php 版本是 8.1

1apt 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

1234567891011location /YOUR_WEB_PATH/ { alias /YOUR_ABOSULTE_PATH/; #try_files $uri $uri/ =404; index index.php; location ~ \.php$ { include fastcgi_params; include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php-fpm.sock; fastcgi_param SCRIPT_FILENAME "/YOUR_ABOSULTE_PATH/$fastcgi_script_name"; # where index.php is located }}

错误排查某天发现配置的 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,显示

12345[31-Mar-2025 23:35:13] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it[02-Apr-2025 06:28:30] NOTICE: Terminating ...[02-Apr-2025 06:28:30] NOTICE: exiting, bye-bye![02-Apr-2025 06:28:30] ERROR: [pool www] please specify user and group other than root[02-Apr-2025 06:28:30] ERROR: FPM initialization failed

说明有两个问题,一是子进程超过上限爆了,二是无法用 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

完成