【发布时间】:2011-11-28 19:37:53
【问题描述】:
我正在尝试在 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 支持保持连接。但是这并没有按预期工作。正确报告服务器负责连接生命周期管理,但它仍然为每个请求创建一个新套接字。
【问题讨论】:
-
可能是 socket.setOption(SocketOptionLevel.SOCKET, SocketOption.REUSEADDR, true);可以帮忙吗?
-
您使用 Nginx 和 FastCGI 开发高性能网站?然后实现您自己的 HTTP 1.0 协议。这比使用 FCGI 更容易做,而且会更快。或者,您可以为 nginx 编写自己的模块,以通过共享内存 IPC 将请求数据传递给旨在返回响应的另一个进程。
-
请问为什么选择fastcgi?通常你可以找到一个更好的替代品