nginx 在负载较低的情况下拒绝连接

nginx 在负载较低的情况下拒绝连接

我有一个 Web 服务在作为反向代理运行的 nginx 实例后面运行。Nginx 配置为在两个独立主机上运行的 10 个应用服务器进程之间进行负载平衡。

我发现的问题是,当并发连接数达到 150 个左右时,nginx 会开始拒绝所有新传入连接。当连接数达到 140 个时,一切都会变得快速而稳定,只要再增加几个连接,服务器就会开始拒绝所有传入连接,而不仅仅是超过 150 个的连接。一旦所有连接都断开,它就会再次开始接受。

当我修改 worker_processes、worker_connections 或 multi_accept 设置时,这种情况似乎根本没有改变。当拒绝开始时,CPU 负载非常小(>10%),并且有足够的网络带宽可用。错误日志中没有消息。

我在这里做错了什么?

配置如下:

worker_processes 8;
worker_rlimit_nofile 65536;

events {
    worker_connections  8192;
    multi_accept on;
    use epoll;
}

http {
    include       /etc/nginx/mime.types;
    access_log  /var/log/nginx/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

在 conf.d 目录中,只有从主机名到后端服务器的映射。如下所示:

upstream api {
    server 10.0.0.1:8000;
    server 10.0.0.1:8001;
    server 10.0.0.2:8000;
    server 10.0.0.2:8001;
}

server {
    listen 80;
    server_name api.example.com;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_redirect off;
        proxy_pass http://api;
    }
}

答案1

这是 EC2 上的微实例吗?

我上周遇到了这个问题并找到了这篇文章:http://gregsramblings.com/2011/02/07/amazon-ec2-micro-instance-cpu-steal/

通过转向小型实例类型,该情况已得到解决。

也许这会有帮助!

答案2

那么打开文件限制呢?150 似乎仍然太少,甚至达不到默认限制 1024,但请检查输出ulimit -n。您可能需要在 init.d 脚本(使用 ulimit 命令)或 /etc/security/limits.conf 中增加限制

答案3

好吧,我有两个主要想法。我的第一个选择是检查系统限制。可能是 nginx 用完了文件描述符,也可能是内核禁止 nginx 占用超过一定数量的连接。如果内核级别发生了某些事情,nginx 可能永远不会知道。您是否检查过所有常见的守护进程日志?

但老实说,我怀疑这更可能与您的 fastcgi 比较有关。因此,对于一个非常简单的测试,使用 ab(apachebench)在 nginx 代理上访问静态文件,并用几百个同时连接访问它几千次。我猜它会毫不费力地完成。这意味着您可能在 fastcgi 方面遇到了排队问题,而 nginx 只是在地板上丢弃连接而不是等待 fastcgi 返回。

答案4

问题发生时,vmstat 1 显示什么?故障发生时服务器是否以任何方式加载?

还要检查服务器上实际打开的连接数(lsof -i | grep nginx 或 netstat -atnp | grep nginx )。这可能是与应用服务器的连接问题(可能是某种连接到后端的连接溢出)

这可能是 ulimit 问题(您可以使用 lsof | grep nginx 查看打开的文件数量)。

我最后要尝试的是当问题发生时跟踪 nginx 进程。

相关内容