cPanel/WHM切换PHP执行方式为APACHE2HANDLER(dso)并为Apache2添加mpm-itk模块

今天安装了cPanel/WHM 11.38.2(下文简称cp),用了后,我只能说,cPanel管理员后台的功能真的不是一般的强大,简直是把DirectAdmin甩到十万九千七亿千米去了。

但世上没有十全十美的东西,不出我的预料,cPanel使用的是suPHP,PHP执行方式是FastCGI。

前面文章我曾经提到过suPHP的缺点,这里就不再重复。

既然APACHE2HANDLER(下文简称A2R)模式的安全性,性能等多方面都比FastCGI好,怎能不对cPanel进行改造改造呢?

首先,要切换PHP的执行方式。以root身份登录cPanel的后台,在“Service Configuration »Configure PHP and suEXEC”处,把PHP 5 Handler改成dso:

php-dso

 

然后点击“Save New Configuration”cPanel就会自动修改Apache的配置文件,并且重启。顺利完成后,可以使用探针检测下,看到PHP运行方式一项为APACHE2HANDLER即可:

apache2handler

 

接下来需要用到cPanel其中一个强大的功能:EasyApache(下文简称EA)。

由于cPanel官方已经有提供EA使用的mpm-itk包,因此就不需要自己敲太多命令去编译apache,方便很多。执行以下命令为easyapache添加mpm-itk的模块包:

然后到“Software »EasyApache (Apache Update)”,其他的东西别改,点击“Start customizing based on profile”按钮,后面你也可以顺便选下Apache和PHP的版本,以及所需要的模块。点”Next Step”,到第四步时,点击“Exhaustive Options List”按钮,进入第五步。

在“Apache Built-in Modules”里面,就可以找到mpm itk一项,打钩即可:

mpm-itk

在此页面你也可以顺便添加或删除一项模块。

OK后,点击”Save and build”按钮,cPanel就会自动开始编译Apache和PHP。

时间的长短根据服务器配置而定。

由于前面cPanel编译后只是为Apache添加上了mpm-itk模块,并没有修改apache的配置文件,因此这一步需要我们手动修改apache的模板文件。

进入Apache2模板配置文件目录:

修改vhost.default文件:

找到这一段代码(大概在56-60行):

在它后面添加:

如图:vhost.default

修改完毕后,进入命令模式,:wq保存退出。

完成后重写所有站点的配置文件并且重启Apache:

最后使用PHP对网站目录进行写入操作(例如新建一个文件,创建文件夹):WHOAMI

能正常写入且所有者和群组为该站点的用户名即代表mpm-itk模块生效。

访问PHP网页时,可以看到Apache进程的用户身份也会有所改变:httpd

解决添加Zend Guard Loader后探针检测仍然显示小红叉

可能有些人会用到SHOPNC这类用Zend加密的程序,因此需要添加Zend Guard Loader,不过安装好后用探针检测,可能会出现以下情况——Zend Guard Loader旁边显示小红叉。例如安装DirectAdmin时选择PHP5.3并且选择添加Zend时,就会出现这种情况:

disable

我们来看看Zend的官方说明文档:

明文说明需要添加zend_loader.enable=1,执行此命令可以检查php.ini有没有这一行代码(仅仅适合PHP-CLI/CGI,FPM的用find命令找出来后手动检查)

无返回任何结果,表明php.ini并没有zend_loader.enable=1,这就难怪探针检测到Zend Guard Loader是未启用的了。

于是执行此命令加入zend_loader.enable=1到php.ini中(仅仅适合PHP-CLI/CGI,FPM的用find命令找出来后手动添加)

如果使用是PHP-FPM,就重启PHP-FPM,使用Apache的话就重启Apache。刷新后即可看到探针处ZendGuardLoader旁打上绿色小对号。

enable

当然,官方文档里面所写到的参数不止这些,还有:

至于这些参数有什么作用且如何使用,不是本文重点,我就不为此作文章了……

APC3.1.9自动安装脚本For DirectAdmin with PHP-CLI

前面发过一个APC Shell Script For PHP-CGI,经过Zeraba的指导,使用apc.php看了下APC的命中率,发现无论怎样,命中数只有“1”,明显APC并没有发挥它应有的用途。同时也发现,不管是什么opcode的PHP组件,都是只能在探针那看个版本……

既然PHP-CGI有问题,那就换PHP-CLI,但是DirectAdmin的PHP-CLI模式也有问题,那就是无法以特定身份去创建执行PHP程序,这就使得用户的网站某些目录需要设置rwxrwxrwx,非常麻烦,而且也不安全。

要解决DirectAdmin的PHP-CLI的问题,大家可以参考:实现DirectAdmin使用PHP-CLI模式的站点独立用户与查看各用户资源占用情况

