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