欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

自己亲自做的 502 Bad Gateway 有大用 有大大用 有大大大用

原来是有一个 ajax 的 date  每秒钟循环一次,,导致 请求太多,吃不消

我的做法是 把这个 ajax 请求删掉就可以了 


nginx的   错误日志   error.log

127.0.0.1:88 failed (99: Cannot assign requested address) while connecting to upstream




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

连接()到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 个回答

24

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

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

解决了问题。


Nginx:99:无法为上游分配请求的地址

几天前,我遇到了以下有趣的 Nginx 错误消息。


[crit] 12889#0: *32401195 connect() 到 127.0.0.1:80 在连接到上游时失败(99:无法分配请求的地址)

1.

我的配置非常简单。这是一个 Nginx 代理,它完成所有 SSL 加密并将流量发送到 Varnish 实例,在本地主机上的端口 :80 上运行。这里最重要的一点是它是一个相当高流量的 Nginx 代理。


即使  在nginx上游启用keepalive后,出现错误。但这是什么意思呢?


TCP 端口和限制

除了服务器之外,偶尔了解一两点有关网络的知识也是很有好处的。出现该问题的原因是服务器无法足够快地获得空闲 TCP 端口来建立到 的连接 127.0.0.1。


$ ss -s

总计:3130(内核 3431)

TCP:51582(estab 2866、关闭 48611、孤立 92、synrecv 0、timewait 48611/0)、端口 35279


这  ss 工具为您提供服务器上套接字/端口的统计信息。在本例中,我有 51.582 个 TCP 会话正在使用(活动的、关闭的、等待关闭的……)。


普通服务器大约有 28.000 个可能的 TCP 端口,可用于与远程(或本地)系统建立 TCP 连接。通过 IP 地址进行通信的所有内容都会从此范围中选择一个空闲端口作为传出连接的源端口。该端口范围由 sysctl 参数定义 ip_local_port_range 。


$ cat /proc/sys/net/ipv4/ip_local_port_range

3276861000


$ sysctl net.ipv4.ip_local_port_range

net.ipv4.ip_local_port_range = 32768 61000


格式为“最小最大”端口。因此 61000 – 32768 = 28 232 个可用源端口。


连接到本地主机上运行的 Varnish 实例的 nginx SSL 代理在您的 netstat.


$ netstat -anp | $ netstat -anp | 抢127.0.0.1

...

tcp 0 0 127.0.0.1:37713 127.0.0.1:80 TIME_WAIT -


这里的关键要点 127.0.0.1:37713 是连接到其端点的 源连接127.0.0.1:80。对于每个源连接,都会从参数的范围中选择一个新的 TCP 源端口 ip_local_port_range 。


源 IP、源端口、目标 IP 和目标 IP 的组合必须是唯一的。 这就是网络术语中所说的 四元组。您可能无法(轻松)更改源 IP。源端口是动态选择的。只剩下目标 IP 和目标端口可以自由使用。


解决源端口限制

有几个简单的修复方法。首先, ip_local_port_range 可以在 Linux 机器上增加(更多阅读材料,请参见  增加 Linux 中的 ip_local_port_range TCP 端口范围)。


$ echo 15000 64000 > /proc/sys/net/ipv4/ip_local_port_range

1.

这有效地将总端口范围从默认的 28 232 个端口增加到 49 000 个端口。


如果这还不够,您可以添加更多目标 IP 进行连接。请记住,每个连接由 4 个部分(称为 四元组)组成,其中包括源 IP 和源端口、目标 IP 和目标端口。如果无法更改源端口或 IP,只需更改目标 IP。


考虑 Nginx 中的这种上游定义;


上游清漆{

  服务器127.0.0.1:80;

}


这样的定义可以在您的 nginx 配置中使用该 proxy_pass 指令。


服务器 {

  听443;

  ...

  地点 / {

    proxy_pass http://varnish;

    ...

  }

}


现在,如果您知道每个服务器通常有 2 个或更多 IP,则可以通过向 Nginx 上游添加附加 IP 来轻松向网络堆栈添加更多四元组。您已经添加了 127.0.0.1,但您的服务器将有另一个 IP(其公共或 DHCP IP),如果您的网络服务器绑定到所有端口,您也可以安全地添加该 IP。


上游清漆{

  服务器127.0.0.1:80;

  服务器31.193.180.217:80;

  服务器10.50.5.1:80;

  ...

}


您在上游添加的每个 IP 都会有效地向您的网络堆栈添加 49.000 个本地端口。您甚至可以将不可路由的本地 IP 添加到您的服务器,如下所示  接口别名,仅用作代理配置的新目标 IP。


你好!我叫马蒂亚斯·吉尼亚尔。我是一名支持经理  比利时的Nucleus Hosting  ,一般网络极客,  公共演讲家 和  播客。如果您有兴趣关注我,请查看下面我的播客和每周通讯。欲了解更多更新,请在 Twitter 上关注我  @马蒂亚斯吉尼亚尔。




zhuanzi:  https://ma.ttias.be/nginx-cannot-assign-requested-address-for-upstream/

-----------------------------------

Nginx: 99: Cannot assign requested address for upstream

https://blog.51cto.com/u_12223582/1877316


来自  https://blog.51cto.com/u_12223582/1877316


普通分类: