English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Dettagli sulla funzione di proxy e bilanciamento del carico di Nginx

Premessa

La funzione di proxy e la funzione di bilanciamento del carico di Nginx sono le più utilizzate, le conoscenze di base della sintassi e della configurazione di nginx sono state descritte nell'articolo precedente, questo articolo affronta direttamente il punto, descrive prima alcune configurazioni della funzione di proxy e poi spiega in dettaglio la bilanciamento del carico.

Descrizione della configurazione del servizio di proxy Nginx

1、Nell'articolo precedente abbiamo la seguente configurazione nel modulo http, quando il proxy incontra un codice di stato 404, reindirizziamo la pagina 404 a Baidu.

error_page 404 https://www.baidu.com; # pagina di errore

Tuttavia, questa configurazione, l'amico attento può notare che non funziona

Se vogliamo che funzioni, dobbiamo usarlo insieme alla configurazione seguente

proxy_intercept_errors on;    # Se lo stato di risposta del server proxy è 400 o superiore a 400, viene attivata la configurazione di error_page. Di default è off.

2, se il nostro proxy accetta solo metodi di richiesta get, post

proxy_method get;  # Supporta i metodi di richiesta del client. post/get;

3, impostare la versione del protocollo http supportata

proxy_http_version 1.0 ; # La versione del protocollo http fornita dal server Nginx per il servizio proxy è 1.0, 1.1, impostata di default a 1.0

4, se il server nginx fa da proxy a 2 server web e l'algoritmo di bilanciamento del carico utilizzato è il polling, allora quando un macchina web programma iis viene chiuso, ossia web non può essere acceduto, il server nginx continuerà a distribuire le richieste a questo server web non accessibile, se il tempo di connessione di risposta è troppo lungo, ciò può causare che la pagina del client attenda la risposta ininterrottamente, riducendo l'esperienza utente. Come possiamo evitare questo tipo di situazione? Ecco una figura per illustrare il problema.

 

 Se in un carico di bilanciamento web2 si verifica questo tipo di situazione, nginx cercherà prima di richiedere a web1, ma se la configurazione non è corretta, continuerà a distribuire le richieste a web2, aspettando la risposta di web2 fino a quando il tempo di risposta non supera il limite, quindi redistribuirà la richiesta a web1. Se il tempo di risposta è troppo lungo, il tempo di attesa dell'utente sarà più lungo. Se il tempo di risposta è troppo lungo, l'utente aspetterà più a lungo.

La seguente configurazione è una delle soluzioni.

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, se si configura un gruppo di server come server proxy con l'istruzione upstream, l'algoritmo di accesso nei server segue le regole di bilanciamento del carico configurate, e si può anche configurare questa istruzione per gestire le richieste in sequenza in caso di alcune eccezioni.

proxy_next_upstream timeout; # Valore di stato restituito dal server proxy quando il gruppo di server upstream ha un problema. error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off

  • error: durante la creazione della connessione o l'invio della richiesta al server proxy o la lettura delle informazioni di risposta, si è verificato un errore nel server.
  • timeout: durante la creazione della connessione, l'invio della richiesta al server proxy o la lettura delle informazioni di risposta, il server si è verificato un timeout.
  • invalid_header: l'intestazione di risposta restituita dal server proxy è anormale.
  • off: impossibile distribuire la richiesta al server proxy.
  • http_400,....: lo stato di risposta restituito dal server proxy è 400, 500, 502, ecc.

6、Se si desidera ottenere l'IP reale del cliente tramite http invece di ottenere l'indirizzo IP del server proxy, effettuare la seguente configurazione.

proxy_set_header Host $host; # Se l'host visitato dal browser è abbinato a VIP VIP con RS sottostante, utilizza $host; l'host è il dominio e il porto dell'URL di accesso www.taobao.com:80
proxy_set_header X-Real-IP $remote_addr; # Assegna all'X-Real-IP l'IP sorgente 【$remote_addr, informazioni header HTTP che stabiliscono la connessione】; così nel codice si può ottenere l'IP sorgente con $X-Real-IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#Quando nginx è un server proxy, l'elenco degli IP impostato, registrerà l'IP del computer che passa e l'IP del proxy, separati da 【,】; nel codice si utilizza echo $x-forwarded-for |awk -F, '{print $1}' come IP sorgente

Riguardo agli articoli su X-Forwarded-For e X-Real-IP, vi consiglio un amico blogger: X-Forwarded-For nella intestazione HTTP, questo blogger ha una serie di articoli su http protocol, vi consiglio di seguirli.

7、Ecco una parte di un file di configurazione di proxy che ho creato, da utilizzare solo a titolo di esempio.

  include    mime.types;  # Tabella di mappatura tra estensioni dei file e tipi di file
  default_type application/octet-stream; # Tipo di file predefinito, il valore predefinito è text/plain
  #access_log off; # Disattiva i log di servizio del server  
  log_format myFormat ' $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; # Formato personalizzato
  access_log log/access.log myFormat; #combined è il valore predefinito per il formato dei log
  sendfile on;  # Permette di trasmettere file tramite sendfile, il valore predefinito è off, può essere impostato nei blocchi 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; Il valore predefinito è on, se troviamo la situazione di 'SSL3_GET_FINSHED: digest check failed' nel log di errore, possiamo impostare questa istruzione su off.

Dettagli di bilanciamento del carico di Nginx

Nell'articolo precedente ho menzionato quali sono gli algoritmi di bilanciamento del carico di nginx. In questo capitolo, farò una spiegazione dettagliata di come configurare.

Per prima cosa, voglio spiegare la configurazione di upstream, questa configurazione è scrivere un elenco di indirizzi dei server da代理, quindi configurare l'algoritmo di bilanciamento del carico. I metodi di scrittura degli indirizzi dei server da代理 in questo caso sono due.

upstream mysvr { 
   server 192.168.10.121:3333;
   server 192.168.10.122:3333;
  }
 server {
    ....
    location ~*^.+$ {     
      proxy_pass http://mysvr; # reindirizza le richieste a mysvr elencati nel server     
    } 
upstream mysvr { 
   server http://192.168.10.121:3333;
   server http://192.168.10.122:3333;
  }
 server {
    ....
    location ~*^.+$ {     
      proxy_pass mysvr; # reindirizza le richieste a mysvr elencati nel server     
    } 

Poi, passiamo a qualcosa di pratico.

1, backup caldo: se hai due server, quando uno dei server si guasta, viene attivato il secondo server per fornire servizi. L'ordine di gestione delle richieste è: AAAAA poi A si guasta, BBBBBBBBBBB.....

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

2, round-robin: nginx utilizza per default il round-robin, con tutti i pesi impostati a 1 per default, l'ordine di gestione delle richieste dai server è: ABABABABAB....

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

3, round-robin pesato: distribuisce un numero diverso di richieste a diversi server in base alla dimensione della ponderazione configurata. Se non viene impostato, il valore predefinito è 1. L'ordine delle richieste del server è: ABBABBABBABBABB....

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

4, ip_hash: nginx farà in modo che lo stesso client IP riceva richieste dallo stesso server.

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

5, se non capisci bene i quattro algoritmi di bilanciamento del carico sopra menzionati, ti prego di leggere l'immagine che ho configurato nell'articolo precedente, potrebbe essere più facile da capire.

Arrivato qui, non ti senti che la configurazione di bilanciamento del carico di nginx è particolarmente semplice e potente? Allora non è tutto, continuiamo, qui stiamo facendo una piccola digressione.

Spiegazione di alcuni parametri di stato relativi alla configurazione del bilanciamento del carico di nginx.

  • down, indica che il server attuale non partecipa temporaneamente al bilanciamento del carico.
  • backup, macchina di riserva. Quando tutte le altre macchine non di riserva incontrano problemi o sono occupate, verrà richiesto il server di riserva, quindi la pressione su questa macchina è la più leggera.
  • max_fails, il numero di tentativi di richiesta permessi di fallimento, predefinito a 1. Quando supera il numero massimo, restituisce l'errore definito dal modulo proxy_next_upstream.
  • fail_timeout, il tempo di sospensione del servizio dopo aver superato max_fails di fallimenti. Può essere utilizzato insieme a fail_timeout.
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;  
  }

A questo punto, possiamo dire che l'algoritmo di bilanciamento del carico integrato di nginx è finito. Se vuoi conoscere meglio l'algoritmo di bilanciamento del carico di nginx, puoi consultare alcune estensioni fornite ufficialmente da nginx.

Questo è tutto il contenuto dell'articolo, spero che sia utile per la tua apprendimento, e ti prego di supportare e gridare le lezioni.

Dichiarazione: il contenuto di questo articolo è stato prelevato da Internet, il copyright è dell'autore originale, il contenuto è stato contribuito autonomamente dagli utenti di Internet e caricato autonomamente, il sito web non possiede il diritto di proprietà, non è stato elaborato manualmente e non assume responsabilità per le relative responsabilità legali. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare e fornire prove pertinenti. Una volta verificata, il sito web eliminerà immediatamente i contenuti sospetti di violazione del copyright.

Ti potrebbe interessare