Heim  >  Artikel  >  Backend-Entwicklung  >  Nginx-Lastausgleichsstrategie und -konfiguration

Nginx-Lastausgleichsstrategie und -konfiguration

不言
不言Original
2018-06-05 10:11:181799Durchsuche

In diesem Artikel wird hauptsächlich die Nginx-Lastausgleichsstrategie und -konfiguration vorgestellt, die jetzt mit allen geteilt werden kann. Freunde in Not können sich darauf beziehen

Lassen Sie uns zunächst kurz verstehen, was Lastausgleich ist, indem wir es wörtlich verstehen.

NN Server verteilen die Last gleichmäßig Ein bestimmter Server hat eine hohe Auslastung und fällt aus, während ein bestimmter Server inaktiv ist. Die Voraussetzung für den Lastausgleich besteht darin, dass er von mehreren Servern erreicht werden kann, dh mehr als zwei Server sind ausreichend. Der Lastausgleich ist eine Technologie, die für Websites mit hoher Parallelität und hohem Datenverkehr implementiert werden muss. Umgebung

Verwendung der Lastausgleichsbereitstellung auf zwei Maschinen

Domainnamen testen :a.com A

ServerIP: 10.1.108.31 (Hauptserver)B

ServerIP: 192.168.112.128

Bereitstellungsidee

Ein

Server als Beim Hauptserver wird der Domänenname durch A (10.1.108.31 ) aufgelöst >A Der -Server ist mit dem B-Server (192.168.112.128 ) auf. Projekte, die einen Lastausgleich erfordern

nodejs web

Projekt, Projektname sozial

, Hafen

6602. Starten Sie auf dem Server A

und dem Server

B server bzw. >social-Projekt (wie man das nodejs -Projekt startet, wird hier nicht vorgestellt), installieren Sie es auf dem A Server nginx (Die Installation wird hier nicht vorgestellt, B Server muss nicht installiert werden). BereitstellungDomänennamenauflösung

Da dies nicht der Fall ist eine reale Umgebung. Verwenden Sie einfach den Domainnamen

a.com zum Testen, sodass die Auflösung von

a.com

nur durchgeführt werden kann auf Hosts Dateieinstellungen. Öffnen: C:WindowsSystem32driversetchosts

Fügen Sie

hinzu Ende 10.1.108.31 a.com

Speichern und beenden, dann den Befehlsmodus startenpingen um zu sehen, ob es erfolgreich eingerichtet wurde

It Aus dem Screenshot ist ersichtlich, dass die Einrichtung erfolgreich durchgeführt wurde. a.com wurde erfolgreich auf 10.1.108.31

Konfiguration nginx.conf

befindet sich im Verzeichnis conf der Installation Verzeichnis von nginx , öffnen Sie die Datei nginx.conf und fügen Sie den folgenden Code in

ein

http Abschnitt

upstream a.com {
            server 127.0.0.1:6602;
            server 192.168.112.128:6602;
        }
