Maison  >  Article  >  développement back-end  >  Introduction à la meilleure méthode de configuration de nginx en haute concurrence (analyse de code)

Introduction à la meilleure méthode de configuration de nginx en haute concurrence (analyse de code)

不言
不言original
2018-09-14 14:31:291711parcourir

Ce que cet article vous apporte est une introduction à la meilleure méthode de configuration (analyse de code) de nginx en haute simultanéité. Elle a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

1. L'optimisation ici fait principalement référence à l'optimisation de la configuration de nginx De manière générale, les éléments suivants dans le fichier de configuration nginx sont plus efficaces pour l'optimisation :

Nombre de processus nginx, suggestions. est spécifié en fonction du nombre de processeurs, qui est généralement le même que le nombre de cœurs de processeur ou un multiple de celui-ci.

worker_processes 8;

Allouer un processeur à chaque processus. Dans l'exemple ci-dessus, 8 processus sont alloués à 8 processeurs. Bien sûr, vous pouvez en écrire plusieurs, ou allouer un processus à plusieurs processeurs.

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

La commande suivante 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 dans le système (ulimit-n) divisé par le nombre de. nginx traite, mais nginx La distribution des requêtes n'est pas si uniforme, il est donc préférable d'être cohérent avec la valeur de ulimit -n.

worker_rlimit_nofile 65535;

Utilisez le modèle d'E/S d'epoll pour gérer efficacement les événements asynchrones

use epoll;

Le nombre maximum de connexions autorisées par processus, théoriquement pour chaque serveur nginx Le nombre maximum de connexions est worker_processes *worker_connections.

worker_connections 65535;

délai d'expiration de la connexion http, la valeur par défaut est de 60 s, la fonction est de faire en sorte que la connexion du client au serveur continue d'être valide dans le délai défini lorsqu'une requête ultérieure au serveur se produit. La fonction évite l'établissement de ou rétablit la connexion. N'oubliez pas que ce paramètre ne peut pas être trop grand ! Sinon, de nombreuses connexions http invalides occuperont le nombre de connexions nginx, et éventuellement nginx plantera !

keepalive_timeout 60;

La taille du tampon de l'en-tête de la requête 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 parce que la pagination générale du système est plus grande. que 1k, donc ceci est défini sur la taille de la pagination. La taille de la pagination peut être obtenue avec la commande getconf PAGESIZE.

client_header_buffer_size 4k;

Le paramètre suivant spécifiera le cache pour les fichiers ouverts. Il n'est pas activé par défaut. Max spécifie le nombre de caches. Il est recommandé d'être cohérent avec le nombre de fichiers ouverts. combien de temps le fichier n'a pas été demandé. Supprimer le cache.

open_file_cache max=102400 inactive=20s;

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

open_file_cache_valid 30s;

Le nombre minimum de fois que le fichier est utilisé pendant le paramètre inactif dans la directive 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, si. il y a un fichier pendant le temps d'inactivité. Une fois qu'il n'est pas utilisé, il sera supprimé.

open_file_cache_min_uses 1;

Masquer les informations sur le numéro de version du système d'exploitation et du serveur Web (Nginx) dans l'en-tête de réponse, ce qui est bon pour la sécurité.

server_tokens off;

peut faire fonctionner sendfile(). sendfile() peut copier des données (ou deux descripteurs de fichiers) entre le disque et le socket TCP. Le pré-envoi du fichier consiste à demander un tampon de données dans l'espace utilisateur avant de transmettre les données. Utilisez ensuite read() pour copier les données du fichier vers ce tampon et write() pour écrire les données du tampon sur le réseau. sendfile() lit immédiatement les données du disque vers le cache du système d'exploitation. Parce que cette copie est effectuée dans le noyau, sendfile() est plus efficace que de combiner read() et write() et d'activer et de désactiver le tampon de suppression (plus d'informations sur sendfile).

sendfile on;

indique à nginx d'envoyer tous les fichiers d'en-tête dans un seul paquet au lieu de les envoyer l'un après l'autre. C'est-à-dire que le paquet de données ne sera pas transmis immédiatement, lorsque le paquet de données est le plus volumineux, il sera transmis en une seule fois, ce qui aidera à résoudre la congestion du réseau.

tcp_nopush on;

Dites à nginx de ne pas mettre les données en cache, mais de les envoyer morceau par morceau - lorsque les données doivent être envoyées à temps, cet attribut doit être défini sur l'application, de sorte que lors de l'envoi d'un petit morceau de données, les informations ne peuvent pas être obtenues immédiatement. Valeur de retour.

tcp_nodelay on;

Par exemple :

http { 
server_tokens off; 
sendfile on; 
tcp_nopush on; 
tcp_nodelay on; 
......
}

La taille du tampon de l'en-tête de requête client. Elle peut être définie en fonction de la taille de la pagination du système. Généralement, la taille d'un en-tête de requête sera. ne dépasse pas 1 Ko. Toutefois, étant donné que la pagination générale du système est supérieure à 1 Ko, la taille de la pagination est définie ici.

client_header_buffer_size 4k;

