Unix Like, 操作系统, 服务器, 未分类, 运营维护

让cPanel/WHM的Apache使用PHP FPM

雅黑PHP探针

因为FasiCGI,CGI模式下均有少许问题,所以一直以来都给Apache使用mod_php方式执行PHP。

但此模式的资源占用可要给差评了,在网站访问量大的时候,特别是被CC的时候,FORK出的大量Apache进程经常会变成“僵尸”进程,无法正常退出,即使访问量恢复正常,攻击已结束,那些“僵尸”进程一样占用着你的资源,有时攻击猛烈些,直接整个系统宕掉,非硬重启无法救活。纵使有些人会使用如CloudLinux,BetterLinux之类的限制单用户的进程,但还是会有以Apache默认的执行身份fork出的进程……

为了给虚拟主机带来更稳定,更安全的使用环境,必须更换PHP执行方式!

经过测试与研究,最后采用了PHP FPM。

WHY PHP FPM?

PHP FPM不仅能满足使用admin value,opcache的需求,还能针对每个不同的pool的最大进程数量进行限制。这也就意味着,可以防止某个站点占用服务器过多的资源。

同时,让Apache使用worker模式运行,仅负责静态资源,仅需数个进程就能处理大量的访问。

可见,PHP FPM性能,安全皆具备!

 

很可惜,一直以“强大”著称的cPanel/WHM的,在PHP设置的选项中并没有表现出任何的强大:

Configure PHP and suEXEC

 

 

很明显,这要自己动手了。

 

动手前,先定一个大概的步骤:

1. 切换Apache为worker模式。

2. 编译安装PHP。

3. 给cPanel/WHM添加HOOK。

4. 给已有的用户创建PHP FPM POOL配置文件。

5. 重建所有站点的Apache配置文件。

 

因为服务器有已有虚拟主机的用户,因此“改造”过程中尽量减少Apache的暂停时间。

 

切换Apache为worker模式

看了一下cPanel/WHM编译Apache的的参数,是使用–with-mpm指定mpm模块的,要更换的话,只能重新编译。EasyApache中并未mod_proxy_fcgi,要让Apache使用FastCGI Server,此模块是必须的。

既然如此,那自行编译是最好不过的选择了。

下载Apache,APR,APR-UTILS:

开始编译:

configure的参数,你可以根据自己的需要做出修改。

这里不能重启Apache,否则无法启动了。

编辑/etc/httpd/conf/includes/pre_main_global.conf文件,在里面加入下列代码:

这样,就成功切换Apache为worker模式运行,并启用mod_proxy_fcgi模块。

由于是自行编译的Apache,如果使用/scripts/rebuildhttpdconf,会出现“This tool unavailable until Apache is built by EasyApache 3.x”的提示,编辑/scripts/rebuildhttpdconf文件,把此行:

注释,或者删掉即可。

 

编译安装PHP

这里使用的是PHP 5.4.31:

编译安装,并配置,把下面的代码保存到一个文件,使用“bash 文件名”方式执行

同样的,编译参数你可以自行更改。

 

给cPanel/WHM添加HOOK

根据cPanel/WHM的官方文档,使用HOOK Script实现在成功创建用户后创建PHP FPM的POOL配置文件,以及成功删除用户后PHP FPM POOL配置文件。

编辑/scripts/postwwwacct,加入下列代码:

还有/scripts/postkillacct:

赋予上述文件的执行权限:

 

给已有的用户创建PHP FPM POOL配置文件

用户多的话,手动创建是不可能的,这里提供一个Shell Script:

如果一切无误,启动PHP FPM:

 

重建所有站点的Apache配置文件

先添加一个Apache的用户:

修改cPanel/WHM的Apache配置文件模板,进入/var/cpanel/templates/apache2_4(如果你之前使用的是Apache2.2,应该要进入/var/cpanel/templates/apache2)文件夹,创建自定义配置文件模板:

这样cPanel/WHM就会使用.local结尾的作为模板创建Apache的配置文件。

修改main.local文件,找到此行:

将其更改为:

分别编辑ssl_vhost.local,vhost.local,在文件首行,也就是”<VirtualHost[% FOREACH ipblock IN vhost.ips %] [% ipblock.ip %]:[% ipblock.port %][% END %]>”之前,加入这些代码:

接下来,找到“UserDir enabled [% vhost.user %]”,在他后面三行的“[% END -%]”后加入一行:

如图所示:

ProxyPassMatch

 

完成上述修改后,执行:

重建所有用户的配置文件。

最后,让Apache对配置文件进行检测:

如果出现类似的提示:

那你离成功不远了,访问Configure PHP and suEXEC,把PHP 5 Handler改为none即可:

PHP 5 Handler

一般提交后,WHM会自动帮你重启Apache,不过我这里建议最好还是再使用configtest参数检测一下,并重启Apache。

 

到这里,改造就完成了,可以用雅黑PHP探针对PHP环境进行检测:

雅黑PHP探针

能看到“PHP运行方式”一项为“FPM-FCGI”,那就说明大功告成了。

Comments are closed.