Maison  >  Article  >  Opération et maintenance  >  Comment optimiser la configuration et le noyau Nginx

Comment optimiser la configuration et le noyau Nginx

WBOY
WBOYavant
2023-05-16 21:43:271361parcourir

Optimisation dans les instructions nginx (fichier de configuration)

Copier le code Le code est le suivant :

worker_processes 8;

  Il est recommandé de spécifier le nombre de processus nginx en fonction du nombre de processeurs, généralement un multiple de celui-ci.

Copier le code Le code est le suivant :

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

Allouer le processeur à chaque processus, exemple ci-dessus Allouez 8 processus à 8 processeurs dans , bien sûr, vous pouvez en écrire plusieurs ou en attribuer un Les processus sont alloués à plusieurs processeurs.

Copier le code Le code est le suivant :

worker_rlimit_nofile 102400;

Cette commande fait référence au nombre maximum de descripteurs de fichiers ouverts par un processus nginx. La valeur théorique doit être le nombre maximum de fichiers ouverts (ulimit -n) divisés. par le nombre de processus nginx. Mais nginx ne distribue pas les requêtes de manière aussi uniforme, il est donc préférable de le garder cohérent avec la valeur de ulimit -n.

Copier le code Le code est le suivant :

utilisez epoll ;

En utilisant le modèle d'entrée/sortie d'epoll, cela va sans dire.

Copier le code Le code est le suivant :

worker_connections 102400;

 Le nombre maximum de connexions autorisées par processus Théoriquement, le nombre maximum de connexions par serveur nginx est worker_processes*worker_connections.

Copier le code Le code est le suivant :

keepalive_timeout 60;

 keepalive timeout.

Copier le code Le code est le suivant :

client_header_buffer_size 4k ;

 La taille du tampon de l'en-tête de la demande du client. Elle peut être définie en fonction de la taille de la pagination de votre système. Généralement, la taille de l'en-tête d'une requête ne dépassera pas 1 ko. mais en raison du système général, la pagination doit être supérieure à 1 Ko, la taille de la pagination est donc définie ici. La taille de la pagination peut être obtenue avec la commande getconf pagesize.

Copier le code Le code est le suivant :

open_file_cache max=102400 inactive=20s;

 Cela spécifiera le cache pour les fichiers ouverts. Il n'est pas activé par défaut, le nombre maximum de caches est recommandé. cohérent avec le nombre de fichiers ouverts signifie après combien de temps après qu'un fichier n'ait pas été demandé de supprimer le cache.

Copier le code Le code est le suivant :

open_file_cache_valid 30s ;

 Cela fait référence à la fréquence à laquelle vérifier les informations valides mises en cache.

Copier le code Le code est le suivant :

open_file_cache_min_uses 1;

Le nombre minimum d'utilisations du fichier pendant la durée d'inactivité du paramètre open_file_cache Si ce nombre est dépassé, le descripteur de fichier est toujours ouvert dans le cache. , comme dans l'exemple ci-dessus, s'il y a un Si le fichier n'est pas utilisé pendant la période d'inactivité, il sera supprimé.

Optimisation des paramètres du noyau

Copier le code Le code est le suivant :

net.ipv4.tcp_max_tw_buckets = 6000

 Le nombre de timewait, la valeur par défaut est 180000.

Copier le code Le code est le suivant :

net.ipv4.ip_local_port_range = 1024 65000

 La plage de ports autorisés à être ouverts par le système.

Copier le code Le code est le suivant :

net.ipv4.tcp_tw_recycle = 1

 Activer le recyclage rapide timewait.

Copier le code Le code est le suivant :

net.ipv4.tcp_tw_reuse = 1

 Activez la réutilisation. Autoriser la réutilisation des sockets d'attente pour les nouvelles connexions TCP.

Copier le code Le code est le suivant :

net.ipv4.tcp_syncookies = 1

  Activez les cookies de synchronisation lorsque la file d'attente de synchronisation déborde, activez les cookies pour le gérer.

Copier le code Le code est le suivant :

net.core.somaxconn = 262144

