Vamos dar uma abordagem pragmática.
Todos esses limites são coisas que foram codificadas e projetadas no século passado, quando o hardware era lento e caro. Estamos em 2016 agora, uma torradeira média de wall-mart pode processar mais solicitações do que os valores padrão.
As configurações padrão são realmente perigosas. Ter centenas de usuários em um site não é nada impressionante.
worker_process
Uma configuração relacionada, vamos explicar enquanto estamos no assunto.
nginx como balanceador de carga:
- 1 worker para balanceamento de carga HTTP.
- 1 trabalhador por núcleo para balanceamento de carga HTTPS.
nginx como servidores da Web:
Este é complicado.
Alguns aplicativos / frameworks / middleware (por exemplo, php-fpm) são executados fora do nginx. Nesse caso, 1 nginx worker é suficiente porque geralmente é o aplicativo externo que está processando pesado e comendo os recursos.
Além disso, alguns aplicativos / frameworks / middleware só podem processar um pedido de cada vez e ele é executado para sobrecarregá-los.
De um modo geral, 1 trabalhador é sempre uma aposta segura.
Caso contrário, você pode colocar um trabalhador por núcleo, se souber o que está fazendo. Eu consideraria essa rota como uma otimização e recomendaria benchmarking e testes adequados.
worker_connections
A quantidade total de conexões é worker_process * worker_connections
. Metade no modo balanceador de carga.
Agora estamos chegando à parte da torradeira. Existem muitos limites de sistema subestimados:
- ulimits é 1k max de arquivos abertos por processo no linux (1k soft, 4k hard em alguma distro)
- limites do systemd é quase o mesmo que ulimits.
- o padrão nginx é de 512 conexões por trabalhador.
- Pode haver mais: SELinux, sysctl, supervisord (cada distro + versão é um pouco diferente)
1k worker_connections
O padrão seguro é colocar 1k em todos os lugares.
É alto o suficiente para ser mais do que a maioria dos sites internos e desconhecidos jamais encontrará. É baixo o suficiente para não atingir nenhum outro limite de sistema.
10k
É muito comum ter milhares de clientes, especialmente para um site público. Eu parei de contar a quantidade de sites que vi caindo devido aos baixos padrões.
O mínimo aceitável para produção é de 10k. Os limites do sistema relacionados devem ser aumentados para permitir isso.
Não existe um limite muito alto (um limite simplesmente não tem efeito se não houver usuários). No entanto, um limite muito baixo é uma coisa muito real que resulta em usuários rejeitados e em um site inativo.
Mais de 10k
10k é legal e fácil.
Poderíamos definir limites arbitrários de 1000kk (é apenas um limite, afinal de contas), mas isso não faz muito sentido prático, nós nunca conseguimos esse tráfego e não conseguimos fazer isso de qualquer maneira.
Vamos nos ater a 10k como uma configuração razoável. Os serviços que estão indo (e podem realmente fazer) mais exigirão ajustes e benchmarking especiais.
Cenário especial: uso avançado
Às vezes, sabemos que o servidor não tem muitos recursos e esperamos picos que não podemos fazer muito. Preferimos recusar os usuários do que tentar. Nesse caso, coloque um limite de conexão razoável e configure mensagens de erro e tratamento legais.
Às vezes, os servidores de back-end estão funcionando bem e bem, mas somente até algum carregamento , nada mais e tudo vai para o sul rapidamente. Nós preferimos diminuir a velocidade do que os servidores falharem. Nesse caso, configure o enfileiramento com limites estritos, deixe o buffer nginx em todo o calor enquanto as solicitações estão sendo drenadas em um ritmo limitado.
É muito comum ter milhares de clientes, especialmente para um site público. Eu parei de contar a quantidade de sites que vi caindo devido aos baixos padrões.
O mínimo aceitável para produção é de 10k. Os limites do sistema relacionados devem ser aumentados para permitir isso.
Não existe um limite muito alto (um limite simplesmente não tem efeito se não houver usuários). No entanto, um limite muito baixo é uma coisa muito real que resulta em usuários rejeitados e em um site inativo.
Mais de 10k
10k é legal e fácil.
Poderíamos definir limites arbitrários de 1000kk (é apenas um limite, afinal de contas), mas isso não faz muito sentido prático, nós nunca conseguimos esse tráfego e não conseguimos fazer isso de qualquer maneira.
Vamos nos ater a 10k como uma configuração razoável. Os serviços que estão indo (e podem realmente fazer) mais exigirão ajustes e benchmarking especiais.
Cenário especial: uso avançado
Às vezes, sabemos que o servidor não tem muitos recursos e esperamos picos que não podemos fazer muito. Preferimos recusar os usuários do que tentar. Nesse caso, coloque um limite de conexão razoável e configure mensagens de erro e tratamento legais.
Às vezes, os servidores de back-end estão funcionando bem e bem, mas somente até algum carregamento , nada mais e tudo vai para o sul rapidamente. Nós preferimos diminuir a velocidade do que os servidores falharem. Nesse caso, configure o enfileiramento com limites estritos, deixe o buffer nginx em todo o calor enquanto as solicitações estão sendo drenadas em um ritmo limitado.