server {
e


Hinweis:

2 >

Knoten, von denen einer ausgefallen ist,

nginx verteilt die Anfrage weiterhin an ihn, bis zum Timeout, ohne Antwort, und sendet sie dann zu einem anderen Knoten. Standardmäßig werden innerhalb von 1 Minuten keine weiteren Anfragen gesendet und die obige Aktion wird nach einer Minute wiederholt. Das Ergebnis ist, dass die Website manchmal schnell und manchmal langsam ist. Stellen Sie proxy_connect_timeout auf 2 Sekunden ein, um das Timeout zu verkürzen nicht zu langsam. Konfiguration speichern,

nginx

starten, a.com besuchen 1 Abbildung 2

Wie in der Abbildung oben gezeigt, habe ich zweimal

A.COM

besucht und 🎜>A Server und B Server sind Daten. Zeigt an, dass die nginx-Lastausgleichskonfiguration erfolgreich war. Nginx-Konfigurationsdetails

        listen       80;
        location / {
            proxy_pass http://a.com;      #设置反向代理的地址
            proxy_connect_timeout 2;      #代理服务器超时时间,秒
        }
user    www-data;                        #运行用户worker_processes  4;                   #启动进程,通常设置成和cpu的核数相等
worker_cpu_affinity 0001 0010 0100 1000;   #为每个进程绑定cpu内核,参考下面注解1
error_log  /var/log/nginx/error.log;   #全局错误日志pid        /var/run/nginx.pid;          #PID文件
#events模块中包含nginx中所有处理连接的设置
events {                            
   use   epoll;  #连接处理方式,参考注解2
  worker_connections  1024;    #单个后台worker process进程的最大并发链接数,不能超过最大文件打开数,最大文件打开数可以通过worker_rlimit_nofile修改。  multi_accept on;   #on:worker process一次接受所有新连接, off: 一次接受一个新的连接
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
     
    include       /etc/nginx/mime.types;       #设定mime类型,类型由mime.type文件定义
   include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    default_type  application/octet-stream;  #默认文件类型
   #charset utf-8; #默认编码
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;       #设定日志格式
    
    sendfile        on;   #开启高效文件传输模式,sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的负载.注意:如果图片显示不正常把这个改成off。
   #防止网络阻塞,两者区别参考注解3    tcp_nopush     on;
   tcp_nodelay        on;
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。    keepalive_timeout  30;                 #连接超时时间,单位秒
  #gzip模块设置  gzip on; #开启gzip压缩输出  gzip_min_length 1k; #最小压缩文件大小,大于1K才压缩  gzip_buffers 4 16k; #压缩缓冲区  gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)  gzip_comp_level 2; #压缩等级,1-10,数字越大压缩也越大  gzip_types text/plain application/x-javascript text/css application/xml;
  #压缩类型,默认就已经包含text/html,所以上面就不用再写了,写上去也不会有问题,但是会有一个warn。
  gzip_vary on;  # 和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
  gzip_disable "MSIE [1-6]\.";  #禁用IE6的gzip压缩,IE6的某些版本对gzip的压缩支持很不好,会造成页面的假死
    client_header_buffer_size    1k;    #设定请求头缓存大小    large_client_header_buffers  4 10k;  #设置用于读取大客户机请求头文件的最大数量和大小,超过则返回给客户端414或400错误。请求处理结束后缓存释放。
   #使用Nginx最大的好处就是负载均衡
   #upstream用于设置一组可以在proxy_pass指令中使用的代理服务器,默认的代理方式为轮询。    upstream mysvr {
      #设定负载均衡的服务器列表
      #server指令用于指定后端服务器的名称和参数。       server 192.168.8.1x:80  weight=5;
       server 192.168.8.2x:80  weight=1;   
       server 192.168.8.3x:80  weight=6; 
    }
   #在server内可通过proxy_pass指令设置关于反向代理的upstream服务器集群。             
   server {                
        listen       80;  #侦听192.168.8.x的80端口        server_name  192.168.8.x;
      
       location ~ .*\.aspx$ {     #对aspx后缀的进行负载均衡请求
            root   /root;             #定义服务器的默认网站根目录位置             index index.php index.html index.htm;   #定义首页索引文件的名称
             proxy_pass  http://mysvr ;                 #请求转向mysvr 定义的服务器列表
             #以下是一些反向代理的配置可删除.
             proxy_redirect off;
             #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_connect_timeout 90;     #nginx跟后端服务器连接超时时间(代理连接超时)
             proxy_send_timeout 90;        #后端服务器数据回传时间(代理发送超时)
             proxy_read_timeout 90;         #连接成功后,后端服务器响应时间(代理接收超时)
             proxy_buffer_size 4k;          #设置代理服务器(nginx)保存用户头信息的缓冲区大小             proxy_buffers 4 32k;     #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置             proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)             proxy_temp_file_write_size 64k;  #设定缓存文件夹大小,大于这个值,将从upstream服务器传
         }
   }
}
upstream mysvr {
   least-connected
  server 192.168.8.1:3128
  server 192.168.8.2:80
  server 192.168.8.3:80
}
rrreeerrreeerrreeerrree reeer errreeerrreeerrreeerrreeerrreeerrreeerrreeerrreeerrreeerrreeerrreeerrreeerrreeerrreeerrreee


Nginx-Konfigurationshinweise

1.worker_cpu_affinity

HinweiseNginx

Die Verwendung von Multi-Core-CPU ist standardmäßig nicht aktiviert,Wir können den Konfigurationsparameter worker_cpu_affinity hinzufügen, um die Vorteile von Multi-Core-CPUs voll auszuschöpfen. Die CPU ist die wichtigste Ressource für die Aufgabenverarbeitung und -berechnung. Je mehr CPU-Kerne, desto besser die Leistung. Nginx-Multi-Core-CPU, Worker_CPU_Affinity-Nutzungsmethoden und Beispiele konfigurieren

