Apache 2.2.22 能够支持 1,000 个同时连接的客户端吗?

Apache 2.2.22 能够支持 1,000 个同时连接的客户端吗?

为了一篇报纸上的文章,我对 5 种不同的网络服务器 (Apache2、Cherokee、Lighttpd、Monkey 和 Nginx) 进行了基准测试。

所进行的测试包括测量执行时间以及不同的参数,如每秒处理的请求数、RAM 大小、使用的 CPU,在同时运行的客户端负载不断增加(从 1 到 1,000,步长为 10)的情况下,每个客户端发送 1,000,000 个小型固定文件的请求,然后是中型固定文件的请求,然后是小型动态内容(hello.php),最后是复杂的动态内容(贷款偿还计算)。

所有的 Web 服务器都能够承受这样的负载(最多 1,000 个客户端),但是当测试达到 450 到 500 个同时客户端时,Apache2 总会停止响应。

我的配置是:

  • CPU:AMD FX 8150 8 核 @ 4.2 GHz
  • 内存:32 Gb。
  • SSD:2 个 Crucial 240 Gb SATA6
  • 操作系统:Ubuntu 12.04.3 64位
  • WS:Apache 2.2.22

我的Apache2配置如下:

/etc/apache2/apache2.conf

LockFile ${APACHE_LOCK_DIR}/accept.lock
PidFile ${APACHE_PID_FILE}
Timeout 30
KeepAlive On
MaxKeepAliveRequests 1000000
KeepAliveTimeout 2
ServerName "fnux.net"
<IfModule mpm_prefork_module>
  StartServers         16
  MinSpareServers      16
  MaxSpareServers      16
  ServerLimit        2048 
  MaxClients         1024
  MaxRequestsPerChild   0
</IfModule>
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
AccessFileName .htaccess
<Files ~ "^\.ht">
  Order allow,deny
  Deny from all
  Satisfy all
</Files>
DefaultType None
HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel emerg
Include mods-enabled/*.load
Include mods-enabled/*.conf
Include httpd.conf
Include ports.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
Include conf.d/
Include sites-enabled/

/etc/apache2/ports.conf

NameVirtualHost *:8180
Listen 8180
<IfModule mod_ssl.c>
  Listen 443
</IfModule>
<IfModule mod_gnutls.c>
  Listen 443
</IfModule>

/etc/apache2/mods 可用

<IfModule mod_fastcgi.c>
   AddHandler php5-fcgi .php
   Action php5-fcgi /cgi-bin/php5.external
   <Location "/cgi-bin/php5.external">
     Order Deny,Allow
     Deny from All
     Allow from env=REDIRECT_STATUS
   </Location>
 </IfModule>

/etc/apache2/站点可用/默认

<VirtualHost *:8180>
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/apache2
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  <Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
  </Directory>
  ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
  <Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
  </Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel emerg
#####   CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /doc/ "/usr/share/doc/"
  <Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
  </Directory>
  <IfModule mod_fastcgi.c>
    AddHandler php5-fcgi .php
    Action php5-fcgi /php5-fcgi
    Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization
  </IfModule>
</VirtualHost>

/etc/security/limits.conf

* soft nofile 1000000
* hard nofile 1000000

因此,如果可能的话,我将非常感激您的建议,设置 Apache2 以使其能够同时支持 1,000 个客户端。

非常感谢你的帮助。干杯。


@Laszlo Valco:我百分之百同意你的观点,这就是为什么我来这里寻求建议和帮助来配置 Apache2,以使其能够承受这样的负载。

现在,我可以轻松地对所有其他 Web 服务器执行此操作,但我承认我很笨并且完全不了解 Apache2 设置。

顺便说一句,上面当前的 Apache2 配置不是默认配置,但我再次同意它不能满足维持我的测试的需要。

那么,您能否解释一下如何设置影响工作进程的数字,以便有 1,000 个子进程可用?

我猜它位于文件“/etc/apache2/apache2.conf”的“IfModule mpm_prefork_module”部分,但我不知道如何根据我的硬件功能(尤其是 32 Gb 的 RAM 数量)和我需要达到 1.000 个同时连接的客户端来设置正确的值。

非常感谢您的专业知识来帮助我使用正确的价值观,因为即使经过长时间的搜索,我也无法找到关于如何做到这一点的清晰解释。

如需更多信息,请访问 TIA。

干杯。

答案1

我不太相信您的基准测试在使用此类配置时会有多大用处。使用默认(或类似)配置进行任何性能基准测试在我看来都毫无意义。如果有人对性能感兴趣,就必须通过削减所有不必要的降低性能的功能来调整配置。那么为什么这个人会对基准测试感兴趣,而不是显示这些服务器的真正能力,而是显示默认配置认为有用的功能?

因此,如果要进行适当的性能基准测试,那么您应该设置一个实际的功能需求列表,并研究如何配置这些软件以满足功能需求并尽可能地发挥最佳性能。例如,Apache 默认配置是出了名的不注重性能。

为了帮助您解决 Apache 配置问题:设置影响工作进程的数字,以便 1000 个子进程始终可用。


尝试对 MPM prefork 进行以下设置:

StartServers       1024
MinSpareServers     128
MaxSpareServers    1024
ServerLimit        2048 
MaxClients         2048
MaxRequestsPerChild   0

或者对于 MPM 工作者来说这些:

ServerLimit          64
StartServers         32
MaxClients         2048
MinSpareThreads     128
MaxSpareThreads    1024
ThreadsPerChild      32

此外,请注意,<IfModule mpm_prefork_module>除非您使用该 MPM 模块或更改该行中的模块名称,否则该行将排除该部分。

答案2

当您使用线程workerMPM 时,它仅取决于您有多少可用资源(CPU 和内存);如果有 4GB 可用资源,apache 将很乐意运行 1000 个并发线程。

mod_prefork 已被弃用,应避免用于任何严肃的应用程序。

相关内容