Nginx 代理响应时间非常慢

Nginx 代理响应时间非常慢

最近我们在 varnish 前面添加了 nginx,用于 ssl 卸载。我们原本打算将所有 http 请求重写为 https。但后来我们发现,即使是 http 调用,如果由 nginx 提供服务,响应时间也会显著增加。而如果由 varnish 提供服务,而没有使用 nginx,响应时间会快很多。

我调整了代理缓冲区(2048 4k),这样响应就不会存储在文件中,并且还关闭了代理缓冲。但这两种方法都没有帮助。所以我克隆了 nginx 服务器(虚拟机),并对克隆的服务器发出了相同的请求。响应时间与 varnish 相当。

因此,当 nginx 上有负载(大约 700 个请求/秒)时,响应时间似乎会增加。

有人能告诉我我是否遗漏了一些显而易见的东西吗?

这是我的 nginx 配置

#nginx.conf
worker_processes auto;

worker_rlimit_nofile 90000;

pid        /var/run/nginx.pid;

error_log /var/log/nginx/error.log error;

events {

    worker_connections 40000;

    multi_accept on;

    use epoll;
}


http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    client_max_body_size 20M;
    client_body_buffer_size 128k;
    server_tokens off;
    keepalive_requests 1000;
    reset_timedout_connection on;

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    ##
    # SSL common settings
    ##
    include /etc/nginx/include.d/ssl-common;


    ##
    # Logging Settings
    ##

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

    log_format detailed '$remote_addr - $remote_user [$time_local] '
                '"$request" $status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" $request_length $request_time '
                '$upstream_response_length $upstream_response_time '
                '$upstream_status';

    log_format upstreamlog '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $status / upstream $upstream_status $request upstream_response_time $upstream_response_time msec $msec request_time $request_time body: $request_body';

    log_format timed_combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'$upstream_connect_time $upstream_header_time '
'$request_time $upstream_response_time $pipe';

    access_log off;


    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    #Proxy config

    proxy_buffering on;
    proxy_buffers 56 4k;
    proxy_busy_buffers_size 8k;

    proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_set_header Connection ""; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    ##
    # Virtual Host Configs
    ##

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


#For a specific request I've increased the proxy buffer size
proxy_buffers 2048 4k;
proxy_buffer_size 4k;
proxy_busy_buffers_size 8k;


#Upstream setting
keepalive 2000;

我甚至优化了 sysctl.config 中的 tcp 设置,但这也无济于事。这是我的 sysctl.config

#sysctl.config

fs.file-max = 100000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_tw_buckets = 400000
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_max_syn_backlog = 65536
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
vm.min_free_kbytes = 65536

这是磁盘 IO 的图表。 注意:我最近才添加了 Tcp 连接统计信息,因此没有太多信息。

Nginx_status - 显示请求和连接的图表

答案1

错误日志里有什么内容吗?

最近遇到了一个问题,系统文件句柄用完了,因为它缓冲了每个请求,并且上游保持活动未启用。不过,我没想到这些设置会导致这些问题。

不知道您的硬件情况如何,但每秒 700 个 SSL 请求/sa 相当繁重,是否有任何 iowait?cpu 是否已满?对于该级别的流量,“keepalive_timeout 65”看起来也很高,您可能耗尽了 tcp 连接。我发现 ~300 req/s 的最佳结果非常短,大​​约 1-3 秒,但这取决于您的负载。

相关内容