2

KernCPU, aktivieren 2 Prozesseworker_processes 2;worker_cpu_affinity 01 10;

01 bedeutet, den ersten CPU--Kern zu aktivieren, 10 bedeutet, den zweiten CPU-Kern zu aktivieren
worker_cpu_affinity 01 10 bedeutet, zwei Prozesse zu starten, der erste Prozess entspricht dem ersten CPU-Kern, und der zweite Prozess entspricht dem zweiten CPU-Kern.

2Kern-CPU, 4 Prozesse öffnen
worker_processes 4;
worker_cpu_affinity 01 10 01 10;

öffnet vier Prozesse, die jeweils dem Öffnen von 2CPU-Kernen

4Kern-CPU, Konto 4 Prozesseworker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;

0001 bedeutet die Aktivierung des ersten CPU--Kerns, 0010 bedeutet die Aktivierung des zweiten CPU-Kerns und so weiter

4 Kern-CPU, 2 Prozesse starten worker_processes 2;
worker_cpu_affinity 0101 1010;

0101 bedeutet Einschalten des ersten und dritten Kerns, 1010 bedeutet Einschalten des zweiten und vierten Kerns2 Prozesse entsprechen vier Kernen
worker_cpu_affinity-Konfiguration wird in /etc/nginx/nginx.conf geschrieben.
2 Kerne sind 01, 4 Kerne sind 0001 und 8 Kerne sind 00000001. Abhängig von der Anzahl der Kerne gibt es mehrere Ziffern: 1 bedeutet, dass der Kern eingeschaltet ist, 0 bedeutet, dass der Kern ausgeschaltet ist.

8Kern-CPU, Konto 8 Prozesse worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 0010000001000000;

0001 bedeutet die Aktivierung des ersten CPU Kerns, 0010 bedeutet die Aktivierung des zweiten CPU-Kerns usw. Maximal 8 worker_processes können geöffnet werden. Die Leistungsverbesserung von mehr als 8 wird nicht verbessert und die Stabilität wird geringer, sodass 8 Prozesse ausreichen.

2.Verbindungsverarbeitungsmethode

nginx unterstützt mehrere Verbindungsverarbeitungsmethoden Welche Methode verwendet wird, hängt vom verwendeten System ab. Wenn das System mehrere Methoden unterstützt, wählt nginx automatisch die effizienteste Methode aus. Bei Bedarf kann die zu verwendende Methode über die use-Direktive angegeben werden.

wählen:

1.SockelMengenbegrenzung: Die Anzahl der in diesem Modus betreibbaren Sockets wird durch FD_SETSIZE, Der Kernel-Standard ist 32*32=1024 2.
Betriebseinschränkungen
:Durch Durchqueren von FD_SETSIZE( 1024)Socket zum Abschließen der Planung, egal welcher Socket ist aktiv , wird überall durchlaufen

Umfrage:

