![Apache 2.2.22 能够支持 1,000 个同时连接的客户端吗?](https://linux22.com/image/620007/Apache%202.2.22%20%E8%83%BD%E5%A4%9F%E6%94%AF%E6%8C%81%201%2C000%20%E4%B8%AA%E5%90%8C%E6%97%B6%E8%BF%9E%E6%8E%A5%E7%9A%84%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%90%97%EF%BC%9F.png)
为了一篇报纸上的文章,我对 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
当您使用线程worker
MPM 时,它仅取决于您有多少可用资源(CPU 和内存);如果有 4GB 可用资源,apache 将很乐意运行 1000 个并发线程。
mod_prefork 已被弃用,应避免用于任何严肃的应用程序。