AkiraZ's blog

愿键盘的余温传递到更遥远的将来

中文 / English
0%

php-fpm 安装和错误排查

为什么需要 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
2
3
4
5
6
7
8
9
10
11
location  /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,显示
1
2
3
4
5
[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.confpm.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
  • 完成