Adoptons une approche pragmatique.
Toutes ces limites ont été codées en dur et conçues au siècle dernier, lorsque le matériel était lent et coûteux. Nous sommes en 2016, et un grille-pain moyen peut traiter plus de demandes que les valeurs par défaut.
Les paramètres par défaut sont en fait dangereux. Avoir des centaines d'utilisateurs sur un site web n'a rien d'impressionnant.
processus_travailleur
Un cadre connexe, expliquons-le tant que nous sommes sur le sujet.
nginx comme équilibreur de charge :
- 1 travailleur pour l'équilibrage de la charge HTTP.
- 1 travailleur par cœur pour l'équilibrage de la charge HTTPS.
nginx comme serveurs web :
Cette question est délicate.
Certaines applications/frameworks/middleware (par exemple php-fpm) sont exécutées en dehors de nginx. Dans ce cas, un travailleur nginx est suffisant car c'est généralement l'application externe qui effectue le traitement lourd et consomme les ressources.
En outre, certaines applications/frameworks/middleware ne peuvent traiter qu'une seule demande à la fois et il est contre-productif de les surcharger.
D'une manière générale, un travailleur est toujours une valeur sûre.
Sinon, vous pouvez mettre un travailleur par noyau si vous savez ce que vous faites. Je considérerais cette solution comme une optimisation et je conseillerais de procéder à des analyses comparatives et à des tests appropriés.
connexions_travailleurs
Le nombre total de connexions est de worker_process * worker_connections
. La moitié en mode équilibreur de charge.
Nous arrivons maintenant à la partie "grille-pain". Il existe de nombreuses limites de système très sous-estimées :
- ulimits est 1k maximum de fichiers ouverts par processus sous linux (1k soft, 4k hard sur certaines distro)
- Les limites de systemd sont à peu près les mêmes que celles de ulimits.
- La valeur par défaut de nginx est de 512 connexions par travailleur.
- Il pourrait y en avoir d'autres : SELinux, sysctl, supervisord (chaque distro+version est légèrement différente)
1k connexions_travailleurs
Par défaut, il est prudent de mettre 1 000 partout.
Il est suffisamment élevé pour être supérieur à ce que la plupart des sites internes et inconnus rencontreront jamais. Il est suffisamment bas pour ne pas heurter d'autres limites du système.
10k connexions_travailleurs
Il est très courant d'avoir des milliers de clients, surtout pour un site web public. J'ai arrêté de compter le nombre de sites web que j'ai vus s'effondrer à cause du faible nombre de défauts.
Le minimum acceptable pour la production est de 10 000. Les limites du système concerné doivent être augmentées pour le permettre.
Il n'existe pas de limite trop élevée (une limite n'a tout simplement aucun effet s'il n'y a pas d'utilisateurs). En revanche, une limite trop basse est une chose bien réelle qui se traduit par des utilisateurs rejetés et un site mort.
Plus de 10 000
10 km, c'est bien et c'est facile.
Nous pourrions fixer une limite arbitraire de 1000 kilos (ce n'est qu'une limite après tout) mais cela n'a pas beaucoup de sens pratique, nous n'avons jamais ce trafic et nous ne pourrions pas l'accepter de toute façon.
Nous nous en tiendrons à un chiffre raisonnable de 10 000. Les services qui demandent (et peuvent réellement faire) plus nécessiteront un réglage spécial et une analyse comparative.
Scénario spécial : Utilisation avancée
Parfois, nous savons que le serveur n'a pas beaucoup de ressources et nous nous attendons à des pics auxquels nous ne pouvons pas faire grand-chose. Nous préférons refuser des utilisateurs plutôt que d'essayer. Dans ce cas, fixez une limite de connexion raisonnable et configurez de bons messages d'erreur et une bonne gestion.
Parfois, les serveurs dorsaux fonctionnent bien, mais seulement jusqu'à un certain niveau. une certaine charge En revanche, si l'on en fait plus, les choses se gâtent rapidement. Nous préférons un ralentissement plutôt qu'une panne des serveurs. Dans ce cas, configurez la file d'attente avec des limites strictes, laissez nginx tamponner toute la chaleur pendant que les requêtes sont drainées à un rythme plafonné.