Nginx连接限制 - nginx

在3个具有TCP连接的php5-fpm服务器之前,我们有2个nginx服务器以1000reqs /秒的速度完美运行。我们认为一台nginx服务器就足够了,并将所有流量重定向到该服务器。但是,服务器的服务速度不能超过750reqs / sec。它具有千兆以太网,总流量不超过100mbits(Debian 6.0)

我们找不到任何原因,经过谷歌搜索发现它可能与TCP问题有关。但是,我们似乎不太可能对连接数和带宽(大约70mbits / sec)进行任何更改。后来,我们将一半的流量重定向回另一个nginx,再次达到1000reqs / second。

我们一直在查看nginx错误和访问日志。是否有任何工具或文件可以帮助我们找到问题的解决方案?

参考方案

大多数Linux发行版都有28232 ephemeral ports available。服务器为每个连接需要一个临时端口,以便为新连接释放主要端口(即http服务器端口80)。

因此,如果服务器正在处理1000个请求/秒以TCP方式处理php5-fpm生成的内容,则您正在分配2000个端口/秒。实际情况并非如此,可能是5%的PHP和95%的静态(无端口分配),并且IIRC nginx php-fpm使端口保持打开状态以便后续请求。有许多因素会影响这些数字,但出于参数考虑,可以说是1000个端口分配/秒。

从表面上看,这似乎不是问题,但是默认情况下,端口不会立即释放并可供新连接使用。造成这种现象的原因多种多样,我强烈建议您在此处(或其他位置)进行任意详细的更改之前,对TCP进行全面的了解。

主要是一种称为TIME_WAIT的连接状态(套接字在等待处理仍在网络中的数据包后一直处于等待状态,netstat man page)是阻止端口释放以供重用的状态。在最近的(全部?)Linux内核上,TIME_WAIT被硬编码为60秒,并且根据RFC793,连接可能会在TIME_WAIT中停留四分钟!

这意味着至少1000个端口将被使用至少60秒。在现实世界中,您需要考虑传输时间,保持活动请求(多个请求使用相同的连接)和服务端口(在nginx和后端服务器之间)。让我们随意将其降低到750个端口/秒。

在约37秒内,您所有可用的端口都将用完(28232/750 = 37)。这是一个问题,因为释放端口需要60秒钟!

要查看所有正在使用的端口,请运行apache bench或类似的方法,它们可以每秒生成您要调整的请求数。然后运行:

root:~# netstat -n -t -o | grep timewait

您将获得类似(但很多行)的输出:

tcp        0      0 127.0.0.1:40649         127.1.0.2:80            TIME_WAIT   timewait (57.58/0/0)
tcp        0      0 127.1.0.1:9000          127.0.0.1:50153         TIME_WAIT   timewait (57.37/0/0)
tcp        0      0 127.0.0.1:40666         127.1.0.2:80            TIME_WAIT   timewait (57.69/0/0)
tcp        0      0 127.0.0.1:40650         127.1.0.2:80            TIME_WAIT   timewait (57.58/0/0)
tcp        0      0 127.0.0.1:40662         127.1.0.2:80            TIME_WAIT   timewait (57.69/0/0)
tcp        0      0 127.0.0.1:40663         127.1.0.2:80            TIME_WAIT   timewait (57.69/0/0)
tcp        0      0 127.0.0.1:40661         127.1.0.2:80            TIME_WAIT   timewait (57.61/0/0)

对于正在运行的已分配端口总数:

root:~# netstat -n -t -o | wc -l

如果您收到失败的请求,该号码将为/接近28232。

该如何解决呢?

将临时端口的数量从28232增加到63976。

sysctl -w net.ipv4.ip_local_port_range="1024 65000"

允许Linux在超时到期之前重用TIME_WAIT端口。

sysctl -w net.ipv4.tcp_tw_reuse="1"

其他IP地址。

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

php-fpm和nginx会话问题 - session

在过去一周左右的时间里,我一直遇到这个问题。我一直在从事一个非常依赖Session的PHP项目。由于某些原因,过去几天来保存会话时遇到了麻烦。知道为什么吗?这是错误:Warning: Unknown: open(/tmp/sess_mmd0ru5pl2h2h9bummcu1uu620, O_RDWR) failed: Permission denied (1…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

使用Nginx将动态生成的文件作为静态文件提供 - dynamic

Nginx擅长提供静态文件,因此我想知道是否可以将动态生成的文件作为静态文件提供?例如云,我们使用PHP Minify在Nginx后面的PHP-FPM上组合CSS和JS文件,并几乎像任何静态文件一样为它们提供服务,可能带有一些版本控制和缓存。因此,它的考虑和行为更像是静态文件,然后是动态文件。我知道这听起来更像是缓存,但这就是Nginx如何以最佳状态处理静态…