当前位置: 首页 > 知识库问答 >
问题:

NGINX:超过65535个连接限制

邰伟彦
2023-03-14

与HTTP不同,websocket在从HTTP升级后保持长时间连接。

即使操作系统被调优为使用所有端口,总共仍然只有65536个端口。NGINX有可能超过这个限制吗?

一个潜在的解决方案是so_reuseport,但是它缺少文档--至少我没有找到除了下面这段

共有1个答案

韩靖琪
2023-03-14

您收到的评论是正确的:

TCP连接由4元组(src_addr、src_port、dst_addr、dst_port)定义。如果客户端使用不同的IP地址和/或源端口,则可以将服务器连接到超过65536个客户端,所有客户端都位于同一端口。示例:服务器IP为0.0.0.1侦听端口80。然后所有的4元组都可以是(*,*,0.0.0.1,80)。只要4元组不是相同的,服务器就可以在端口80上有尽可能多的连接,因为它的内存允许。-玉米秆,12月4'15日2:36

但是,在评估是否会超出限制时,还必须考虑nginx不仅仅是一个服务器(有ngx_connection.c#ngx_open_listening_sockets()调用socket(2)bind(2)list(2)系统调用来接管80等端口,然后在无限循环中调用accept(2)等接受端口),它还可能是上游服务器的客户机(根据需要html" target="_blank">调用socket(2)

请注意,尽管在其服务器上下文中不可能用完TCP端口(因为服务器在其所有连接中使用单个端口--例如,端口80),但根据配置,在客户端上用完TCP端口是真正可能的。您还必须考虑,在客户机对连接执行clos(2)之后,状态将转到time_wait约60秒(以确保如果有任何迟到的数据包通过,系统将知道如何处理它们)。

但是,话虽如此,请注意getsockopt(2)so_reuseport选项,至少在引用的发行说明和nginx 1.9.1的reuseport公告中提供的sharding上下文中,与65535困境完全无关--它只是在内核和内核下运行的应用程序之间提供可伸缩的多处理器支持的一个构建块:

我在一个36核的AWS实例上运行了一个wrk基准测试,有4个NGINX工作人员。为了消除网络影响,我在localhost上同时运行了client和NGINX,并让NGINX返回字符串OK而不是文件。我比较了三种NGINX配置:默认配置(相当于accept_mutex打开)、使用accept_mutex关闭和使用Reuseport。如图所示,reuseport将每秒的请求增加了2到3倍,并减少了延迟和延迟的标准偏差。

至于您的潜在问题,对于传出TCP端口的UINT16_T问题的解决方案可能是,当需要关注时,不通过TCP使用后端,和/或通过Proxy_Bind等指令使用额外的本地地址(和/或限制可以与后端建立的TCP连接的数量)。

 类似资料:
  • 问题内容: 因此,我正在处理在Websphere 7(JDK 6)上运行的旧servlet代码。开发环境设置使用Tomcat 6(JDK 6)。 为什么它在Websphere 7上而不在Tomcat 6上可以工作? 这与应用程序服务器有关吗? 如果您的回答为“是”,则为“否”。2,除了分解代码或使用动态包含之外,您在Tomcat 6(JDK 6)上是否有解决方法? 该计划与将静态包含更改为动态包含

  • 所以我需要使用Java Dijkstra算法。我在这里找到了Dijkstra的一个有效例子。但在我的例子中,我有大约5000个顶点。我得到了一个错误:main方法(String[])的代码超过了65535字节的限制。在stackoverflow上有一些类似的主题,但我找不到如何解决这个问题的实现。有人能给我一些代码来解决这个问题吗。。 编辑 我试图从MySQL表中获取数据,但在声明vertex时遇

  • 我正在运行一个使用Apache Tomcat8.5和Java1.8的Struts2项目。 我被以下错误所困扰;我试过所有可能的解决办法,但找不到任何答案。 JasperException:无法为JSP编译类: 在生成的java文件[d:\newworkspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\catalina\loca

  • 我正在尝试设置 rabbitmq 它可以通过 nginx 从外部(从非本地主机)访问。 nginx-rabbitmq.conf: rabbitmq.conf文件: 默认情况下,来宾用户只能从本地主机进行交互,因此我们需要创建另一个具有所需权限的用户,如下所示: 但是,当我尝试通过pika连接到Rabbitmq时,我得到了ConntionClo的异常 --[引发连接关闭异常]-- 如果我使用相同的参