Nginx 数千个连接

Nginx 数千个连接

我有一台装有 nginx 服务器 (1.10.2) 的服务器,自从我们在上面迁移了几十个网站后,它就一直“崩溃”。它仍然在运行,但它不响应任何请求,也不记录任何内容,直到重新加载或重新启动完成。

重新加载后立即查看状态页面:

Active connections: 9432 
server accepts handled requests
 550310 550310 657656 
Reading: 0 Writing: 3280 Waiting: 6150 

这似乎很荒谬,而且查看访问日志时,没有足够的查询来证明这一点。想知道这是否可能是类似 slowris 攻击的东西,我尝试将 client_body_timeout 和 client_header_timeout 降低到 5 秒,现在看起来它正在缓慢地攀升,但谁知道呢。有什么想法我可以做些什么来防止 nginx 每隔几个小时就死机?

我已经禁用了 keepalive,以防万一,没有改变任何事情。

编辑:nginx.conf:

pid /var/run/nginx.pid;
user www-data;
worker_processes 12;
worker_rlimit_nofile 300000;
error_log /var/log/nginx/error.log;
events
{
    multi_accept on;
    use epoll;
    worker_connections 2048;
}

http
{
    index index.html index.htm index.php;
    server_tokens off;
    include /etc/nginx/mime.types;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    client_max_body_size 100M;
    keepalive_timeout 0;

    gzip on;
    gzip_http_version 1.1;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_proxied any;
    gzip_buffers 16 8k;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    gzip_types
        text/plain
        text/css
        text/js
        text/xml
        text/javascript
        application/javascript
        application/x-javascript
        application/json
        application/xml
        application/rss+xml
        image/svg+xml
        font/opentype
        image/gif
        image/jpeg
        image/png      
        image/bmp
        image/x-icon;
}

其中一个网站是:

server
{
    listen              80;

    root                /home/sitename/www;

    server_name             sitename.com;

    access_log              /var/log/nginx/sitename_access.log;
    error_log               /var/log/nginx/sitename_error.log;

    pagespeed                           on;
    pagespeed                           FileCachePath "/tmp/pagespeed/sitename";

    include                             "pagespeed.conf";

    if ($host != 'www.sitename.com')
    {
      return 301 $scheme://www.sitename.com$request_uri;
    }

    location /
    {
        index                           index.php index.html index.htm;
        try_files                       $uri $uri/ /index.php?$args;
    }

    location ~ \.php$
    {
        fastcgi_pass            fastcgi_sitename;
        fastcgi_index           index.php;
        include                 fastcgi.conf;
    }
}

pagespeed.conf 只是一堆过滤器。有些网站有其他几个位置块,有些有 https,但我在数百台其他生产服务器上都做过这些,没有任何问题。

答案1

您可能已达到最大连接数限制 (worker_processes * worker_connections)。当您重新加载 nginx 时,它会生成新进程,让旧进程完成请求并终止。因此您的连接数限制会被重置。

尝试检查 netstat 中的连接来自哪里:

netstat -t -n -v | grep ESTABLISHED

然后您可以尝试设置客户端超时:

查看您的服务器状态,我可以看到两件重要的事情:

  • 写入:3280(nginx 正在将响应写回客户端的当前连接数。)
  • 等待:6150(当前等待请求的空闲客户端连接数。)

因此,您有 3280 个客户端从您的网络服务器接收响应,而 6150 个客户端什么也不做 - 也许是保持活动?

仅当请求完成时,访问日志才会填充。如果您有 3000 个客户端在等待响应,则在它们收到完整响应之前,您将无法在访问日志中看到它们。但是,您可以通过编写一个小型 lua 脚本(通过 access_by_lua 调用)来解决这个问题。

您还可以通过 $request_time 调整应用程序的访问日志和日志处理时间。请查看文档以了解更多变量:http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format

答案2

所以我弄清楚了问题出在哪里,我周末禁用了 pagespeed,之后就没问题了。根据日志,pagespeed 大量请求 nginx 本身。

查看文档似乎我可以通过使用 LoadFromFile 来防止这种情况,所以我想我会尝试一下并尝试找到一些无需关闭服务器即可工作的配置。

相关内容