您了解哪些 Apache/PHP 配置以及它们有多好?

您了解哪些 Apache/PHP 配置以及它们有多好?

我想问一下您知道的 PHP/Apache 配置方法以及它们的优缺点。我将自己开始:

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

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

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

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

这似乎是最慢的默认配置,它本身似乎是一个“缺点”;)

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

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

缺点:CGI 模式下的 PHP 性能较差。在此模式下,您无法使用 APC 等 php 加速器,因为每次都会生成新进程来处理脚本,导致前一个进程的缓存无用。顺便问一句,您知道如何在此配置中应用某些加速器吗?我听说过使用 shm 进行 php 字节码缓存。此外,您无法在此模式下通过 .htaccess 文件配置 PHP。您需要安装 PECL热扫描器如果您需要通过 .htaccess (php_value / php_flag 指令) 设置各种每个脚本选项

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

此配置看起来与 suphp 相同,但我听说它更慢且更不安全。优点和缺点几乎相同。

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

优点:FastCGI 标准允许单个 php 进程在终止之前处理多个脚本。这样,您就无需为每个脚本启动新的 php 进程,从而获得更高的性能。您还可以在此配置中使用 PHP 加速器(请参阅缺点部分以了解注释)。此外,FCGI 几乎与 suphp 一样,还允许代表某些用户执行 php 进程。mod_fcgid似乎对 apache 有最完整的 fcgi 支持和灵活性。

缺点:使用 fastcgi 模式的 php 加速器会导致内存消耗过高,因为每个 PHP 进程都有自己的字节码缓存(除非有加速器可以使用共享内存进行字节码缓存。有这样的吗?)。FastCGI 的配置也有点复杂。您需要创建各种配置文件并进行一些配置修改。

看起来,fastcgi 是最稳定、最安全、最快速、最灵活的 PHP 配置,但是配置起来有点困难。但是,可能是我遗漏了什么?

欢迎评论!

答案1

通过 FastCGI 运行 PHP 无疑会为您提供最大的灵活性。您不仅可以安全地使用 mpm-worker Apache,甚至可以完全使用另一个 Web 服务器(例如 nginx)。

但即使继续使用 Apache,“通过 FastCGI 运行 PHP”目前也并非只有一个选项,而是至少有两个:mod_fastcgi、mod_fcgid。除此之外,您还可以使用动态、静态或外部 FastCGI 进程;带或不带 suexec。然后是 PHP 的内部 FastCGI 进程管理器,现在已被非常好用的PHP-FPM在 PHP 5.3 中。所有这些选项都有不同的优缺点,并且可能导致不同的问题。

如果可以选择,我目前会选择带有 PHP-FPM 的 mod_fastcgi,主要是因为它允许极其灵活和稳定的设置。

答案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/

答案3

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

apache2-mpm-itk(简称 mpm-itk)是 Apache Web 服务器的 MPM(多处理模块)。mpm-itk 允许您在单独的 uid 和 gid 下运行每个 vhost - 简而言之,一个 vhost 的脚本和配置文件不再需要可供所有其他 vhost 读取。

已经为我们的一位客户提供了非常好的服务,该客户有数百个 VirtualHosts 以及相当多的访问者。

您可以从运行 PHP 作为模块中获得所有优点,同时还可以解决一些缺点。

答案4

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

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

相关内容