您知道哪些Apache / PHP配置,这些配置有多好?


8

我想向您询问有关您知道的PHP / Apache配置方法的优缺点。我将开始我自己:

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

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

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

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

这似乎是最慢的默认配置,它本身似乎是“ con”;)

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

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

缺点:PHP处于CGI模式意味着性能降低。在这种模式下,您不能使用APC之类的php加速器,因为每次生成新进程来处理脚本时,都会使以前进程的缓存无效。顺便说一句,您知道在此配置中应用某些加速器的方法吗?我听说过将shm用于php字节码缓存。另外,在这种模式下,您无法通过.htaccess文件配置PHP。如果您需要通过.htaccess设置各种基于脚本的选项(php_value / php_flag指令),则需要为此安装P ECL htscanner

---------------- 通过suexec将PHP作为CGI ----------------

此配置看起来与suphp相同,但是我听说它速度较慢且安全性较低。几乎相同的优点和缺点。

---------------- PHP为FastCGI ----------------

优点:FastCGI标准允许单个php进程在杀死php进程之前处理多个脚本。这样您就可以获得性能,因为无需为每个脚本启动新的php进程。您也可以在此配置中使用PHP加速器(请参阅缺点部分以获取评论)。同样,FCGI几乎与suphp一样也允许php进程代表某些用户执行。mod_fcgid似乎对Apache具有最完整的fcgi支持和灵活性。

缺点:在fastcgi模式下使用php加速器将导致大量内存消耗,因为每个PHP进程将具有自己的字节码缓存(除非有某些加速器可以将共享内存用于字节码缓存。是否有?)。FastCGI的配置也有些复杂。您需要创建各种配置文件并进行一些配置修改。

看来,fastcgi是最稳定,安全,快速和灵活的PHP配置,但是配置起来有些困难。但是,也许是,我错过了什么?

欢迎发表评论!

Answers:


3

通过FastCGI运行PHP当然可以为您带来最大的灵活性。您不仅可以安全地使用mpm-worker Apache,甚至可以完全使用其他Web服务器(例如nginx)。

但是,即使是使用Apache时,“通过FastCGI进行PHP”目前也不是一个选择,而是至少两个选择:mod_fastcgi,mod_fcgid。最重要的是,您可以使用动态,静态或外部FastCGI进程。有或没有suexec。然后是PHP的内部FastCGI流程管理器,现在已由PHP 5.3中非常漂亮的PHP-FPM取代。所有这些选择都有各自的优缺点,并可能导致不同的问题。

如果有选择,我目前将选择PHP_FPM的mod_fastcgi,主要是因为它允许极其灵活和灵活的设置。


1
>我将使用PHP-FPM选择mod_fcgid,这将阻止您使用APC。只有mod_fastcgi允许使用外部FCGI服务器(PHP-FPM)。如果您使用mod_fcgid,则php-fpm提供的所有优势将被清零。
弗拉迪斯拉夫·拉斯特鲁斯尼(Fladislav Rastrusny),2010年

当然,那是一个愚蠢的错字。抱歉,我已纠正了它。
伯爵

2

没有真正回答您的问题,但是我对FastCGI的配置感到困难。它应该替换的其他方法(mod_php,mod_python等)有所不同,因此可能需要重写部分代码。这可能是困难的部分,但是至少对于配置Apache而言,我发现这很困难。举例来说,我正在用python测试WSGI应用程序,我想看看它如何在WSGI支持的所有协议下执行。这是虚拟主机文件,其中包含所有协议的配置(带有mod_fastcgi):

<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很简单。但是您的配置不允许代表其所有者或至少由特定用户执行脚本。另外,不能在您的情况下使用自定义php.ini(我更希望仅将open_basedir限制为每个虚拟主机用于其目录)
Vladislav Rastrusny 2010年

我不太了解PHP,但是那些与直接CGI一样的问题。而且,您可以像任何用户一样轻松地将fastcgi作为外部服务器运行。
Dan Andreatta 2010年

在答案中添加了其他信息。
Dan Andreatta 2010年

1

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

apache2-mpm-itk(简称为mpm-itk)是用于Apache Web服务器的MPM(多处理模块)。mpm-itk允许您在单独的uid和gid下运行每个虚拟主机-简而言之,一个虚拟主机的脚本和配置文件不再对所有其他虚拟主机都可读。

数百名VirtualHosts吸引了很多访客,已经为我们的一位客户提供了很好的服务。

通过将PHP作为模块运行,可以获得所有优点,并可以解决一些缺点。


是的,但最近更新于一年前。而且,更重要的是,这打开了潜在的安全整体。“由于mpm-itk必须能够setuid(),所以它将以root身份运行(尽管在可能的情况下受POSIX功能的限制),直到解析请求并确定vhost为止。这意味着解析请求之前的任何安全漏洞都会被解析。一个根安全漏洞。(最可能的位置可能在mod_ssl中。)
弗拉迪斯拉夫Rastrusny 2010年

该代码有效,非常稳定,可能没有理由对其进行更新。该模块有一个活跃的Debian开发人员(不了解原始开发人员)。它是自由开源软件,不是很复杂。
rkthkr 2010年

0

对我来说,问题是Web服务器的用途是什么。它服务于多个虚拟主机吗?如果是这样,则您需要牺牲性能来实现隔离的安全性。是的,性能确实会受到影响,但是对于当今的硬件,它仍然需要花费大量流量才能带来主要的性能问题。

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


我只是问可能的变体。不是选择最好的。我会选择自己。
弗拉迪斯拉夫Rastrusny 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.