nginx、fastcgi 和开放套接字

2024-02-16

我正在尝试在 nginx 上使用 fastcgi,但遇到了一些问题。 Nginx 不会重用连接,它在 BeginRequest 标志中给出 0,因此应用程序应该在请求完成后关闭连接。

我有以下关闭代码:

socket.shutdown(SocketShutdown.BOTH);
socket.close();

问题是连接实际上并没有关闭。它们以 TIME_WAIT 的形式徘徊,并且 nginx(或其他东西)不会继续打开新连接。 我的猜测是我在关闭套接字时做错了什么,但我不知道是什么..在相关说明中 - 如何让 nginx 保持连接打开?

这是使用 nginx 1.0.6 和 D 2.055

编辑: 还没有更近,但我也检查了 linger 选项,它已关闭:

linger l;
socket.getOption(SocketOptionLevel.SOCKET, SocketOption.LINGER, l);
assert(l.on == 0); // off

getOption但返回 4.. 不知道这意味着什么。返回值未记录。

编辑: 我还尝试在发送的最后一条消息上使用 TCP_NODELAY,但这也没有任何效果:

socket.setOption(SocketOptionLevel.SOCKET, SocketOption.TCP_NODELAY, 1);

编辑: nginx 1.1.4 支持保持活动连接。但这并没有按预期工作。正确地报告服务器负责连接生命周期管理,但它仍然为每个请求创建一个新的套接字。


NGINX 代理保持活动状态

关于 fastcgi 的 nginx (v1.1) keepalive。正确的配置方法如下:

upstream fcgi_backend {
  server localhost:9000;
  keepalive 32;
}

server {
  ...
  location ~ \.php$ {
    fastcgi_keep_conn on;
    fastcgi_pass fcgi_backend;
    ...
  }
}

时间的等待

TCP TIME_WAIT 连接状态与 lingers、tcp_no_delays、超时等无关。它完全由操作系统内核管理,并且只能受系统范围配置选项的影响。一般来说,这是不可避免的。这就是 TCP 协议的工作方式。阅读相关内容here http://developerweb.net/viewtopic.php?id=2941 and here http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html.

