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

bjg7j2ky  于 2023-03-29  发布在  Nginx
关注(0)|答案(4)|浏览(254)

在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提高到50 k,将worker_rlimit_nofile也提高到50 k,但似乎没有帮助。lsof -n显示nginx总共有1200行。是否有系统限制传出连接,可能会阻止nginx打开更多连接到其上游服务器?

h7wcgrx3

h7wcgrx31#

似乎我找到了自己问题的答案:通过分配更多传出端口

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

解决了问题。

aydmsdu9

aydmsdu92#

每个TCP连接都必须具有唯一的四重源IP:源端口:目的IP:目的端口
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; }
其中ip 1、ip 2和ip 3是同一服务器的不同IP地址。
或者让您的上游侦听更多端口可能更容易。

r8xiu3jd

r8xiu3jd3#

修改/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
6psbrbz9

6psbrbz94#

在Docker compose中接受的答案:

version: "3.9"
services:
  nginx_proxy:
    build:
      context: ./src/proxy
    sysctls:
      net.ipv4.ip_local_port_range: "10240 65535"

相关问题