Para um artigo em um jornal, estou testando 5 servidores web diferentes (Apache2, Cherokee, Lighttpd, Monkey e Nginx).
Os testes realizados consistem em medir os tempos de execução, bem como diferentes parâmetros como o número de solicitações atendidas por segundo, a quantidade de RAM, a CPU usada, durante uma carga crescente de clientes simultâneos (de 1 a 1.000 com um passo de 10) cada cliente enviando 1.000.000 requet de um pequeno arquivo fixo, depois de um arquivo fixo médio, depois um pequeno conteúdo dinâmico (hello.php) e finalmente um conteúdo dinâmico complexo (o cálculo do reembolso de um empréstimo) .
Todos os servidores da web são capazes de sustentar essa carga (até 1.000 clientes), mas o Apache2, que sempre pára de responder quando o teste atinge 450 a 500 clientes simultâneos.
Minha configuração é:
- CPU: AMD FX 8150 8 núcleos a 4,2 GHz
- RAM: 32 Gb.
- SSD: 2 x SATA6 Crucial de 240 Gb
- SO: Ubuntu 12.04.3 64 bits
- WS: Apache 2.2.22
Minha configuração do Apache2 é a seguinte:
/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-available
<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 / sites-available / default
<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
Então, eu realmente aprecio o seu conselho para configurar o Apache2 para torná-lo capaz de sustentar 1.000 clientes simultâneos, se isso for possível.
TIA por sua ajuda.
Felicidades.
@Laszlo Valco: Eu faço 100 por 100 de acordo com o seu ponto e é por isso que vim aqui para pedir conselhos e ajuda para configurar o Apache2, a fim de torná-lo capaz de sustentar essa carga.
Agora, estou confortável em fazer isso para todos os outros servidores da Web, mas admito que sou burro e completamente ignorante das configurações do Apache2.
BTW, a configuração atual do Apache2 acima não é a padrão, mas mais uma vez concordo que não atende a necessidade de manter meus testes.
Então, você poderia ser gentil o suficiente para explicar como definir os números que afetam os processos de trabalho de forma que o processo de 1.000 filhos esteja disponível?
Eu acho que está na seção "IfModule mpm_prefork_module" do arquivo "/etc/apache2/apache2.conf", mas não tenho idéia de como definir os valores corretos de acordo com as minhas capacidades de hardware (especialmente a quantidade de RAM que é de 32 Gb) e minha necessidade de atingir 1.000 clientes conectados simultaneamente.
Sua experiência seria muito apreciada para me ajudar a usar os valores corretos, já que, mesmo depois de longas pesquisas, não consegui encontrar explicações claras sobre como fazer isso.
TIA para mais informações.
Felicidades.