Otimizar o Apache para micro instância do EC2

1

Estou executando o apache2 em uma micro instância do EC2 com ~ 600 mb de RAM. A instância estava em execução há quase um ano sem problemas, mas nas últimas semanas ela continua travando, porque o servidor atingiu o MaxClients.

O servidor basicamente roda alguns sites, um blog wordpress (não muito usado), site da empresa (mais usado) e 2 sites pequenos, que são apenas internos.

O banco de dados do blog é executado no RDS, portanto, não há nenhum Mysql sendo executado neste servidor da Web.

Quando cheguei à empresa, o servidor já estava configurado e está executando o apache + mod_php + prefork. Queremos migrar isso no futuro para um nginx + php-fpm, mas ainda precisa de mais testes. Então, por enquanto eu tenho que ficar com a configuração antiga.

Eu também uso a proteção do CloudFlare DDOS na frente do servidor, porque ele foi atacado algumas vezes nas últimas semanas.

Minha empresa não quer pagar por um servidor web melhor neste momento, então eu tenho que ficar com a micro instância também. Além disso, o código do site que executamos é muito ruim e lento, e, às vezes, um único carregamento de página pode levar até 15 segundos. Todo o site é dinâmico e escrito em PHP, então o cache não é realmente uma opção aqui. É uma pesquisa personalizada para usuários.

Eu já desliguei o KeepAlive, o que melhorou um pouco o desempenho.

Minha configuração do prefork parece com a seguinte:


 StartServers 2
 MinSpareServers 2
 MaxSpareServers 5
 ServerLimit 10
 MaxClients 10
 MaxRequestsPerChild 100

O servidor simplesmente não responde depois de um tempo em execução e eu executei o seguinte comando para ver quantas conexões existem: netstat | grep http | wc -l  75

Tentar reiniciar o apache ajuda por um breve momento, mas depois disso, o (s) processo (s) do apache não responde novamente.

Eu tenho os seguintes módulos habilitados (saída de apache2ctl -M)

Loaded Modules:
 core_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 alias_module (shared)
 authz_host_module (shared)
 deflate_module (shared)
 dir_module (shared)
 expires_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 php5_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 ssl_module (shared)
 status_module (shared)
Syntax OK

apache2.conf

# Security
ServerTokens OS
ServerSignature On
TraceEnable On
ServerName "web.example.com"
ServerRoot "/etc/apache2"
PidFile ${APACHE_PID_FILE}
Timeout 30
KeepAlive off
User www-data
Group www-data

AccessFileName .htaccess
<Files ~ "^\.ht">
  Order allow,deny
  Deny from all
  Satisfy all
</Files>

<Directory />
  Options FollowSymLinks
  AllowOverride None
</Directory>

DefaultType none
HostnameLookups Off
ErrorLog /var/log/apache2/error.log
LogLevel warn
EnableSendfile On

#Listen 80


Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
Include /etc/apache2/ports.conf

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
Include /etc/apache2/conf.d/*.conf
Include /etc/apache2/sites-enabled/*.conf

Vhost do site principal

<VirtualHost *:80>
  ServerName www.example.com
  ## Vhost docroot
   DocumentRoot /srv/www/jenkins/Web
  ## Directories, there should at least be a declaration for /srv/www/jenkins/Web

  <Directory /srv/www/jenkins/Web>
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>

  ## Load additional static includes

  ## Logging
  ErrorLog /var/log/apache2/www.example.com.error.log
  LogLevel warn
  ServerSignature Off
  CustomLog /var/log/apache2/www.example.com.access.log combined

  ## Rewrite rules
  RewriteEngine On
  RewriteCond %{HTTP_HOST} !^www.example.com$
  RewriteRule ^.*$ http://www.example.com%{REQUEST_URI} [R=301,L]

  ## Server aliases
  ServerAlias www.example.invalid
  ServerAlias example.com

  ## Custom fragment
<Location /srv/www/jenkins/Web/library>
 Order Deny,Allow
 Deny from all
</Location>
<Files ~ "^\.(.+)">
  Order deny,allow
  deny from all
</Files>

</VirtualHost>
    
por Shiyu Sekam 19.08.2014 / 11:39

2 respostas

6

Atualize seu servidor

Eu sei que você não quer ouvir. Eu sei que você cliente não quer ouvir isso. Mas é o que você precisa ouvir! Se o cliente estiver executando 4 sites (produção não menos), eles devem desembolsar algum dinheiro para um servidor melhor.

Mas por quê?

micro instâncias NÃO são projetadas para uso em produção (a própria AWS diz isso), elas sofrem contenção, não esperam nada grande ou previsível fora da CPU, Rede ou E / S de disco.

Se você precisar usar mirco, considere t2 ao invés de t1

T1 = link

The t1.micro is a previous generation instance and it has been replaced by the t2.micro, which has a much better performance profile. We recommend using the t2.micro instance type instead of the t1.micro. For more information, see T2 Instances.

T2 = link

They are intended for workloads that don't use the full CPU often or consistently, but occasionally need to burst. T2 instances are well suited for general purpose workloads, such as web servers, developer environments, and small databases.

Um hack rápido

Às vezes, você pode resolver problemas de contenção (roubo da CPU, síndrome do vizinho ruim, etc.) com seu host parando o EC2 e iniciando-o novamente. Isso causará uma alteração no host subjacente no qual seu EC2 está sentado.

Respostas para algumas de suas outras perguntas ...

The instance was running for almost a year without problems, but in the last weeks it just keeps crashing, because the server reached MaxClients.

Por que você acha que o servidor atingiu o MaxClients? Mais tráfego? Você pode aumentar esse número, mas suspeito que uma micro instância não possa lidar com muitas conexões simultâneas.

The database for the blog runs on RDS, so there's no Mysql running on this web server.

Adoro o RDS e recomendo que as pessoas o usem. Mas por que a sua empresa está distribuindo dinheiro pelo RDS, mas não querendo atualizar sua instância do EC2? Por que não abandonar o RDS e atualizar o EC2? (Em um mundo ideal eu diria manter o RDS e atualizar o EC2).

The whole website is dynamic and written in PHP, so caching isn't really an option here.

Tem certeza de que a APC não ajudaria nessa situação? Pode ser difícil determinar exatamente o quanto a APC pode ajudar até você tentar. link

Trying to restart apache helps for a short moment, but after that a while the apache process(es) become unresponsive again.

Parece que você está (talvez) recebendo muito tráfego?

    
por 19.08.2014 / 14:36
0

É tarde, mas outra solução é diminuir a carga de trabalho em seu ec2. Use uma distribuição cloudfront na frente desta instância. Diminuirá a carga no seu servidor se as políticas de cache estiverem corretas e o AFAIK com as políticas de cache corretas que o seu servidor pode escalar para milhares de leitores (não editor, administradores, etc.)

Tutorial para configurar o CDN com o wordpress

    
por 19.02.2015 / 10:24