【问题标题】:nginx proxy: connect() to ip:80 failed (99: Cannot assign requested address)nginx 代理:connect() 到 ip:80 失败(99:无法分配请求的地址)
【发布时间】:2013-01-03 17:52:34
【问题描述】:

在 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 打开与其上游服务器的更多连接?

【问题讨论】:

    标签: nginx


    【解决方案1】:

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

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

    解决了问题。

    【讨论】:

    • 您还可以通过将net.ipv4.ip_local_port_range = 10240 65535 行添加到/etc/sysctl.conf 并调用sudo sysctl -p 来使此更改持久化
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-12
      • 2019-10-11
      • 2023-03-11
      • 2017-09-13
      • 1970-01-01
      • 2018-04-27
      • 2021-05-26
      • 1970-01-01
      相关资源
      最近更新 更多