Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets nginx、fastcgi和开放式插座_Sockets_Nginx_D - Fatal编程技术网

Sockets nginx、fastcgi和开放式插座

Sockets nginx、fastcgi和开放式插座,sockets,nginx,d,Sockets,Nginx,D,我正在nginx上尝试使用fastcgi,但遇到了一些问题。 Nginx不重用连接,它在BeginRequest标志中给出0,因此应用程序应该在请求完成后关闭连接 我有以下关闭代码: socket.shutdown(SocketShutdown.BOTH); socket.close(); 问题是这些连接实际上并没有关闭。。随着时间的推移,它们会继续存在,nginx(或其他什么)不会继续打开新的连接。 我猜我在关插座时做错了什么,但我不知道是什么。。关于一个相关的注意事项-如何让nginx保持

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

我有以下关闭代码:

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?通常情况下,你可以找到一个更好的答案。请看这个问题:*