Colocando o Apache para funcionar no Mac OS X 10.10 (Yosemite)

Não vou tecer aqui as minhas reclamações a respeito do novo sistema do Mac. Não estou me entendendo muito bem com ele, espero que seja questão de tempo.

Uma coisa que mudou e me deu trabalho foi o Apache. No Mavericks, o Apache era o 2.2. No Yosemite, eles agora usam o 2.4. Se você usava o Apache no Mavericks, vai ver que ele logo de cara não funciona no Yosemite.

Vamos aos passos que resolveram o meu problema. Talvez resolvam o seu também. Estou supondo que você use o Apache com o PHP na pasta /Library/WebServer/Documents/.

Edite o arquivo /etc/apache2/httpd.conf (você vai reparar que ele salvou uma cópia do seu httpd.conf como httpd.conf.pre-update. Suas configurações antigas estão lá).

sudo vi httpd.conf

Comente a linha “Require all denied” do diretório “/”.

AllowOverride none
# Require all denied

Descomente a linha que carrega o PHP.

LoadModule php5_module libexec/apache2/libphp5.so

Caso você não esteja usando o apache na pasta /Library/WebServer/Documents/, talvez seja útil adicionar o usuário _www aos grupos admin, staff e wheel, usando os comandos abaixo no terminal.

sudo dseditgroup -o edit -a _www -t user admin
sudo dseditgroup -o edit -a _www -t user wheel
sudo dseditgroup -o edit -a _www -t user staff

Pronto. Reinicie o apache que tudo deve funcionar agora.

sudo apachectl restart

E assim eu mantive meu servidor estável…

Há vários meses vinha tendo problemas diários de instabilidade no servidor do Zeletron. Todo santo dia o uso de memória do servidor ia a 100% e travava tudo.

Primeiro desconfiei de ataque, mas não havia nenhum rastro de hackers ou qualquer coisa parecida. Depois me sugeriram que fosse algum pacote desatualizado fazendo uma lambança, mas a máquina está sempre atualizada com a última versão stable de tudo.

E assim foi passando o tempo… Com isso, demorei muito para descobrir que o vilão do meu servidor era o Apache que estava gastando RAM demais. A máquina já ligava com 50% da memória usada, e, com as conexões chegando ao blog, ela ia facilmente para 90% fora do horário de pico.

Depois de muito procurar no Google, encontrei a explicação para o problema e a solução. Resumindo a história, o padrão do apache é deixar um número alto de clientes simultâneos (se não me engano eram 150), mesmo que você não precise disso tudo.

A solução é reduzir esse número para o mais baixo que você puder, sempre tomando cuidado para não baixar demais e ter o efeito contrário, o de congestionar o acesso por causa de poucos clientes simultâneos.

A idéia é a seguinte, se você tem no máximo 50 requisições simultâneas, não precisa de 150 nunca. Quanto menos processos simultâneos ele abrir, menos memória ele gasta.

Mas como eu descubro quantos clientes simultâneos são necessários?

O comando apache2ctl status te diz quantas requisições estão sendo tratadas num dado momento. A idéia é pegar um horário de pico e monitorar esse dado, para ver quantas requisições simultâneas estão sendo usadas.

Vejam o exemplo abaixo:

Parent Server Generation: 5
12 requests currently being processed, 8 idle workers

KKKWWKKW_K_K___KK___............................................

Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process

De posse dos dados do comando apache2ctl status, descobri que 20 clientes simultâneos eram suficientes para atender o meu público. Com isso, pude configurar o arquivo apache2.conf (geralmente em /etc/apache2/) com as informações abaixo:

<IfModule mpm_worker_module>
    StartServers          2
    MaxClients           20
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>

Esse pequeno ajuste foi o suficiente para manter o servidor de pé por 15 dias até agora, com um uso de memória bem razoável, sem chegar nunca a 85%.

Pode ser que eu tenha que subir um pouco esses valores mais para frente, apesar de não ter tido nenhuma reclamação de congestionamento do blog nesses 15 dias. Mas o que interessa é que encontrei o X da questão e consegui resolver a equação sem ter que contratar mais memória ou trocar de servidor.