跳转至主要内容

Frank的技术笔记

Apache集成php-fpm

头像 梦叶
发表于 2024年6月1日

最近发现原来自己一直用的都是陈旧的mod_php,于是乎就想着能不能改成大家都在用的php-fpm

文章以Debian 12系统为例,所有命令默认以sudoroot执行。

安装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-fpm

常见问题

PHP文件原封不动的返回内容,并没有执行PHP代码。

  • php-fpm服务启动了吗?
  • Apache配置中是否有写入处理PHP文件的配置?

服务器返回500 Internal Server Error

  • 授权标头是否有效?
  • proxy,proxy_fcgi两个模块启用了吗?
  • php-fpm的运行组是否有读写网站目录的权限?

延伸阅读


封面图源:Photo by Mohamed Hassan form PxHere

头像
梦叶

原名Frank419,网站站长。不定期更新?

分类:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注