1.SteckdoseFast keine Menge Einschränkung:Der entsprechende Socket ist in diesem Modus ein Array, das speichert > keine Größenbeschränkung ( standardmäßig 4k 2.Betriebseinschränkungen:
Gleiche wie
Auswählen 🎜>oder höher1.Steckdose

Unbegrenzte Menge:Gleiches als

Umfrage 2.Unbegrenzter Betrieb

:

Basierend auf dem vom Kernel bereitgestellten Reflexionsmodus ,Wenn ein aktiver Socket vorhanden ist,
greift der Kernel auf den Sockets Rückruf, muss die Abfrage nicht durchlaufen .kqueue : unterscheidet sich nicht wesentlich von epoll, das Prinzip ist das gleiche und wird im verwendet Betriebssystem:FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 und MacOS X

wählenDer Grund für die Ineffizienz des Modus
wählen
Der Grund für die Ineffizienz des Modus ist Select wird durch die Definition bestimmt und hat nichts mit der Betriebssystemimplementierung zu tun. Jeder Kernel muss bei der Implementierung von select ein Round-Robin durchführen um diese zu kennen Socket verbraucht dies CPU. Darüber hinaus, wenn Sie über eine große Sammlung von Steckdosen verfügen, obwohl nur ein kleiner Teil der Steckdosen überhaupt vorhanden ist einmal "Aktiv", aber jedes Mal müssen Sie alle Buchsen ausfüllen Die Eingabe eines FD_SET verbraucht ebenfalls etwas CPU, und wenn auswählenNach der Rückkehr , müssen Sie möglicherweise Kontextzuordnung durchführen, was sich auch auf die Leistung auswirkt, select ist relativ ineffizient als epoll. Das anwendbare Szenario für epoll
ist, dass es eine große Anzahl von Sockets gibt, die Aktivität jedoch nicht sehr hoch ist.

3.tcp_nodelay und tcp_nopushUnterschiede

tcp_nodelay

Nginx Die Option TCP_NODELAY ermöglicht das Öffnen eines neuen Hinzugefügt TCP_NODELAYOption für Socket.

Dies führt jedoch zu einer Situation:

Die Terminalanwendung sendet jedes Mal ein Paket, wenn ein Vorgang ausgeführt wird, und unter typischen Umständen ein Paket wird ein Byte Daten und einen 40 Bytes langen Header haben, was zu einer 4000 % Überlastung führt, die sehr leicht zu einem Netzwerk führen kann Stau.

Um dies zu vermeiden, ist der TCP-Stack so implementiert, dass er auf Daten 0,2 wartet Daher wird nach dem Vorgang kein Datenpaket gesendet, sondern die Daten innerhalb dieses Zeitraums in ein großes Paket gepackt.

Dieser Mechanismus wird durch den Nagle-Algorithmus garantiert.

Nagle wurde später zum Standard und wurde sofort im Internet implementiert. Dies ist jetzt die Standardkonfiguration, aber es gibt Situationen, in denen es wünschenswert ist, diese Option zu deaktivieren.

Stellen Sie sich nun vor, dass eine Anwendung eine Anfrage stellt und kleine Datenblöcke senden möchte. Wir können die Daten sofort senden oder warten, bis weitere Daten generiert werden, und sie dann erneut senden.

Interaktive sowie clientbasierte / serverbasierte Anwendungen profitieren stark, wenn wir Daten sofort senden. Wenn die Anfrage sofort gestellt wird, ist die Antwortzeit schneller.

Der obige Vorgang kann durchgeführt werden, indem die Option TCP_NODELAY = on des Sockets gesetzt und so Nagle Algorithmus.

Eine andere Situation erfordert, dass wir warten, bis die Datenmenge das Maximum erreicht, bevor wir alle Daten auf einmal über das Netzwerk senden. Diese Datenübertragungsmethode ist von Vorteil Die Kommunikation großer Datenmengen, eine typische Anwendung ist ein Dateiserver.

Nginx verwendet TCP_NODELAY in der Verbindung von Keepalive . keepalive Die Verbindung bleibt bestehen, nachdem Daten gesendet wurden, und ermöglicht auch das Senden weiterer Daten darüber.

Auf diese Weise können Sie viele weniger Sock-Verbindungen und den Drei-Wege-Handshake-Prozess für jede Verbindung instanziieren.

tcp_nopush

in nginx , tcp_nopush Konfiguration und tcp_nodelay schließen sich gegenseitig aus. Es kann die Paketgröße der gleichzeitig gesendeten Daten konfigurieren.

Mit anderen Worten: Es werden keine Pakete gesendet, nachdem sie sich zeitlich auf 0,2 Sekunden angesammelt haben, sondern wenn die Pakete eine bestimmte Größe erreicht haben . .

In nginx muss tcp_nopush mit sendfile Verwendung mit .

4.Lastausgleich

nginx

unterstützt Folgendes Lastausgleichsmechanismus:

1

) Round-Robin: Abfrage. Verteilen Sie Anfragen im Polling-Verfahren an verschiedene Server.

2least-connected:最少连接数。将下一个请求分配到连接数最少的那台服务器上。

3ip-hash :基于客户端的IP地址。散列函数被用于确定下一个请求分配到哪台服务器上。

在一些要求需要更长的时间才能完成的应用情况下,最少连接可以更公平地控制应用程序实例的负载。使用最少连接负载均衡,nginx不会向负载繁忙的服务器上分发请求,而是将请求分发到负载低的服务器上。配置如下:


upstream mysvr {
   least-connected
  server 192.168.8.1:3128
  server 192.168.8.2:80
  server 192.168.8.3:80
}

Das obige ist der detaillierte Inhalt vonNginx-Lastausgleichsstrategie und -konfiguration. 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