Como ajustar o Apache no servidor Ubuntu 14.04

18

Atualmente no meu Apache 2 (Apache 2.4.7 para ser exato) no Ubuntu 14.04, tenho esta configuração:

/etc/apache2/mods-enabled/mpm_prefork.conf

<IfModule mpm_prefork_module>
StartServers                    20
MinSpareServers                 100
MaxSpareServers                 250
MaxRequestWorkers               150
MaxConnectionsPerChild          0
</IfModule>

O servidor é um servidor Amazon de 8 GB (RAM) que não faz nada além de carregar um formulário de inscrição de três páginas para algumas campanhas publicitárias do Google.

Encontrei um script chamado apachetuneit.sh na Web, mas depois de algum tempo o Apache estava relatando este erro:

[Terça-feira, 21 de abril 16: 45: 42.227935 2015] [mpm_prefork: error] [pid 1134] AH00161: servidor atingiu a configuração MaxRequestWorkers, considere aumentar a configuração MaxRequestWorkers

Como julgar como definir essas configurações?

Estou perguntando especificamente apenas como ajustar o Apache 2.4 e nada mais. É por isso que esta pergunta é diferente dessa pergunta .

ServerChecker
fonte
possível duplicata de Como você carrega testes e planejamento de capacidade para sites?
Jenny D diz Reinstate Monica
@ JennyD Esse artigo é amplo demais para essa necessidade específica.
ServerChecker
A maneira como você julga essas configurações específicas é carregando o teste.
Jenny D diz Reinstate Monica
@ JennyD É ainda mais fácil do que isso. Basta usar o script ap.sh com carga regular várias vezes durante o dia e a média, faça as contas de acordo com o link cloudinservice abaixo e defina MaxRequestWorkers para esse valor. Em seguida, observe os logs do Apache quanto a problemas com o MaxRequestWorkers e aumente, adicione mais RAM, adicione o CloudFlare ou adicione outro nó da web. Não é necessário fazer testes de carga extremamente intensos.
ServerChecker
Você pode escrever uma resposta que contenha informações sobre esse script e itens relevantes dos links que você incluiu em sua própria resposta, para a pergunta que eu apontei como uma possível duplicata.
Jenny D diz Reinstate Monica

Respostas:

45
  1. Reconheça que o Ubuntu 14.04 usa o Apache 2 com o PHP executando um módulo mpm_prefork , do qual um arquivo editável está em /etc/apache2/mods-enabled/mpm_prefork.conf. Além disso, reconheça que a partir do Apache 2.4, o MaxClients agora é renomeado como MaxRequestWorkers e, portanto, qualquer documentação referente ao MaxClients precisa ser trocada para MaxRequestWorkers.

  2. Pare o serviço da web Apache com o seguinte comando, temporariamente:

    serviço sudo apache2 stop
  1. Aguarde 5 segundos e execute o seguinte comando para descobrir quanta memória virtual você possui no servidor que está livre:
    sudo free -ht

Leia a linha Mem: e veja a coluna gratuita. Considere isso como a quantidade de RAM que você pode dedicar ao Apache, embora eu normalmente goste de deduzir 2 GB em um servidor mais robusto (como em> 4 GB) ou 1 GB em um servidor mais leve. Portanto, se a coluna livre disser que eu tenho 13 GB de graça, eu recomendaria dar 11 GB ao Apache. Essa é uma linha de base. Se encontrarmos algum problema no banco de dados nos logs ocasionalmente (como três vezes nos logs em um período de 3 dias) em que ele precisa de mais memória, podemos considerar que tínhamos apenas 10 GB para brincar em vez de 11 GB (neste caso ) Se encontrarmos nos logs do Apache que o servidor precisa de mais MaxRequestWorkers, esse é outro problema que abordarei abaixo.

  1. Inicie o servidor da web Apache.
    serviço sudo apache2 start
  1. Abra como 10 guias do navegador, conecte-se a algumas das páginas mais longas ou de carregamento mais lento no site e atualize 3-4 vezes em cada guia.

  2. Depois de fazer isso, execute rapidamente o seguinte comando:

    sudo ps -ylC apache2 | awk '{x + = $ 8; y + = 1} END {print "Uso de memória Apache (MB):" x / 1024; print "Tamanho médio do processo (MB):" x / ((y-1) * 1024)} '

Execute-o como 5 vezes rapidamente.

