Vorwort

Die Proxy- und Load-Balancing-Funktionen von Nginx werden am häufigsten verwendet. Die grundlegende Syntax und Konfiguration von nginx wurden bereits inDetaillierte Nginx-Konfigurationbeschrieben. Dieser Artikel kommt direkt zur Sache: Zuerst werden proxybezogene Konfigurationen beschrieben, dann wird Load Balancing im Detail erklärt.

Hinweise zur Konfiguration des Nginx-Proxydienstes

1. Weiterleitungsadresse der 404-Seite festlegen

error_page 404 https://www.runnob.com; #错误页
proxy_intercept_errors on;    #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off.

2. Wenn unser Proxy nur eine der Request-Methoden GET oder POST zulässt

proxy_method get;    #支持客户端的请求方法。post/get;

3. Unterstützte HTTP-Protokollversion festlegen

proxy_http_version 1.0 ; #Nginx服务器提供代理服务的http协议版本1.0,1.1,默认设置为1.0版本

4. Wenn Ihr nginx-Server als Proxy für zwei Webserver mit dem Round-Robin-Load-Balancing-Algorithmus dient und IIS auf einem Ihrer Rechner heruntergefahren wird, sodass der Webdienst nicht erreichbar ist, verteilt der nginx-Server weiterhin Anfragen an diesen nicht erreichbaren Webserver. Wenn die Antwortzeit der Verbindung zu lang ist, wartet die Seite des Clients weiterhin auf eine Antwort, was die Benutzererfahrung stark beeinträchtigt. Wie können wir diese Situation vermeiden? Hier habe ich ein Diagramm beigefügt, um das Problem zu veranschaulichen.

Wenn web2 in der Load-Balancing-Konfiguration auf eine solche Situation stößt, ruft nginx zuerst web1 auf, aber bei unsachgemäßer Konfiguration verteilt nginx weiterhin Anfragen an web2 und wartet auf die Antwort von web2, bis die Antwort ein Zeitlimit überschreitet, und leitet die Anfrage dann erneut an web1 weiter. Wenn die Antwortzeit zu lang ist, wartet der Benutzer noch länger.

Die folgende Konfiguration ist eine der Lösungen.

proxy_connect_timeout 1;   #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_ignore_client_abort on;  #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off.

5. Wenn Sie die upstream-Direktive verwenden, um eine Gruppe von Servern als Proxy-Server zu konfigurieren, folgt der Zugriffsalgorithmus unter den Servern den konfigurierten Load-Balancing-Regeln. Darüber hinaus kann diese Direktive verwendet werden, um zu konfigurieren, unter welchen anormalen Bedingungen Anfragen der Reihe nach an die nächste Gruppe von Servern übergeben werden sollen.

proxy_next_upstream timeout;  #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。

Statuswerte können sein: error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off

  • error: Ein Serverfehler tritt auf, wenn eine Verbindung hergestellt, eine Anfrage an den Zielserver gesendet oder Antwortinformationen gelesen werden.
  • timeout: Ein Timeout tritt auf, wenn eine Verbindung hergestellt, eine Anfrage an den Zielserver gesendet oder Antwortinformationen gelesen werden.
  • invalid_header: Der vom Zielserver zurückgegebene Antwort-Header ist fehlerhaft.
  • off: Anfragen können nicht an den Zielserver verteilt werden.
  • http_400, ...: Die vom Zielserver zurückgegebenen Statuscodes sind 400, 500, 502 usw.

6. Wenn Sie die echte IP des Clients über HTTP anstelle der IP-Adresse des Proxy-Servers ermitteln möchten, müssen Sie die folgenden Einstellungen vornehmen.

proxy_set_header Host $host; #只要用户在浏览器中访问的域名绑定了 VIP VIP 下面有RS;则就用$host ;host是访问URL中的域名和端口  www.taobao.com:80
proxy_set_header X-Real-IP $remote_addr;  #把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中 $X-Real-IP来获取 源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源IP

Zu verwandten Artikeln über X-Forwarded-For und X-Real-IP siehe:X-Forwarded-For in HTTP-Anfrage-Headern 。

7. Nachfolgend ein Teil meiner Konfigurationsdatei für die Proxy-Einrichtung, nur als Referenz.