Le retard de la fonction d'écoute dans l'application web limitera le net.core.somaxconn de nos paramètres du noyau à 128 par défaut, tandis que le ngx_listen_backlog défini par nginx est par défaut 511. Il est donc nécessaire d'ajuster cette valeur.

Copier le code Le code est le suivant :

net.core.netdev_max_backlog = 262144

  Le nombre maximum de paquets de données autorisés à être envoyés à la file d'attente lorsque chaque interface réseau reçoit des paquets de données plus rapidement que le noyau ne traite ces paquets.

Copier le code Le code est le suivant :

net.ipv4.tcp_max_orphans = 262144

 Le nombre maximum de sockets TCP dans le système qui ne sont associés à aucun descripteur de fichier utilisateur. Si ce nombre est dépassé, la connexion orpheline sera immédiatement réinitialisée et un message d'avertissement sera imprimé. Cette limite sert uniquement à empêcher les attaques DOS simples. Vous ne pouvez pas trop vous y fier ni réduire artificiellement cette valeur. Vous devez augmenter cette valeur (si vous augmentez la mémoire).

Copier le code Le code est le suivant :

net.ipv4.tcp_max_syn_backlog = 262144

 La valeur maximale des demandes de connexion enregistrées qui n'ont pas encore reçu d'informations de confirmation du client. Pour les systèmes dotés de 128 Mo de mémoire, la valeur par défaut est 1 024 et pour les systèmes dotés de petite mémoire, elle est de 128.

Copier le code Le code est le suivant :

net.ipv4.tcp_timestamps = 0

  Les horodatages peuvent éviter l'enroulement des numéros de séquence. Un lien de 1 Gbit/s rencontrera certainement des numéros de séquence qui ont été utilisés auparavant. L'horodatage permet au noyau d'accepter de tels paquets « anormaux ». Il doit être désactivé ici.

Copier le code Le code est le suivant :

net.ipv4.tcp_synack_retries = 1

 Afin d'ouvrir la connexion au homologue, le noyau doit envoyer une synchronisation et inclure un accusé de réception en réponse à la synchronisation précédente. Il s’agit de la deuxième poignée de main de la soi-disant poignée de main à trois. Ce paramètre détermine le nombre de paquets syn+ack envoyés par le noyau avant d'abandonner la connexion.

Copier le code Le code est le suivant :

net.ipv4.tcp_syn_retries = 1

 Le nombre de paquets de synchronisation envoyés avant que le noyau n'abandonne l'établissement de la connexion.

Copier le code Le code est le suivant :

net.ipv4.tcp_fin_timeout = 1

 Si le socket doit être fermé par l'extrémité locale, ce paramètre détermine combien de temps il reste dans l'état fin-wait-2. L'homologue peut commettre des erreurs et ne jamais fermer la connexion, voire même planter de manière inattendue. La valeur par défaut est de 60 secondes. La valeur habituelle pour le noyau 2.2 est de 180 secondes, vous pouvez appuyer sur ce paramètre, mais gardez à l'esprit que même si votre machine est un serveur Web peu chargé, il existe un risque de débordement de mémoire dû à un grand nombre de sockets morts, fin- wait-2 est moins dangereux que fin-wait-1 car il ne peut consommer que jusqu'à 1,5 Ko de mémoire, mais leur durée de vie est plus longue.

Copier le code Le code est le suivant :

net.ipv4.tcp_keepalive_time = 30

  Lorsque keepalive est activé, la fréquence à laquelle TCP envoie des messages keepalive. La valeur par défaut est de 2 heures.

Une configuration complète d'optimisation du noyau

Copier le code Le code est le suivant :

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel .sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4 29496 7296
net.ipv4. tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core. wmem_default = 8388608
net. core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_or phans = 32768 00
net.ipv4 .tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp _tw_reuse = 1
net.ipv4.tc p_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000

Une simple optimisation nginx fichier de configuration

Copier le code Le code est le suivant :

utilisateur www ; pid /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 204800;

événements
{
utilisez epoll;
worker_connections 204800;
}

