Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in die bessere Konfigurationsmethode von Nginx bei hoher Parallelität (Codeanalyse)

Einführung in die bessere Konfigurationsmethode von Nginx bei hoher Parallelität (Codeanalyse)

不言
不言Original
2018-09-14 14:31:291711Durchsuche

Dieser Artikel bietet Ihnen eine Einführung in die bessere Konfigurationsmethode (Code-Analyse) von Nginx. Ich hoffe, dass er für Sie hilfreich ist.

1. Die Optimierung bezieht sich hier hauptsächlich auf die Konfigurationsoptimierung von Nginx. Im Allgemeinen sind die folgenden Elemente in der Nginx-Konfigurationsdatei für die Optimierung effektiver:

Anzahl der Nginx-Prozesse, Vorschläge wird anhand der Anzahl der CPUs angegeben, die in der Regel gleich der Anzahl der CPU-Kerne oder einem Vielfachen davon ist.

worker_processes 8;

Weisen Sie jedem Prozess eine CPU zu. Im obigen Beispiel sind 8 Prozesse 8 CPUs zugeordnet. Natürlich können Sie mehrere Prozesse schreiben oder einen Prozess mehreren CPUs zuweisen.

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

Der folgende Befehl bezieht sich auf die maximale Anzahl von Dateideskriptoren, die von einem Nginx-Prozess geöffnet werden. Der theoretische Wert sollte die maximale Anzahl geöffneter Dateien im System (ulimit-n) geteilt durch die Anzahl der Nginx-Prozesse sein , aber Nginx weist Anfragen zu. Es ist nicht so einheitlich, daher ist es besser, mit dem Wert von ulimit -n konsistent zu sein.

worker_rlimit_nofile 65535;

Verwenden Sie das E/A-Modell von epoll, um asynchrone Ereignisse effizient zu verarbeiten

use epoll;

Die maximal zulässige Anzahl von Verbindungen pro Prozess beträgt worker_processes*worker_connections.

worker_connections 65535;

HTTP-Verbindungszeitlimit, der Standardwert beträgt 60 Sekunden. Die Funktion besteht darin, sicherzustellen, dass die Verbindung vom Client zum Server innerhalb der festgelegten Zeit weiterhin gültig bleibt. Wenn eine nachfolgende Anfrage an den Server erfolgt, wird diese Funktion vermieden die Notwendigkeit, eine Verbindung herzustellen oder neu zu starten. Beachten Sie, dass dieser Parameter nicht zu groß eingestellt werden darf! Andernfalls belegen viele ungültige HTTP-Verbindungen die Anzahl der Nginx-Verbindungen und schließlich stürzt Nginx ab!

keepalive_timeout 60;

Die Puffergröße des Client-Anfrage-Headers kann entsprechend der Paging-Größe Ihres Systems festgelegt werden. Im Allgemeinen wird die Header-Größe einer Anfrage 1 KB nicht überschreiten, da das allgemeine System-Paging jedoch größer als 1 KB ist , Also hier ist es auf Paging-Größe eingestellt. Die Paging-Größe kann mit dem Befehl getconf PAGESIZE ermittelt werden.

client_header_buffer_size 4k;

Der folgende Parameter gibt den Cache für geöffnete Dateien an. Er ist standardmäßig nicht aktiviert. Es wird empfohlen, mit der Anzahl der geöffneten Dateien übereinzustimmen Die Datei wird gelöscht, nachdem die Datei nicht angefordert wurde.

open_file_cache max=102400 inactive=20s;

Das Folgende bezieht sich darauf, wie oft zwischengespeicherte gültige Informationen überprüft werden sollen.

open_file_cache_valid 30s;

Die Mindestanzahl, wie oft die Datei während des inaktiven Parameters im Befehl open_file_cache verwendet wird. Wenn diese Zahl überschritten wird, wird der Dateideskriptor immer im Cache geöffnet Wird innerhalb der inaktiven Zeit nicht einmal verwendet, wird es entfernt.

open_file_cache_min_uses 1;