include       mime.types;   #文件扩展名与文件类型映射表
default_type  application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志    
log_format myFormat ' $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat;  #combined为日志格式的默认值
sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。
proxy_connect_timeout 1;   #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_http_version 1.0 ; #Nginx服务器提供代理服务的http协议版本1.0,1.1,默认设置为1.0版本。
#proxy_method get;    #支持客户端的请求方法。post/get;
proxy_ignore_client_abort on;  #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off.
proxy_ignore_headers "Expires" "Set-Cookie";  #Nginx服务器不处理设置的http相应投中的头域,这里空格隔开可以设置多个。
proxy_intercept_errors on;    #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off.
proxy_headers_hash_max_size 1024; #存放http报文头的哈希表容量上限,默认为512个字符。
proxy_headers_hash_bucket_size 128; #nginx服务器申请存放http报文头的哈希表容量大小。默认为64个字符。
proxy_next_upstream timeout;  #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
#proxy_ssl_session_reuse on; 默认为on,如果我们在错误日志中发现“SSL3_GET_FINSHED:digest check failed”的情况时,可以将该指令设置为off.

Nginx-Lastverteilung erklärt

Im ArtikelDetaillierte Nginx-Konfigurationhabe ich die in nginx verfügbaren Lastverteilungsalgorithmen erwähnt. In diesem Abschnitt werde ich ausführlich erklären, wie man sie konfiguriert.

Lassen Sie mich zunächst die upstream-Direktive erklären. Diese Direktive wird verwendet, um eine Gruppe von Zielserver-Adressen zu definieren und dann den Lastverteilungsalgorithmus zu konfigurieren. Die Zielserver-Adressen können auf zwei Arten geschrieben werden.

upstream mysvr { 
    server 192.168.10.121:3333;
    server 192.168.10.122:3333;
}
server {
    ....
    location  ~*^.+$ {         
        proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表         
    }
}

Dann kommen wir zu ein paar praktischen Dingen.

1. Hot-Standby: Wenn Sie 2 Server haben, wird der zweite Server nur aktiviert, wenn beim ersten Server ein Fehler auftritt. Die Reihenfolge, in der die Server Anfragen bearbeiten: AAAAAA, dann fällt A plötzlich aus, BBBBBBBBBBBBBB.....

upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333 backup;  #热备     
}

2. Round-Robin: nginx verwendet standardmäßig Round-Robin mit einem Standardgewicht von 1 für alle Server. Die Reihenfolge, in der die Server Anfragen bearbeiten: ABABABABAB....

upstream mysvr { 
    server 127.0.0.1:7878;
    server 192.168.10.121:3333;       
}

3. Gewichtetes Round-Robin: Anfragen werden gemäß dem konfigurierten Gewicht in unterschiedlichen Mengen auf verschiedene Server verteilt. Wenn nicht festgelegt, ist das Standardgewicht 1. Die Anfragereihenfolge für die unten stehenden Server ist: ABBABBABBABBABB....

upstream mysvr { 
    server 127.0.0.1:7878 weight=1;
    server 192.168.10.121:3333 weight=2;
}

4. ip_hash: nginx leitet Anfragen von derselben Client-IP an denselben Server weiter.

upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333;
    ip_hash;
}

5. Wenn Sie die oben genannten 4 Lastverteilungsalgorithmen nicht ganz verstehen, können Sie aufDetaillierte Nginx-Konfigurationverweisen, was das Verständnis erleichtern kann.

An diesem Punkt haben Sie vielleicht das Gefühl, dass die Load-Balancing-Konfiguration von nginx besonders einfach und leistungsstark ist. Aber wir sind noch nicht fertig. Fahren wir fort, und hier schweife ich ein wenig ab.

Erklärung einiger Statusparameter in der nginx-Load-Balancing-Konfiguration.

  • down: Gibt an, dass der aktuelle Server vorübergehend nicht am Load-Balancing teilnimmt.

  • backup: Reservierte Backup-Maschine. Sie wird nur angefordert, wenn alle anderen Nicht-Backup-Maschinen ausfallen oder ausgelastet sind, daher hat diese Maschine die geringste Last.

  • max_fails: Die Anzahl zulässiger Anfragefehler, Standard ist 1. Wenn die maximale Anzahl überschritten wird, wird der vom proxy_next_upstream-Modul definierte Fehler zurückgegeben.

  • fail_timeout: Die Zeit, um den Dienst nach max_fails Fehlern zu pausieren. max_fails kann zusammen mit fail_timeout verwendet werden.

upstream mysvr { 
    server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
    server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;    
}

An diesem Punkt kann man mit Sicherheit sagen, dass die in nginx integrierten Lastverteilungsalgorithmen alle behandelt wurden. Wenn du die Lastverteilungsalgorithmen von nginx tiefer verstehen möchtest, stellt nginx offiziell einige Plugins bereit, die du erkunden kannst.

URL des Originalartikels: https://www.cnblogs.com/knowledgesea/p/5199046.html