http
{
include mime.types;
default_type application/octet-stream;

charset utf-8;

server_names_hash_bucket_size 128;
client_header_buffer_size 2k ;
large_client_header_buffers 4 4k;
client_max_body_size 8m;

sendfile on;
tcp_nopush on;

keepalive_timeout 60;

fastcgi_cache_path /usr/local/nginx/fastcgi_cachelevels=1:2
keys_zone=test:10m
inactif=5m;
fastcgi_connect_timeout 300 ; cgi_cache test;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1 ;
fastcgi_cache_use_stale timeout d'erreur invalid_header http_500;

open_file_cache max=204800 inactive=20s;
open_file_cache_min_uses 1;
open_file_cache_valid 30s;



tcp_nodelay on;

gzip sur;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0 ;
gzip_comp_level 2;
gzip_types text /plain application/x-javascript text/css application/xml;
gzip_vary on;


server
{
listen 8080;
server_name ad.test.com;
index index.php index .htm;
root /www/ html/;

location /status
{
stub_status on;
}

location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
inclut fcgi. conf;
}

emplacement ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{
expire 30j;
}

log_format access ' $remote_addr - $remote_user [$time_local ] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /www/log/access.log access;
}
}

Quelques détails sur la commande fastcgi

Copier le code Le code est le suivant :

fastcgi_cache_path /usr/local/nginx/fastcgi_cachelevels=1:2 keys_zone=test:10m inactive=5m;

Cette commande spécifie un chemin, niveau de structure de répertoire et mots-clés pour la durée de stockage de la zone de cache fastcgi et la durée de suppression d'inactivité.

Copier le code Le code est le suivant :

fastcgi_connect_timeout 300 ;

Spécifiez le délai d'attente de connexion au backend fastcgi.

Copier le code Le code est le suivant :

fastcgi_send_timeout 300 ;

 Délai d'expiration pour l'envoi des requêtes à fastcgi Cette valeur fait référence au délai d'expiration pour l'envoi des requêtes à fastcgi après deux poignées de main.

Copier le code Le code est le suivant :

fastcgi_read_timeout 300;

  Le délai d'attente pour recevoir les réponses fastcgi Cette valeur fait référence au délai d'attente pour recevoir les réponses fastcgi après deux poignées de main.

Copier le code Le code est le suivant :

fastcgi_buffer_size 16k;

Spécifiez la taille d'un tampon nécessaire pour lire la première partie de la réponse fastcgi. Ici, vous pouvez le définir sur la taille du tampon spécifiée par l'instruction fastcgi_buffers. L'instruction ci-dessus précise qu'elle utilisera 1 tampon de 16 Ko pour lire la première partie de la réponse, c'est-à-dire l'en-tête de réponse. En fait, cet en-tête de réponse est généralement très petit (pas plus de 1 Ko), mais si vous spécifiez la taille de. le tampon dans la commande fastcgi_buffers, il allouera également une taille de tampon spécifiée par fastcgi_buffers pour la mise en cache.

Copier le code Le code est le suivant :

fastcgi_buffers 16 16k;

Spécifiez combien et quelle taille de tampons sont nécessaires localement pour tamponner les réponses fastcgi, comme indiqué ci-dessus, si la taille de la page générée par un script php est de 256k, il sera Il alloue 16 tampons de 16 Ko pour la mise en cache. S'il est supérieur à 256 Ko, la partie supérieure à 256 Ko sera mise en cache dans le chemin spécifié par fastcgi_temp. Bien sûr, c'est une solution peu judicieuse pour la charge du serveur, car les données. la vitesse de traitement en mémoire est plus rapide. Pour le disque dur, le réglage de cette valeur doit généralement choisir une valeur intermédiaire de la taille de page générée par les scripts PHP de votre site. Par exemple, si la taille de page est générée par la plupart des scripts de votre site. le site fait 256 Ko, vous pouvez définir cette valeur sur 16 16 Ko, ou 4 64 Ko ou 64 4 Ko, mais évidemment ces deux dernières ne sont pas de bonnes méthodes de réglage, car si la page générée ne fait que 32 Ko, si 4 64 Ko est utilisé, elle allouera un tampon de 64 Ko pour la mise en cache, et si 64 est utilisé en 4 Ko, il allouera 8 tampons de 4 Ko au cache, et si vous utilisez 16 16 Ko, il allouera 2 tampons de 16 Ko pour mettre en cache la page, ce qui semble plus raisonnable.

