Eu vou contrariar a tendência e dizer que você deve ir com 2-1 para o seu conteúdo na web e outro (provavelmente maior) para o seu banco de dados. Inferno, estou em uma situação em que estou executando um único VPS para todas as minhas necessidades, incluindo DB, com subdomínios apropriados configurados:
static.example.org: lida com conteúdo css, js, images, etc. Defina com keep-alives e expira no futuro. (o conteúdo não expira por um ano ou mais, portanto, nenhuma solicitação adicional é feita. Manter as pessoas ativadas como a maioria das exibições de páginas da Web tentará carregar muitas páginas estáticas, portanto, isso acelerará essas solicitações)
www.example.org: manipule as solicitações dinâmicas. Manter as solicitações estáticas separadas das dinâmicas é importante para a escalabilidade futura de seu sistema - e não é tanto a otimização antecipada. Definir com keep-alives off e expira no futuro. (validação de conteúdo deve ocorrer com conteúdo dinâmico. Ter keep-alives off (ou muito baixo) permite que você salve conexões para solicitações de entrada ... especialmente quando muitos hits serão solicitações de visualização únicas e mais lentas.)
Ter o nginx como seu proxy front-end que lida com as solicitações static.example.org, mas transmite as solicitações www.example.org para um back-end FastCGI (por exemplo), provou ser uma solução rápida para nós - e memória conservadora também. Como alternativa, você pode colocar todo o seu conteúdo estático no Amazon S3 ou algo assim e direcionar suas páginas da Web para isso (com o futuro expirar).
Meu primeiro ponto de expansão provavelmente será mover meu banco de dados para um servidor separado. Eu serei capaz de escalar os processos FastCGI do servidor web para vários sistemas usando nginx com facilidade suficiente - espalhar a carga deve ser razoavelmente fácil ... em teoria.