要给PHP-CLI添加APC,其实和前面CGI的那个方法差不多,只是一些二进制文件的目录有所改变。

这里是使用添加APC的Shell Script的方法:

 注意:

如果你添加APC后无法访问PHP文件,并且在Apache的错误日志(/var/log/httpd/error_log)里面找到如下错误信息:

错误信息

 

这很明显你在使用PHP5.2.17,因为PHP5.2,Zend Optimizer与APC不能共存。因此需要你手动修改php.ini,把加载Zend Optimizer的那行注释掉:

php.ini

如图,在zend_extension=/usr/local/lib/ZendOptimizer_5.2.so这行前面加个英文的”;”,然后重启apache就行了。

如果顺利完成上面几个步骤,访问几个PHP文件,再使用apc.php看看命中率,如果Hits数目那有变化,那证明APC正常了:

APC.PHP

实现DirectAdmin使用PHP-CLI模式的站点独立用户与查看各用户资源占用情况

用过DirectAdmin的都知道,CLI是个坑爹货:网站目录非rwxrwxrwx(777)权限无法写入,无法查看是哪个用户占用较多的资源,甚至无法正常使用opcode cache的PHP组件。

Wordpress

我们来研究下DirectAdmin的站点的配置文件:

关键,就在SuexecUserGroup这里,这里定义了站点的执行PHP脚本时所使用的用户身份,这样可以给不同网站的目录不同的所有者,且无需再特意给某些文件设置rwxrwxrwx(777)权限。

然而,这个东西在CGI模式下工作正常,而CLI却不正常。貌似mod_ruid2.c是SuPHP才有的吧?无mod_ruid2.c。Apache自然就忽略掉SuexecUserGroup的内容。

找到问题所在,要解决,就简单得多了。找个CLI上能实现类似功能的模块给Apache加上去就行。

看过我的LVAMP的介绍的,都知道,能实现站点独立用户,而且是CLI模式下实现的。其实真相只有一个——mpm-itk。

由于mpm-itk模块没提供2.2下能使用apxs编译的文件,因此添加有点麻烦。我这里写了一个Shell Script:

先下载:

然后运行:

执行完后,你会看到如下信息:

md5

那个是集成了mpm-itk源码的apache的源码的TGZ的MD5值。因为DirectAdmin的进行编译的Shell Script会自动验证所有源码包的MD5值,不一样就会帮你重新下载,所以就要修改一下DirectAdmin所记录的Apache的MD5值。

修改/usr/local/directadmin/custombuild/versions.txt:

在第六行(一般都是第六行),也就是apache2.2:2.2.24(一般都是2.2.24吧)的那一行,把冒号后面的MD5改成执行mpm-itk.sh后所显示的MD5值:

Versions

 

确认无误后,保存(用vim的话:wq)。

开始编译吧:

这个看你服务器配置了,一般十分钟左右吧……

顺利完成后,还有Apache的站点配置文件的模板要修改,不过文件有点多,直接执行这个Shell Script就好了:

最后在“服务监控”那,重启Apache(也就是httpd)。

再次测试安装Wordpress,已经可以成功写入文件了:

写入成功

 

在top那,httpd进程的执行身份不再是清一色的apache了:

TOP

解决PHP加载组件提示:PHP Warning: PHP Startup: Unable to load dynamic library ‘./apc.so’ – ./apc.so: cannot open shared object file: No such file or directory in Unknown on line 0

前面发表了一篇文章:APC3.1.9自动安装脚本For DirectAdmin

给另一台PHP版本为5.2.17的服务器使用时,发现APC组件没有成功加载,PHP探针里面无法检测到,

起初以为路径的问题,于是把php.ini里面的:

更改为:

但是很可惜,仍然不行。

尝试重新编译安装APC,依然是那样。想起有错误日志,于是打开看了下,果然,N行同样的错误记录:

貌似是./有问题,使得PHP在./,也就是自己所在的目录寻找apc.so文件,理所当然是找不到的。不过填的是绝对路径呀,PHP应该是通过绝对路径加载apc.so的,而且另外的IonCube和Zend Optimizer也都是绝对路径。

对比了下IonCube、Zend Optimizer和APC的so文件的目录,IonCube和Zend Optimizer的so文件都是在/usr/local/lib里面,而apc.so是在/usr/local/php5/lib/php/extensions/里面。想起PHP5.3的那台服务器是使用extension=”apc.so”这句代码就能成功加载APC。

这下狂然大悟,一定是extension_dir的问题。于是对比了下PHP5.3和PHP5.2的php.ini的extension_dir的参数,发现都是:

不过关键的是:PHP5.3的在最前面加了个“;”注释掉了,而PHP5.2没注释,于是修改PHP5.2的php.ini,于是加了个“;”把extension_dir = “./”注释掉,再重启apache。

抽薪止沸,F5探针,APC旁边的小红X没了:

APC