跳转至主要内容
晴雨技术笔记

Apache集成php-fpm

杏川铭心 杏川铭心
发表于 2024年6月1日
  • 本文最后编辑于 444 天前,部分信息可能已严重过时,请注意甄别。
  • 最近发现原来自己一直用的都是陈旧的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

    • 特别提醒:

      评论看到就会回,但是不保证速度,有的时候站长忘记看的话就会出现审核好几天也没有动静的情况……

      有垃圾评论检查,如果评论之后直接消失、没反应说明被识别为垃圾评论了。

      如果等不及的话,可以加群!

    杏川铭心
    杏川铭心

    群号:1101838302,欢迎友好交流 :P 曾用名Frank419(现在也是我在很多地方的用户名),网站站长。

    分类:
    标签:

    发表回复

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