Observe o valor Tamanho médio do processo e calcule a média desse valor entre as 5 vezes em que você o executou.

Agora faça o seguinte cálculo e converta GB em MB conforme necessário, para que todos os números estejam em valores de MB. Portanto, multiplique 1024 ou divida por 1024, dependendo do caminho que você precisa seguir.

MaxRequestWorkers = Livre da linha de base (com espaço no buffer) / Tamanho médio do processo

Por exemplo, eu tinha um servidor de 14 GB, mas quando o Apache foi parado, o servidor mostrou que ele usava 1 GB de RAM em modo inativo. Em seguida, forneço outro 1 GB em algum espaço extra de buffer para o sistema operacional, caso seja necessário. Isso significa que eu teria uma linha de base gratuita de 12 GB. Agora devo convertê-lo de GB para MB e, portanto, multiplico 12 x 1024 e obtenho 12288. Os 12288 MB são o meu valor Baseline Free. No meu caso, vi que o tamanho médio do processo era de 21 MB. Então, eu pego 12288/21 e recebo aproximadamente 585. Agora, é comum que os sysops arredondem esse valor e, portanto, eu tenho 580.

  1. Edite o arquivo /etc/apache2/mods-enabled/mpm_prefork.conf e considere configurá-lo com os seguintes padrões, substituindo XXX pelo cálculo do MaxRequestWorkers:


`<IfModule mpm_prefork_module>`
  StartServers                    2
  MinSpareServers                 2
  MaxSpareServers                 5
  MaxRequestWorkers               XXX
  ServerLimit                     XXX
  MaxConnectionsPerChild          0
</IfModule>

Observe que você pode não ver o parâmetro ServerLimit lá. Adicione. O parâmetro padrão é 256, se não estiver presente, mas precisa ser o mesmo valor que MaxRequestWorkers, ou você receberá um erro.

  1. Outro fator crítico na sua configuração do Apache é o arquivo /etc/apache2/apache2.conf com a variável Timeout e é medido em segundos. É quanto tempo você pode enviar ou receber do servidor antes de atingir o tempo limite. Você também deve ter em mente um upload ou download de arquivo, como se você tiver um site em que as pessoas possam fazer upload ou download de CSV ou outros arquivos grandes, por exemplo. E você precisa ter em mente um servidor de banco de dados ocupado e onde pode ser necessário fornecer um tempo antes do tempo limite das páginas. Quanto menor a variável Timeout, mais disponível o servidor da Web recebe novas conexões. Observe, no entanto, que definir esse valor muito baixo pode causar estragos nas variáveis ​​de sessão do PHP, embora não nos cookies baseados em sessão do navegador. Então, por exemplo, um valor de 300 (5 minutos) pode ser bom para um servidor Web que depende de variáveis ​​de sessão PHP para o fluxo de trabalho de aplicativos da Web em vez de cookies de sessão do navegador. Um valor de 45 pode ser bom para um servidor Web que não serve nada além de páginas de destino de publicidade estática, mas seria terrível para um servidor que precisa usar muito variáveis ​​de sessão PHP. Portanto, edite o parâmetro Timeout neste arquivo na quantidade necessária. Isso pode levar alguns testes com todas as suas páginas da web para ver se o valor é muito baixo. Provavelmente, é uma boa idéia, no entanto, não definir um valor superior a 300, a menos que você esteja tendo problemas em uploads de arquivos grandes ou downloads de arquivos grandes. mas seria terrível para um servidor que precisa usar muito as variáveis ​​de sessão PHP. Portanto, edite o parâmetro Timeout neste arquivo na quantidade necessária. Isso pode levar alguns testes com todas as suas páginas da web para ver se o valor é muito baixo. Provavelmente, é uma boa idéia, no entanto, não definir um valor superior a 300, a menos que você esteja tendo problemas em uploads de arquivos grandes ou downloads de arquivos grandes. mas seria terrível para um servidor que precisa usar muito as variáveis ​​de sessão PHP. Portanto, edite o parâmetro Timeout neste arquivo na quantidade necessária. Isso pode levar alguns testes com todas as suas páginas da web para ver se o valor é muito baixo. Provavelmente, é uma boa idéia, no entanto, não definir um valor superior a 300, a menos que você esteja tendo problemas em uploads de arquivos grandes ou downloads de arquivos grandes.

  2. Agora reinicie seu serviço da web Apache. Se você fez algo errado, o Apache provavelmente o informará no momento em que você o iniciar novamente, e você poderá corrigi-lo.

    serviço sudo apache2 reiniciar
  1. Agora repita o truque do navegador de 10 guias que você fez anteriormente e verifique se você encontrou erros de configuração do Apache no log de erros do servidor da web Apache:
    sudo tail -f /var/log/apache2/error.log

