9

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

connect() 到 upstreamip:80 失败(99:无法分配请求的地址)
连接上游时,客户端:xxx.xxx.xxx.xxx,服务器:localhost,
请求:“GET / HTTP/1.1”,上游:“http://upstreamip:80/”,
主机:“requesteddomain.com”

并不是所有的请求都会产生这个错误,所以我怀疑它与服务器的负载和它所达到的某种限制有关。

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

4

3 回答 3

20

好像我刚刚找到了我自己的问题的解决方案:通过分配更多传出端口

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

解决了这个问题。

于 2013-01-03T18:32:07.683 回答
3

每个 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 地址。

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

于 2017-04-12T15:30:36.793 回答
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
于 2014-11-03T05:41:56.067 回答