
Apache集成php-fpm
最近发现原来自己一直用的都是陈旧的mod_php,于是乎就想着能不能改成大家都在用的php-fpm。
文章以Debian 12系统为例,所有命令默认以sudo或root执行。
目录
安装php-fpm
apt install php-fpm配置php-fpm
Debian下php-fpm的配置池(pool)默认在/etc/php/<Installed Version>/fpm/pool.d/这个文件夹里。
vim /etc/php/<Installed Version>/fpm/pool.d/www.conf修改/etc/php/<Installed Version>/fpm/pool.d/www.conf这个文件。
...
user = frank
group = frank
...
listen = /run/php/phpx.x-fpm.sock
...
listen.owner = frank
listen.group = frank
...其中user,group,listen.owner,listen.group改成自己运行Apache的用户。我这里用的是我自己的frank运行Apache,所以php-fpm的配置也要相应地改成frank。
此外需要记住listen的值,后面要用。
启用php-fpm
systemctl enable --now phpx.x-fpm其中把x.x改成具体安装的版本,比如php8.2-fpm。
我第一次配置php-fpm的时候就是栽在这一步上了,因为用惯了mod_php所以想当然的以为安装好就结束了,殊不知php-fpm是服务,需要启动的。
链接Apache和php-fpm
首先需要启用proxy,proxy_fcgi两个模块:
a2enmod proxy.proxy_fcgi然后把MPM模块从默认的mpm_prefork改为mpm_event,后者支持HTTP/2,速度更快,不过mod_php是不能使用的,既然用了php-fpm那当然要换成更快的:
a2enmod mpm_event最后编辑/etc/apache2/apache2.conf文件,写入以下内容:
<FilesMatch \.php$>
    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
    SetHandler "proxy:unix:/run/php/phpx.x-fpm.sock|fcgi://localhost"
</FilesMatch>其中SetHandler后的内容按照php-fpm配置里listen的值修改,比如我是proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost。
重启Apache:
apache2ctl restart至此Apache和php-fpm就链接好了。可以写入一个phpinfo.php看效果:
<?php
    phpinfo();
?>效果:

常见问题
PHP文件原封不动的返回内容,并没有执行PHP代码。
php-fpm服务启动了吗?- Apache配置中是否有写入处理PHP文件的配置?
 
服务器返回500 Internal Server Error
- 授权标头是否有效?
 proxy,proxy_fcgi两个模块启用了吗?- php-fpm的运行组是否有读写网站目录的权限?
 
延伸阅读
封面图源:Photo by Mohamed Hassan form PxHere