... pressione CTRL + C para sair disso, se desejar.

Procure uma reclamação sobre a necessidade de MaxRequestWorkers (e recentemente, desde que você reiniciou o servidor da web). Se você perceber que, mesmo com uma configuração ideal do MaxRequestWorkers, provavelmente precisará de mais poder de fogo para seus sites ou aplicativos. Considere estas opções:

  • Usando uma CDN para downloads de arquivos grandes, imagens e scripts.
  • Usando um serviço de armazenamento em cache como o CloudFlare ou outros.
  • Refazendo seu site ou estratégia de aplicativo da web para usar vários servidores da web, agindo como um "aplicativo da web" atrás de um balanceador de carga.
  • Adicionando mais RAM ao servidor e, assim, fazendo esse cálculo novamente.

  1. Agora que o servidor Apache está ajustado, é uma espécie de linha de base ajustada. Você precisará verificar isso ao longo de duas a três semanas e procurar problemas no MaxRequestWorker nos logs de erro do Apache. A partir disso, você pode tomar uma decisão sobre otimização (consulte a etapa 10). Você também pode instalar o Munin com o apt no Ubuntu e observar o desempenho do Apache ao longo do tempo e planejar uma ideia de crescimento antes de decidir que precisa fazer algo sobre a quantidade de tráfego que o servidor da web está lidando.
ServerChecker
fonte
“Embora esses links possam responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. Respostas só-Link pode se tornar inválido se a página vinculada muda “.
Jenny D diz Reintegrar Monica
@JennyD Good point! Eu farei isso.
ServerChecker
@Moderator Preciso de ajuda na formatação desta resposta. O passo 7 deveria ser um arquivo conf com recuos. O passo 11 não deveria ser recuado. Os comandos de código que começam com sudoprecisam mostrar como código, não como texto normal. Eu segui a documentação sobre formatação, mas ainda luto aqui.
ServerChecker
1
Fiz o que pude - a remarcação não faz muito bem listas e códigos mistos muito bem, mas acho que consegui melhorar um pouco de qualquer maneira.
Jenny D diz Reinstate Monica
por centos novatos como eu: ps -lyU apache em vez de ps -ylC apache2
user1928596
3

Para o qual você pode aumentar o MaxRequestWorkers, depende da quantidade de RAM que cada um dos processos httpd / apache ocupa. Se cada um ocupar 50 MB (apenas escolhendo um número aleatório), a cada 20 trabalhadores solicitados que você usa em simultâneo (ou seja, conexões simultâneas) ocuparão 1 GB. Portanto, nesse exemplo, você pode ter no máximo 8 GB * 20 = 160 MaxRequestWorkers. No entanto, você não pode usar toda a memória RAM para o apache, é necessário reservar um pouco para outras coisas em execução lá. Além disso, deixar alguma RAM sobressalente pode ser útil para o desempenho, pois o sistema operacional o usará para armazenar em cache coisas e acelerar o desempenho (embora seja preferível não ficar sem conexões em comparação com o servidor ser extremamente rápido, pois o site parecerá lento enquanto os navegadores dos usuários esperam que uma conexão seja disponibilizada se todos se esgotarem).

g491
fonte
Qual é uma boa maneira de criar um perfil? Quais comandos posso digitar para ver quanta RAM cada processo apache usa sob carga? Também precisamos de espaço de RAM para o MySQL (um site WordPress) e processos normais do sistema também.
ServerChecker
Veja quantos processos estão em execução e execute o freecomando para obter uma linha de base da memória. Aumente o número de processos em execução aumentando MinSpareServers, reiniciando o apache, executando freenovamente e fazendo as contas. Confira moreofless.co.uk/apache-memory-usage para mais detalhes e explicações.
G491
Aprendi agora que existe uma maneira super rápida de fazer isso. Está descrito no link cloudinservice.com na minha resposta abaixo. O comando é ap.sh que alguém descobriu. Além disso, aprendi que o MaxClients agora foi renomeado como MaxRequestWorkers no Apache 2.4+.
ServerChecker