你知道哪些Apache / PHPconfiguration,它们有多好?

我想问你一些你知道的PHP / Apacheconfiguration方法,它们的优缺点。 我会开始自己:

—————- PHP作为Apache模块 —————-

优点 :速度很好,因为你不需要每次启动exe,尤其是在mpm-worker模式下。 您也可以在APC或eAccelerator这种模式下使用各种PHP加速器 。

缺点 :如果你在mpm-worker模式下运行apache,你可能会遇到稳定性问题,因为任何php脚本中的每一个小故障都将导致整个apache进程的线程池不稳定。 在这种模式下,所有的脚本都代表apache用户执行。 这对安全性不利。 mpm-workerconfiguration要求以线程安全模式编译PHP。 至lessCentOS和RedHat默认存储库没有线程安全的PHP版本,所以在这些操作系统上,您至less需要自己编译PHP(有一种方法可以激活Apache上的worker mpm)。 线程安全的PHP二进制文件的使用被认为是实验性的和不稳定的。 此外,许多PHP扩展不支持线程安全模式,或者在线程安全模式下未经过良好testing。

—————- PHP作为CGI —————-

这似乎是最慢的默认configuration,似乎是一个“con”本身;)

—————- PHP作为CGI通过mod_suphp —————-

优点 :suphp允许您代表脚本文件所有者执行php scipts。 这样你可以安全地在同一台机器上分离不同的网站。 另外,suphp允许为每个虚拟主机使用不同的php.ini文件。

缺点 :CGI模式下的PHP意味着更低的性能。 在这种模式下,你不能使用像APC这样的PHP加速器,因为每当新进程产生处理脚本的时候,渲染前一个进程的caching就没用了。 顺便说一句,你知道在这个configuration中应用某些加速器的方式吗? 我听说有关使用PHP的字节码cachingshm的东西。 此外,您不能在此模式下通过.htaccess文件configurationPHP。 如果您需要通过.htaccess(php_value / php_flag指令)设置各种脚本选项,您将需要安装P ECL htscanner 。

—————- 通过suexec作为CGI的PHP —————-

这个configuration看起来和suphp一样,但是我听说它比较慢,不太安全。 几乎相同的优点和缺点适用。

—————- PHP作为FastCGI —————-

优点 :FastCGI标准允许单个php进程在php进程死亡之前处理几个脚本。 这样你就可以获得性能,因为不需要为每个脚本启动新的php进程。 您也可以在此configuration中使用PHP加速器(请参阅cons部分以获得注释)。 另外,FCGI几乎和suphp一样也允许php进程代表某个用户执行。 mod_fcgid似乎对apache具有最完整的fcgi支持和灵活性。

缺点 :在fastcgi模式下使用php加速器会导致高内存消耗,因为每个PHP进程都有自己的字节码caching(除非有一些加速器可以使用共享内存来存储字节码)。 FastCGIconfiguration也有点复杂。 您需要创build各种configuration文件并进行一些configuration修改。

看来,fastcgi是最稳定,最安全,最快速和最灵活的PHPconfiguration,但是有点难以configuration。 但是,可能是,我错过了什么?

欢迎评论!

通过FastCGI运行PHP一定会给你最大的灵活性。 你不仅可以安全地使用mpm worker Apache,还可以使用其他的webserver(例如nginx)。

但即使在Apache中,“通过FastCGI的PHP”目前不是一个选项,但至less有两个:mod_fastcgi,mod_fcgid。 最重要的是,您可以使用dynamic,静态或外部FastCGI进程; 有或没有suexec。 然后是PHP的内部FastCGI进程pipe理器,现在被PHP 5.3中非常好的PHP-FPM取代。 所有这些选项都有不同的优缺点,并可能导致不同的问题。

鉴于这个select,我现在selectmod_fastcgi和PHP-FPM,主要是因为它允许非常灵活和稳定的设置。

不是真的回答你的问题,但我不知道FastCGI很难configuration。 它不同于它应该replace的其他方法(mod_php,mod_python,…),所以它可能需要重写一部分代码。 这可能是困难的部分,但至lessconfigurationApache,我觉得这是一个辛苦。 举个例子,我用pythontesting了一个WSGI应用程序,我想看看它是如何用WSGI支持的所有协议来执行的。 以下是虚拟主机文件,其中包含所有协议(使用mod_fastcgi )的configuration:

 <VirtualHost *:8888> DocumentRoot "/home/test/" #FastCGIExternalServer /home/test/wsgi -host 127.0.0.1:3333 #SCGIMount / 127.0.0.1:3333 FastCgiServer /home/test/wsgi/fcgi.py -idle-timeout 60 -processes 1 <Directory "/home/test/wsgi/"> Options +ExecCGI +FollowSymLinks AddHandler fastcgi-script .py #AddHandler wsgi-script .py #AddHandler cgi-script .py </Directory> </VirtualHost> 

这对我来说似乎并不复杂。 当然,FastCGI支持很多选项,它可以被调整到死亡,但这是另一回事。

要运行是作为一个不同的用户,使用suexec和FastCGIWrapper ,那么它变成:

 FastCGIWrapper On <VirtualHost *:8888> SuexecUserGroup test test DocumentRoot "/home/test/" FastCgiServer /var/www/test/fcgi.py -idle-timeout 60 -processes 1 <Directory "/var/www/test/"> Options +ExecCGI +FollowSymLinks AddHandler fastcgi-script .py </Directory> </VirtualHost> 

并看到这个链接的自定义php.ini,但你应该能够用-initial-env选项指定它,即

 FastCgiServer /var/www/test/fcgi.py -idle-timeout 60 -processes 1 -inital-env PHPRC=/blah/ 

一个好的候选人是: Apache 2 ITK MPM

apache2-mpm-itk(简称mpm-itk)是Apache Web服务器的MPM(多处理模块)。 mpm-itk允许你在单独的uid和gid下运行你的每个虚拟主机 – 简而言之,一个虚拟主机的脚本和configuration文件不再需要被所有其他虚拟主机读取。

已经为我们的客户之一很好地与数百个虚拟主机和相当多的游客工作。

你将所有的优点从PHP作为一个模块来运行,并且理清一些缺点。

对我来说,问题是Web服务器的目的是什么。 它是否服务于多个虚拟主机? 如果是这样,那么你需要牺牲性能来隔离安全性。 是的性能确实受到影响,但是对于今天的硬件,它仍然需要相当多的stream量来带来主要的性能问题。

如果性能很重要,请在VPS或专用服务器上运行一个站点,然后configuration性能。