避免TIME_WAIT最根本的方法是重置(发送RST通过设置 linger=ON 和 linger_timeout=0 来关闭 TCP 连接。但在正常操作中不建议这样做,因为您可能会丢失未发送的数据。仅在错误情况下(超时等)重置套接字。

我要尝试的是以下内容。发送所有数据后,调用 socket.shutdown(WRITE) (这将发送FIN数据包发送给另一方)并且不要关闭套接字。然后继续从套接字读取数据,直到收到另一端关闭连接的指示(在 C 中,通常由 0 长度 read() 指示)。收到此指示后,关闭套接字。了解更多相关信息here http://docs.oracle.com/javase/6/docs/technotes/guides/net/articles/connection_release.html.

TCP_NODELAY 和 TCP_CORK

如果您正在开发任何类型的网络服务器,您必须研究这些选项,因为它们确实会影响性能。如果不使用这些,您可能会遇到大约 20 毫秒的延迟(内格尔延迟)在发送过来的每个数据包上。尽管这些延迟看起来很小,但它们可能会对您的每秒请求统计数据产生不利影响。关于它的一个很好的阅读是here http://www.techrepublic.com/article/tcpip-options-for-high-performance-data-transmission/1050878.

关于套接字的另一个很好的参考是here http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html.

关于 FastCGI

我同意其他评论者的观点,即在后端使用 FastCGI 协议可能不是一个好主意。如果您关心性能,那么您应该实现自己的 nginx 模块(或者,如果这看起来太困难,则可以实现其他服务器的模块,例如NXWEB https://bitbucket.org/yarosla/nxweb)。否则使用 HTTP。它比 FastCGI 更容易实现并且用途更广泛。我不会说 HTTP 比 FastCGI 慢很多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nginx、fastcgi 和开放套接字 的相关文章

  • 为什么我会收到 ElasticBeanstalk::ExternalInitationError?

    我的应用程序基于 RubyOnRails 构建 并使用乘客部署为弹性 beanstalk 应用程序 我尝试向 nginx 服务器添加标头并重新启动它 这是我的配置文件 是 aws elastic beanstalk 中 ebextensio
  • UI 线程中异步组件的触发事件

    我正在 Net 2 0 中构建一个非可视组件 该组件使用异步套接字 BeginReceive EndReceive 等 异步回调是在运行时创建的工作线程的上下文中调用的 组件用户不必担心多线程 这是主要目标 我想要的 组件用户可以在任何线程
  • 使用 DigitalOcean 在 Kubernetes 集群上为我的 Nginx-Ingress 生成通配符证书

    我遵循了这个 DigitalOcean 指南https www digitalocean com community tutorials how to set up an nginx ingress with cert manager on
  • Java套接字:在连接被拒绝异常时重试的最佳方法?

    现在我正在这样做 while true try SocketAddress sockaddr new InetSocketAddress ivDestIP ivDestPort downloadSock new Socket downloa
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • NGinx $proxy_add_x_forwarded_for 和 real_ip_header

    我在 NGinx 下有一个 web 应用程序和另一个前端负载均衡器 如下所示 x x x x IP 地址 客户端 a a a a gt LB b b b b gt NGX c c c c gt WEBAPP d d d d 这是我的 NGi
  • 建立 TCP 连接边界的正确方法

    我的问题是关于如何正确处理使用 tcp 连接接收的数据 事实上 通过建立 tcp 连接 创建了一个流 假设我想发送一条有开头和结尾的消息 由于数据在流中流动而没有指定任何边界 我如何识别消息的开始和结束 我想在消息的开头和结尾处放置一些特殊
  • 套接字错误 10054

    我有一个C S程序 客户端使用socket向服务器发送文件 发送后大约超过700k数据 客户端 在win7上 将收到套接字10054错误 这意味着连接被对等方重置 服务器运行在CentOS 5 4上 客户端是在virtual box中运行的
  • 如何以最短的停机时间移交 TCP 侦听套接字?

    虽然这个问题被标记为 EventMachine 任何语言的通用 BSD 套接字解决方案也非常受欢迎 一些背景 我有一个应用程序正在侦听 TCP 套接字 它通过常规的 System V 风格的 init 脚本启动和关闭 我的问题是它需要一些时
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 跨平台套接字

    我知道 Windows 不使用 UNIX 套接字 而 Mac OS 使用 到目前为止 我的软件是跨平台的 没有任何代码更改 但现在我想让它进行一些网络通信 我了解 POSIX 套接字 但我对 Windows 的套接字一无所知 目标是实现一个
  • uWSGI nginx 错误:连接到上游时 connect() 失败(111:连接被拒绝)

    我在 nginx 上访问我的 IP 时遇到 502 网关错误 http 52 xx xx xx http 52 xx xx xx 日志只是这样说的 2015 09 18 13 03 37 错误 32636 0 1 连接到上游时失败 111
  • Python服务器“通常只允许每个套接字地址使用一次”

    我正在尝试用 python 创建一个非常基本的服务器 它侦听端口 当客户端尝试连接时创建 TCP 连接 接收数据 发回某些内容 然后再次侦听 并无限期地重复该过程 这是我到目前为止所拥有的 from socket import server
  • 为什么将域连接到“Shopify”需要 CNAME 和 A 记录?

    为什么将域连接到 Shopify 需要CNAME and ARecord ref https help shopify com en manual domains add a domain using existing domains co
  • 通过 PHP 脚本重新启动 Nginx

    我目前正在努力使我的 WordPress 插件与 nginx 兼容 该插件需要访问 conf文件在wp content uploads目录 以便它可以添加所需的规则 目前 它更新了 htaccess文件位于同一目录中 更改立即生效 无需干预
  • 禁用 Kubernetes NGINX 入口的 SSL 重定向

    默认情况下 在 Kubernetes NGINX 入口中启用 SSL 重定向 如何禁用此功能 目前的实施如下 apiVersion extensions v1beta1 kind Ingress metadata name project
  • 我的 s3 存储桶如何使用 nginx 在不同文件夹中托管多个网站?

    我在 Amazon 上有一个 s3 Cloudfront 解决方案 我想在存储桶内的不同文件夹中托管不同的网站 并通过以下两种方式之一访问它们 子域 gt mywebsite1 mydomain com 或者 路径 gt www mydom
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • 连接到上游时 Django Gunicorn nginx(111:连接被拒绝)

    一个Django应用程序在AWS实例上运行 通过gunicorn和nginx配置 它运行良好一年多了 但是突然 我收到了502 bad gateway错误 然后我在nginx错误日志中看到了下面提到的消息 2017 05 17 16 18
  • nginx/mono 2.8 上的 ASP.Net MVC 2

    我正在尝试在 Linux 环境上设置 ASP Net MVC 2 应用程序 我在 VirtualBox 上安装了 Ubuntu 10 10 然后从源安装了 Mono 2 8 之后我安装了 nginx 并按照建议进行配置here http w

随机推荐