Copier le code Le code est le suivant :

fastcgi_busy_buffers_size 32k;

Je ne sais pas à quoi sert cette commande, je sais seulement que la valeur par défaut est deux fois la taille de fastcgi_buffers.

Copier le code Le code est le suivant :

fastcgi_temp_file_write_size 32k ;

 Quelle taille de bloc de données sera utilisée lors de l'écriture de fastcgi_temp_path ? La valeur par défaut est le double de la taille de fastcgi_buffers.

Copier le code Le code est le suivant :

fastcgi_cache test

 Activez le cache fastcgi et donnez-lui un nom. Personnellement, je pense qu'activer le cache est très utile, car il peut réduire efficacement la charge du processeur et éviter les erreurs 502. Mais ce cache posera beaucoup de problèmes car il met en cache les pages dynamiques. L'utilisation spécifique dépend de vos propres besoins.

Copier le code Le code est le suivant :

fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;

Spécifiez le temps de cache pour le code de réponse spécifié, comme dans l'exemple ci-dessus, cache 200, 302 réponses pendant une heure, 30 1Reply cache 1 jour, sinon 1 minute.

Copier le code Le code est le suivant :

fastcgi_cache_min_uses 1;

  Le nombre minimum d'utilisations du cache dans la valeur du paramètre inactif de la directive fastcgi_cache_path Comme dans l'exemple ci-dessus, si un fichier n'a pas été utilisé une seule fois. 5 minutes, ce fichier sera supprimé.

Copier le code Le code est le suivant :

fastcgi_cache_use_stale error timeout invalid_header http_500;

Je ne connais pas la fonction de ce paramètre, je suppose qu'il devrait indiquer à nginx quels types de cache sont inutiles. Ce qui précède sont les paramètres liés à fastcgi dans nginx. De plus, fastcgi lui-même a également certaines configurations qui doivent être optimisées. Si vous utilisez php-fpm pour gérer fastcgi, vous pouvez modifier les valeurs suivantes dans le fichier de configuration :

.

Copiez le code Le code est le suivant :

60

 Le nombre de requêtes simultanées traitées en même temps, c'est-à-dire qu'il ouvrira jusqu'à 60 sous -threads pour gérer les connexions simultanées.

Copier le code Le code est le suivant :

102400

 Nombre maximum de fichiers ouverts.

Copier le code Le code est le suivant :

204800

 Le nombre maximum de requêtes que chaque processus peut effectuer avant d'être réinitialisé.

Quelques résultats de tests

 La page statique est le fichier de test mentionné dans l'article J'ai configuré la concurrence 4w dans Squid L'image ci-dessous montre l'exécution de webbench -c 30000 -t 600 sur 6 machines en même temps http://ad. .test Résultats des tests après la commande .com:8080/index.html :

Comment optimiser la configuration et le noyau Nginx

Nombre de connexions filtrées grâce à netstat :

Comment optimiser la configuration et le noyau Nginx

Résultats de la page php en status (la page php appelle phpinfo) :

Comment optimiser la configuration et le noyau Nginx

 Le nombre de connexions à la page php après filtrage netstat :

Comment optimiser la configuration et le noyau Nginx

Chargement du serveur avant l'utilisation du cache fastcgi :

Comment optimiser la configuration et le noyau Nginx

Ouvrez la page php à cette adresse temps C'est déjà un peu difficile et nécessite plusieurs actualisations pour s'ouvrir. La faible charge sur cpu0 dans la figure ci-dessus est due au fait que toutes les demandes d'interruption de la carte réseau ont été allouées à cpu0 pendant le test et que 7 processus ont été ouverts dans nginx et attribués respectivement à cpu1-7.

Après avoir utilisé le cache fastcgi :

Comment optimiser la configuration et le noyau Nginx

À ce stade, vous pouvez facilement ouvrir la page php.

Ce test n'est connecté à aucune base de données, il n'a donc aucune valeur de référence. Cependant, je ne sais pas si le test ci-dessus a atteint la limite. Cela ne semble pas être fonction de l'utilisation de la mémoire et. CPU, mais il n'est pas redondant. La machine est venue et m'a permis d'exécuter Webbench.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer