Sockets nginx、fastcgi和开放式插座
我正在nginx上尝试使用fastcgi,但遇到了一些问题。 Nginx不重用连接,它在BeginRequest标志中给出0,因此应用程序应该在请求完成后关闭连接 我有以下关闭代码:Sockets nginx、fastcgi和开放式插座,sockets,nginx,d,Sockets,Nginx,D,我正在nginx上尝试使用fastcgi,但遇到了一些问题。 Nginx不重用连接,它在BeginRequest标志中给出0,因此应用程序应该在请求完成后关闭连接 我有以下关闭代码: socket.shutdown(SocketShutdown.BOTH); socket.close(); 问题是这些连接实际上并没有关闭。。随着时间的推移,它们会继续存在,nginx(或其他什么)不会继续打开新的连接。 我猜我在关插座时做错了什么,但我不知道是什么。。关于一个相关的注意事项-如何让nginx保持
socket.shutdown(SocketShutdown.BOTH);
socket.close();
问题是这些连接实际上并没有关闭。。随着时间的推移,它们会继续存在,nginx(或其他什么)不会继续打开新的连接。
我猜我在关插座时做错了什么,但我不知道是什么。。关于一个相关的注意事项-如何让nginx保持连接打开
这是使用nginx1.0.6和d2.055
编辑:
还没有接近,但我也检查了玲珑选项,它关闭了:
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支持保持活动连接。但这并不像预期的那样有效。。正确地报告服务器负责连接生存期管理,但它仍然为每个请求创建一个新套接字。Hello simendsjo 以下建议可能完全偏离了目标 我自己使用NginX进行开发;然而,我绝对不是NginX的专家 NginX员工 然而,您的问题让我们想起了NginX中的一些内容 除此之外,在NginX中,用于减少工作进程在磁盘I/O上阻塞时的延迟,并在使用select()/poll()时限制每个进程的连接数 你可以找到 NginX Fcgiwrap和插座 另一个指针可能是下面的代码,尽管这个示例是针对Debian的
#!/usr/bin/perl
use strict;
use warnings FATAL => qw( all );
use IO::Socket::UNIX;
my $bin_path = '/usr/local/bin/fcgiwrap';
my $socket_path = $ARGV[0] || '/tmp/cgi.sock';
my $num_children = $ARGV[1] || 1;
close STDIN;
unlink $socket_path;
my $socket = IO::Socket::UNIX->new(
Local => $socket_path,
Listen => 100,
);
die "Cannot create socket at $socket_path: $!\n" unless $socket;
for (1 .. $num_children) {
my $pid = fork;
die "Cannot fork: $!" unless defined $pid;
next if $pid;
exec $bin_path;
die "Failed to exec $bin_path: $!\n";
}
您可以找到有关此解决方案的详细信息。将套接字超时设置为尽可能低的值,然后关闭套接字。 如果在此之后尝试向套接字写入任何内容,会发生什么?可以将未切换的二进制文件推送,以表示紧密连接已通过,从而迫使其结束。这就是IE被称为互联网爆炸者的原因NGINX proxy keepalive 关于nginx(v1.1),请为fastcgi保持活力。正确的配置方法如下所示:
upstream fcgi_backend {
server localhost:9000;
keepalive 32;
}
server {
...
location ~ \.php$ {
fastcgi_keep_conn on;
fastcgi_pass fcgi_backend;
...
}
}
等一下
TCP TIME\u WAIT连接状态与延迟、TCP\u no\u延迟、超时等无关。它完全由操作系统内核管理,并且只能受系统范围的配置选项的影响。一般来说,这是不可避免的。这就是TCP协议的工作方式。读一读,然后
避免时间等待的最根本的方法是通过设置linger=on和linger\u timeout=0来重置(发送RSTpacket)TCP连接on close。但对于正常操作,不建议这样做,因为您可能会丢失未发送的数据。仅在错误情况下(超时等)重置插座
我将尝试以下内容。发送所有数据呼叫套接字后。关闭(写入)(这将向另一方发送FIN数据包),但不要关闭套接字。然后继续从套接字读取数据,直到收到另一端关闭连接的指示(在C中,通常由0-length read()表示)。收到此指示后,关闭插座。阅读更多关于它的信息
TCP_节点和TCP_软木塞
如果您正在开发任何类型的网络服务器,您必须研究这些选项,因为它们确实会影响性能。如果不使用这些,您可能会在发送的每个数据包上遇到约20毫秒的延迟(Nagle延迟)。尽管这些延迟看起来很小,但它们可能会对每秒请求的统计数据产生不利影响。一本关于它的好读物是
另一个阅读套接字的好参考是
关于FastCGI
我同意其他评论者的看法,在后端使用FastCGI协议可能不是一个好主意。如果您关心性能,那么您应该实现您自己的nginx模块(或者,如果这看起来太困难,可以为其他一些服务器(例如)实现一个模块)。否则,请使用HTTP。它比FastCGI更容易实现,功能也更广泛。我不会说HTTP比FastCGI慢很多。可能是socket.setOption(SocketOptionLevel.socket,SocketOption.REUSEADDR,true);您可以在这里提供帮助吗?您使用Nginx和FastCGI开发了一个高性能的网站?然后实现您自己的HTTP 1.0协议。这比使用FCGI容易得多,速度也快得多。或者,您可以为nginx编写自己的模块,通过共享内存IPC将请求数据传递给另一个用于返回响应的进程。请问您为什么选择fastcgi?通常情况下,你可以找到一个更好的答案。请看这个问题:*