La taille du tampon de l'en-tête de requête client. Elle peut être définie en fonction de la taille de la pagination du système. Généralement, la taille d'un en-tête de requête ne dépassera pas 1 Ko, mais comme la pagination du système est généralement plus grande. que 1k, donc Ceci est défini sur la taille de la pagination. La taille de la pagination peut être obtenue avec la commande getconf PAGESIZE.

[root@test-huanqiu ~]# getconf PAGESIZE 
4096

Mais il existe des cas où client_header_buffer_size dépasse 4k, mais la valeur de client_header_buffer_size doit être définie sur un multiple entier de la "taille de pagination du système".

Spécifier le cache pour les fichiers ouverts. Il n'est pas activé par défaut. Max spécifie le nombre de caches. Il est recommandé d'être cohérent avec le nombre de fichiers ouverts. Inactif fait référence à la durée pendant laquelle le fichier n'est pas demandé auparavant. le cache est supprimé.

open_file_cache max=65535 inactive=60s;

Le nombre minimum de fois que le fichier est utilisé pendant le paramètre inactif dans la commande 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, si. il y a un fichier pendant le temps d'inactivité. Une fois qu'il n'est pas utilisé, il sera supprimé.

open_file_cache_min_uses 1;

Spécifiez à quelle fréquence vérifier les informations valides mises en cache.

open_file_cache_valid 80s;

Ce qui suit est un simple fichier de configuration nginx utilisé :

[root@dev-huanqiu ~]# cat /usr/local/nginx/conf/nginx.conf
user   www www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;
error_log   /www/log/nginx_error.log   crit;
pid         /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 65535;
 
events
{
   use epoll;
   worker_connections 65535;
}
 
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_cache levels=1:2
                 keys_zone=TEST:10m
                 inactive=5m;
   fastcgi_connect_timeout 300;
   fastcgi_send_timeout 300;
   fastcgi_read_timeout 300;
   fastcgi_buffer_size 16k;
   fastcgi_buffers 16 16k;
   fastcgi_busy_buffers_size 16k;
   fastcgi_temp_file_write_size 16k;
   fastcgi_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 error timeout 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 on;
   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   huan.wangshibo.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;
         include fcgi.conf;
     }
 
     location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
     {
       expires       30d;
     }
 
     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;
       }
}

2 Plusieurs instructions sur FastCGI

Cette instruction est FastCGI Le cache précise. un chemin, un niveau de structure de répertoires, une durée de stockage de la zone de mots-clés et une durée de suppression inactive.

fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;

Spécifiez le délai d'attente pour la connexion au backend FastCGI.

fastcgi_connect_timeout 300;

向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。

fastcgi_send_timeout 300;

接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。

fastcgi_read_timeout 300;

指定读取FastCGI应答第一部分 需要用多大的缓冲区,这里可以设置为fastcgi_buffers指令指定的缓冲区大小,上面的指令指定它将使用1个 16k的缓冲区去读取应答的第一部分,即应答头,其实这个应答头一般情况下都很小(不会超过1k),但是你如果在fastcgi_buffers指令中指 定了缓冲区的大小,那么它也会分配一个fastcgi_buffers指定的缓冲区大小去缓存。

fastcgi_buffer_size 16k;

指定本地需要用多少和多大的缓冲区来 缓冲FastCGI的应答,如上所示,如果一个php脚本所产生的页面大小为256k,则会为其分配16个16k的缓冲区来缓存,如果大于256k,增大 于256k的部分会缓存到fastcgi_temp指定的路径中, 当然这对服务器负载来说是不明智的方案,因为内存中处理数据速度要快于硬盘,通常这个值 的设置应该选择一个你的站点中的php脚本所产生的页面大小的中间值,比如你的站点大部分脚本所产生的页面大小为 256k就可以把这个值设置为16 16k,或者4 64k 或者64 4k,但很显然,后两种并不是好的设置方法,因为如果产生的页面只有32k,如果用4 64k它会分配1个64k的缓冲区去缓存,而如果使用64 4k它会分配8个4k的缓冲区去缓存,而如果使用16 16k则它会分配2个16k去缓存页面,这样看起来似乎更加合理。

fastcgi_buffers 16 16k;

这个指令我也不知道是做什么用,只知道默认值是fastcgi_buffers的两倍。

fastcgi_busy_buffers_size 32k;

在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍。

fastcgi_temp_file_write_size 32k;

开启FastCGI缓存并且为其制定一个名称。个人感觉开启缓存非常有用,可以有效降低CPU负载,并且防止502错误。但是这个缓存会引起很多问题,因为它缓存的是动态页面。具体使用还需根据自己的需求。

fastcgi_cache TEST

为指定的应答代码指定缓存时间,如上例中将200,302应答缓存一小时,301应答缓存1天,其他为1分钟。

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

缓存在fastcgi_cache_path指令inactive参数值时间内的最少使用次数,如上例,如果在5分钟内某文件1次也没有被使用,那么这个文件将被移除。

fastcgi_cache_min_uses 1;

不知道这个参数的作用,猜想应该是让nginx知道哪些类型的缓存是没用的。

fastcgi_cache_use_stale error timeout invalid_header http_500;

相关推荐:

nginx+keepalived配置高可用HTTP群集

高流量站点NGINX与PHP-fpm配置优化(译)

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn