2013-01-03 13 views
5

Un nginx/1.0.12 eseguito come proxy su Debian 6.0.1 inizia a generare il seguente errore dopo l'esecuzione per un breve periodo:proxy nginx: connect() a ip: 80 non riuscito (99: impossibile assegnare l'indirizzo richiesto)

 
connect() to upstreamip:80 failed (99: Cannot assign requested address) 
while connecting to upstream, client: xxx.xxx.xxx.xxx, server: localhost, 
request: "GET/HTTP/1.1", upstream: "http://upstreamip:80/", 
host: "requesteddomain.com" 

Non tutte le richieste producono questo errore, quindi sospetto che abbia a che fare con il carico del server e qualche tipo di limite.

Ho provato alzando ulimit -n a 50k e 50k worker_rlimit_nofile a pure, ma che non sembra aiutare. lsof -n mostra un totale di 1200 linee per nginx. Esiste un limite di sistema sulle connessioni in uscita che potrebbe impedire a nginx di aprire più connessioni al suo server upstream?

risposta

11

Sembra come ho appena trovato la soluzione alla mia domanda: Assegnazione porte più in uscita tramite

echo "10240 65535" > /proc/sys/net/ipv4/ip_local_port_range 

ha risolto il problema.

0

modificare /etc/sysctl.conf:

net.ipv4.tcp_timestamps=1 
net.ipv4.tcp_tw_recycle=0 
net.ipv4.tcp_tw_reuse=1 
net.ipv4.tcp_max_tw_buckets=10000  #after done this: local ports decrease from 26000 to 6000(netstat -tuwanp | awk '{print $4}' | sort | uniq -c | wc -l) 

run:

sysctl -p 
+0

io non sono sicuro se questo avrebbe aiutato perché il problema non è stato un attacco DOS con conseguente in un sacco di TIME_WAIT, ma solo un numero enorme di traffico regolare che avrebbe dovuto passare attraverso e non essere ucciso con un timeout più veloce TIME_WAIT . – mariow

+0

@mariow, sul mio server, ci sono enormi quantità di richieste in uscita (crawler), quindi il riutilizzo TIME_WAIT è veloce. – diyism

+1

net.ipv4.tcp_tw_recycle è rotto ed è stato rimosso da Linux 4.12: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4396e46187ca5070219b81773c4e65088dac50cc il riutilizzo è pericoloso: https://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux Meglio non usare queste opzioni. – pva

1

Ogni connessione TCP deve avere un unico source_ip quadrupla: SOURCE_PORT: dest_ip: dest_port

source_ip è difficile da cambiare, source_port è scelto da ip_local_port_range ma non può essere più di 16 bit. L'altra cosa lasciata da aggiustare è dest_ip e/o dest_port. Quindi aggiungere alcuni alias IP per il server upstream:

upstream foo { server ip1:80; server ip2:80; server ip3:80; }

Dove IP1, IP2 e IP3 sono diversi indirizzi IP per lo stesso server.

Oppure potrebbe essere più semplice avere l'ascolto upstream su più porte.

Problemi correlati