Já que estamos falando de PHP, eu suponho que você esteja usando o MPM do Prefork Apache. As atitudes de Rasmus Lerdorf em multithreading , você deve continuar usando o Apache prefork ou uma configuração similar sem thread com outro servidor HTTP (como o nginx).
4 vitórias rápidas vêm à mente. Eu não posso dizer da pergunta original do OP se isso já foi feito - se não, essas 4 melhorias devem trazer uma melhora substancial.
a) Mova a entrega de arquivos estáticos (CSS, imagens, etc) para longe de suas instâncias do PHP Apache. Com o Prefork MPM, quando você envia uma única imagem para um usuário, todo um filho do Apache com o tempo de execução PHP inteiro é mantido ocupado para enviar aquela imagem única. Isso poderia ser um processo Apache de 20 a 40 MB ocupado por 0,1 a 3 segundos enquanto o usuário baixa essa imagem - no mesmo tempo em que a instância do Apache poderia ter servido dezenas ou centenas de páginas dinâmicas. Sugestão: configure um servidor dedicado para recursos estáticos ou use um CDN barato como o Amazon CloudFront.
b) Desative HTTP keepalives na instância do Apache que serve conteúdo dinâmico (Drupal). O keepalive HTTP é ótimo e tem seus usos, mas, novamente, com keepalives em & O Apache prefork MPM, um navegador de usuário final único, manterá o "bloking" (isto é, ocupando) um filho do Apache por longos períodos.
c) Verifique se você está enviando os cabeçalhos HTTP apropriados , especialmente se o conteúdo estático, como imagens, CSS, etc., é capaz de armazenar em cache. Caso contrário, o navegador do usuário reduzirá esse conteúdo estático em cada exibição de página, o que é um desperdício total. Use Yahoo! YSlow , RED de Mark Nottingham ou ferramentas similares.
d) Configure outro servidor da Web e use apenas DNS round robin para distribuir a carga entre os dois servidores da web. Eu suponho que o Drupal pode manter o estado da sessão armazenado no banco de dados MySQL (a maioria dos aplicativos PHP pode)? Em caso afirmativo, o armazenamento de sessão será atendido e você poderá usar o round robin de DNS.
O round robin de DNS não é ideal. Não manipula uma falha de um servidor, não garante uma distribuição de carga perfeita. Mas é fácil de configurar e geralmente funciona bem o suficiente para uma configuração simples com 2 ou talvez 3 servidores da Web.