Informationen über das Betriebssystem und die Versionsnummer des Webservers (Nginx) im Antwortheader ausblenden, was der Sicherheit dient.

server_tokens off;

kann dafür sorgen, dass sendfile() funktioniert. sendfile() kann Daten (oder zwei beliebige Dateideskriptoren) zwischen Festplatte und TCP-Socket kopieren. Pre-Sendfile dient dazu, vor der Datenübertragung einen Datenpuffer im Benutzerbereich zu beantragen. Verwenden Sie dann read(), um die Daten aus der Datei in diesen Puffer zu kopieren, und write(), um die Pufferdaten in das Netzwerk zu schreiben. sendfile() liest die Daten sofort von der Festplatte in den Betriebssystem-Cache. Da dieses Kopieren im Kernel erfolgt, ist sendfile() effizienter als die Kombination von read() und write() und das Ein- und Ausschalten des Verwerfungspuffers (mehr zu sendfile).

sendfile on;

weist Nginx an, alle Header-Dateien in einem Paket zu senden, anstatt sie nacheinander zu senden. Das heißt, das Datenpaket wird nicht sofort übertragen. Wenn das Datenpaket das größte ist, wird es auf einmal übertragen, was zur Lösung von Netzwerküberlastungen beiträgt.

tcp_nopush on;

weist Nginx an, die Daten nicht zwischenzuspeichern, sondern Stück für Stück zu senden. Wenn Daten rechtzeitig gesendet werden müssen, sollte dieses Attribut in der Anwendung festgelegt werden, damit beim Senden ein kleines Datenstück gesendet wird Informationen: Der Rückgabewert kann nicht sofort abgerufen werden.

tcp_nodelay on;

Zum Beispiel:

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

Die Puffergröße des Client-Anfrage-Headers kann entsprechend der System-Paging-Größe festgelegt werden. aber aufgrund des allgemeinen Systems Das Paging muss größer als 1 KB sein, daher wird die Paging-Größe hier festgelegt.

client_header_buffer_size 4k;

Die Puffergröße des Client-Anforderungsheaders kann entsprechend der System-Paging-Größe festgelegt werden. Im Allgemeinen wird die Größe eines Anforderungs-Headers jedoch 1 KB nicht überschreiten 1k, hier wird die Paging-Größe eingestellt. Die Paging-Größe kann mit dem Befehl getconf PAGESIZE ermittelt werden.

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

Aber es gibt Fälle, in denen client_header_buffer_size 4 KB überschreitet, der Wert von client_header_buffer_size jedoch auf ein ganzzahliges Vielfaches der „System-Paging-Größe“ gesetzt werden muss.

Cache für geöffnete Dateien angeben. Es wird empfohlen, die Anzahl der Caches konsistent zu halten, wenn die Datei zuvor nicht angefordert wurde Der Cache wird gelöscht.

open_file_cache max=65535 inactive=60s;

Die minimale Anzahl der Verwendungen der Datei innerhalb der inaktiven Parameterzeit des Befehls open_file_cache. Wenn diese Anzahl überschritten wird, wird der Dateideskriptor immer im Cache geöffnet Wird innerhalb der inaktiven Zeit nicht einmal verwendet, wird es entfernt.

open_file_cache_min_uses 1;

Geben Sie an, wie oft zwischengespeicherte gültige Informationen überprüft werden sollen.

open_file_cache_valid 80s;

Das Folgende ist eine einfache Nginx-Konfigurationsdatei, die verwendet wird:

[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. Mehrere Anweisungen zu FastCGI

Diese Anweisung gibt einen Pfad für das FastCGI-Cache-Verzeichnis an Strukturebene, Schlüsselwortbereich-Speicherzeit und inaktive Löschzeit.

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

Gibt das Zeitlimit für die Verbindung zum Backend-FastCGI an.

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配置优化(译)

Das obige ist der detaillierte Inhalt vonEinführung in die bessere Konfigurationsmethode von Nginx bei hoher Parallelität (Codeanalyse). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn