配置HAProxy+nginx+PHP-FPM以执行Apache+mod_PHP


Configuring HAProxy+nginx+PHP-FPM to out perform Apache+mod_php

编辑

在VirtualBox上运行操作系统是个问题。当我把我的操作系统变成磁盘上的原生操作系统时,我就能看到性能的提升。

原始

我读过很多人建议放弃Apache+mod_php,转而使用HAProxy+nginx+php-FPM。我试图验证这是一个更有效的设置,但没有看到人们描述的结果。siege和ab(ApacheBenchmark)都表明,在任何数量的并发连接中,Apache每秒都能提供更好的响应,并且可以支持更多的连接。

我在VirtualBox上运行Ubuntu 11.04服务器。它有10吉的空间和1344兆的内存。我用apt-get安装了上面提到的程序。以下是相关的配置文件,仅包括重要部分。

haproxy.cfg

global
        maxconn 4096
        user haproxy
        group haproxy
        daemon
        stats socket /var/run/haproxy.sock mode 0600 level admin
defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        option  redispatch
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000
listen tcpcluster *:80
        mode tcp
        option tcplog
        balance roundrobin
        server tcp01 192.168.1.199:8080 check

nginx.conf

worker_processes 2;
events {
        worker_connections 768;
}

www.conf

pm = dynamic
pm.max_children = 10
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 500

apache.conf

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients           10
    MaxRequestsPerChild   0
</IfModule>
<IfModule mpm_worker_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients           10
    MaxRequestsPerChild   0
</IfModule>
<IfModule mpm_event_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients           10
    MaxRequestsPerChild   0
</IfModule>

考虑到PHP-FPM和Apache最多都有10个孩子,我认为任何速度优势都是显而易见的。在我运行的每一个测试中(总是等到负载为0.01后再运行测试),Apache总是能够更有效地处理更多的请求。

是否可以进行其他优化,以使最适合规模的设置优于不应该更高效的设置?

使用haproxy作为连接集中器:使用"mode http"而不是"mode tcp",使用"option http server close"并将服务器maxconn值设置为远低于worker connections值。您应该跨越这样一个点:较低的并发性带来了更高的性能,同时在整个链中具有更低的RAM使用率和更好的缓存效率。

顺便说一句,我们谈论的数字是多少?它们是以每秒数百次还是数千次请求为单位衡量的?因为很明显,应用程序服务器只会在更高的负载上产生真正的影响。显然,如果应用程序运行非常缓慢,那么在更换服务器时就没有理由看到差异。