nginx代理:connect()到ip:80失败(99:无法分配请求的地址)

时间:2013-01-03 17:52:34

标签: nginx

在Debian 6.0.1上作为代理运行的nginx / 1.0.12在运行一小段时间后开始抛出以下错误:

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"

并非所有请求都会产生此错误,因此我怀疑它与服务器的负载和某种限制有关。

我尝试过将ulimit -n提高到50k,将worker_rlimit_nofile提升到50k,但这似乎没有帮助。 lsof -n为nginx显示总共1200行。 传出连接是否存在系统限制,可能会阻止nginx打开与其上游服务器的更多连接?

3 个答案:

答案 0 :(得分:14)

似乎我刚刚找到了我自己的问题的解决方案:通过

分配更多的传出端口
echo "10240 65535" > /proc/sys/net/ipv4/ip_local_port_range

解决了这个问题。

答案 1 :(得分:1)

每个TCP连接必须具有唯一的四重source_ip:source_port:dest_ip:dest_port

source_ip很难改变,source_port是从ip_local_port_range中选择的,但不能超过16位。剩下要调整的另一件事是dest_ip和/或dest_port。因此,为您的上游服务器添加一些IP别名:

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

其中ip1,ip2和ip3是同一服务器的不同IP地址。

或者让您的上游监听更多端口可能更容易。

答案 2 :(得分:0)

修改/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)

运行:

sysctl -p