几分钟内将Apache从mod_php(Handler)切换为PHP-FPM模式

几分钟内将Apache从mod_php(Handler)切换为PHP-FPM模式

一些旧的项目和apache依赖太紧密,如果提升性能只有从服务端下手,今天大概只花了几分钟就将mod_php转为了php-fpm模式,记录一下具体过程。

关于PHP的运行项目如果对性能需求较大可以考虑一下下面的新鲜东西:

运行技术栈

  1. swoolehttps://github.com/swoole/swoole-src
    hyperf 基于swoole的web开发框架 https://github.com/hyperf/hyperf
  2. workermanhttps://www.workerman.net/
    webman Web开发框架 https://www.workerman.net/webman
  3. franework-x 异步和非阻塞web开发框架 https://framework-x.org/
  4. reactphp 使用PHP进行事件驱动、非阻塞 I/O https://reactphp.org/

在生产环境中的表现可以参考这个帖子.

Web服务软件

  • RoadRunner 一个用Golang编写的高性能PHP应用程序服务器、负载均衡器和进程管理器。
  • FrankenPHP 基于Caddy,用Go编写的现代PHP应用服务器

还有这个帖子讨论内容也值得一看。

为什么使用Apache + PHP-FPM工作模式

来源:GPT

PHP-FPM 是 PHP 的现代处理方式,与传统的 mod_php 相比,具有更高的性能和灵活性。以下是它的优点:

为什么选择 PHP-FPM?

  1. 性能更高

    • 独立于 Apache 的 Worker,可以更好地利用多核 CPU,减少进程间的资源争夺。
    • 支持多种并发模式,如动态进程管理,提高高负载下的效率。
  2. 更好的内存管理

    • Apachemod_php 将 PHP 嵌入到每个 Apache 进程中,这可能导致内存消耗较高。
    • PHP-FPM 使用独立的进程池管理,内存使用更稳定。
  3. 兼容性更强

    • 可以搭配多种 Web 服务器(如 Nginx、Apache)。
    • 支持 HTTP/2 和 HTTP/3,更适合现代应用需求。
  4. 安全性增强

    • 使用独立用户运行(如 www-data 或其他用户),增强隔离性。
    • 可以为每个虚拟主机或应用单独配置进程池,减少不同站点之间的影响。

在生产环境中切换该模式

如何在生产环境中切换 Apache 为 PHP-FPM

以下是如何完成切换的详细步骤。

1. 安装 PHP-FPM

如果尚未安装 PHP-FPM,请先安装相应版本的 PHP-FPM。

在 Debian/Ubuntu:
sudo apt update
sudo apt install php8.2-fpm

CentOS/RHEL:
sudo yum install php-fpm

安装完成后,启动并启用 PHP-FPM 服务:

sudo systemctl start php8.2-fpm
sudo systemctl enable php8.2-fpm

确认服务状态:

systemctl status php8.2-fpm

2. 禁用 mod_php

为了避免冲突,禁用 mod_php 模块。

检查是否启用了 mod_php:
apachectl -M | grep php

禁用模块:
sudo a2dismod php8.2

重新加载 Apache:
sudo systemctl restart apache2

3. 启用 proxy_fcgi 和 setenvif 模块

PHP-FPM 使用 FastCGI 协议,因此需要启用相关模块。

sudo a2enmod proxy_fcgi setenvif
sudo systemctl restart apache2

4. 修改 Apache 虚拟主机配置

更新你的虚拟主机配置文件(通常在 /etc/apache2/sites-available/ 下)。

如果你的虚拟主机配置文件已经存在,只需要在<virtualHost>区域中添加

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
    </FilesMatch>

需要注意:ssl使用的443端口配置文件时独立的,也需要单独配置

编辑虚拟主机配置文件:
sudo nano /etc/apache2/sites-available/000-default.conf

修改内容为以下配置:
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html

    <Directory /var/www/html>
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
    </FilesMatch>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

根据实际情况调整 php8.2-fpm.sock 路径,可通过以下命令确认:

ls /run/php/

5. 重启 Apache

每次修改配置文件后都需要重启 Apache:

sudo systemctl restart apache2

6. 验证配置

1. 创建一个测试文件:

sudo nano /var/www/html/info.php

内容如下:

<?php phpinfo(); ?>

2. 访问测试页面:
打开浏览器访问 http://<your-server-ip>/info.php

3. 查看 Server API

  • 如果显示 FPM/FastCGI,说明 PHP-FPM 配置成功。

7. 优化 PHP-FPM 配置

在生产环境中,优化 PHP-FPM 的配置可以提高性能和稳定性。

编辑 PHP-FPM 配置文件:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf

以下是一些常见的配置选项:

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10

根据服务器硬件资源调整 pm.max_children

保存文件后重启 PHP-FPM:

sudo systemctl restart php8.2-fpm

8. 清理旧的 PHP 处理方式

如果不再需要 mod_php,可以移除:

sudo apt purge libapache2-mod-php
sudo apt autoremove

9.配置php.ini

由于fpm生成了新的php.ini配置文件,我们需要在这里修改相关配置,文件位于:/etc/php/8.2/fpm/php.ini

修改了php.ini后别忘记使用sudo systemctl restart php8.2-fpm来重启服务。

总结

通过以上步骤,你已经将 Apache的PHP 处理方式从 mod_php切换到 PHP-FPMPHP-FPM 提供更好的性能和资源管理能力,特别适合生产环境。如果需要进一步优化或排查问题,请随时进行配置调整。

Post Comment