几分钟内将Apache从mod_php(Handler)切换为PHP-FPM模式
一些旧的项目和apache
依赖太紧密,如果提升性能只有从服务端下手,今天大概只花了几分钟就将mod_php转为了php-fpm模式,记录一下具体过程。
关于PHP的运行项目如果对性能需求较大可以考虑一下下面的新鲜东西:
运行技术栈
- swoolehttps://github.com/swoole/swoole-src
hyperf 基于swoole的web开发框架 https://github.com/hyperf/hyperf - workermanhttps://www.workerman.net/
webman Web开发框架 https://www.workerman.net/webman - franework-x 异步和非阻塞web开发框架 https://framework-x.org/
- 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?
性能更高:
- 独立于 Apache 的 Worker,可以更好地利用多核 CPU,减少进程间的资源争夺。
- 支持多种并发模式,如动态进程管理,提高高负载下的效率。
更好的内存管理:
兼容性更强:
- 可以搭配多种 Web 服务器(如 Nginx、Apache)。
- 支持 HTTP/2 和 HTTP/3,更适合现代应用需求。
安全性增强:
- 使用独立用户运行(如
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-FPM
。PHP-FPM
提供更好的性能和资源管理能力,特别适合生产环境。如果需要进一步优化或排查问题,请随时进行配置调整。