2013-01-03 15 views
5

Nginx/1.0.12 działający jako proxy na Debianie 6.0.1 zaczyna wyświetlać następujący błąd po uruchomieniu przez krótki czas:proxy nginx: connect() do ip: 80 nie powiodło się (99: Nie można przypisać żądanego adresu)

 
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" 

Nie wszystkie żądania powodują ten błąd, więc podejrzewam, że ma to związek z obciążeniem serwera i pewnym limitem, który został osiągnięty.

Próbowałem podnieść ulimit -n do 50k i worker_rlimit_nofile również do 50k, ale to nie wydaje się pomóc. lsof -n pokazuje w sumie 1200 linii dla nginx. Czy istnieje limit systemowy dla połączeń wychodzących, który może uniemożliwić Nginxowi otwarcie większej liczby połączeń z serwerem nadrzędnym?

Odpowiedz

11

Wydaje się po prostu znaleźć rozwiązanie do mojego pytania: Przydzielenie więcej portów wychodzących poprzez

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

rozwiązało problem.

0

modyfikować /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

Nie jestem pewien, czy to by pomogło, ponieważ problem nie był atakiem DOS skutkującym dużą ilością TIME_WAIT, ale tylko ogromną liczbą regularnego ruchu, który miał przejść i nie został zabity z szybszym TIME_WAIT timeout . – mariow

+0

@mariow, na moim serwerze istnieje ogromna ilość żądań wychodzących (robota), więc szybkie ponowne użycie TIME_WAIT jest essenstialem. – diyism

+1

net.ipv4.tcp_tw_recycle jest uszkodzony i został usunięty z systemu Linux 4.12: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4396e46187ca5070219b81773c4e65088dac50cc ponowne użycie jest również niebezpieczne: https://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux Lepiej nie używać tych opcji. – pva

1

Każde połączenie TCP musi mieć unikatowy poczwórne source_ip: source_port: dest_ip: dla połączeń wychodzących

source_ip jest trudne do zmiany, port_źródłowy jest wybierany z adresu ip_local_port_range, ale nie może mieć więcej niż 16 bitów. Inną rzeczą wymagającą dostosowania jest dest_ip i/lub dest_port. Więc dodać kilka aliasów IP dla serwera nadrzędnego:

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

Gdzie IP1, IP2 oraz IP3 są różne adresy IP dla tego samego serwera.

Lub może być łatwiejsze, aby Twój kanał źródłowy nasłuchiwał na większej ilości portów.

Powiązane problemy