You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx(OpenResty)反向代理服务器请求等待时间差异过大的原因排查求助

Nginx(OpenResty)反向代理服务器请求等待时间差异过大的原因排查求助

问题背景

我有一台同时作为反向代理和静态文件服务器的Nginx(OpenResty)服务器,最近用户反馈偶尔会出现响应缓慢的情况。我查看了请求等待时间的日志,发现了一些异常现象。

观测到的等待时间数据

我统计了不同资源的请求等待时间,发现同一资源的等待时间差异极大:

  • cdnjs.cloudflare.com的等待时间样本:
    [10.00600000781566, 10.09000002155453, 12.657999974526462, 30.81500001040101, 50.140000049091874]
    
  • fonts.gstatic.com的等待时间样本:
    [0.8139999584183073, 0.8409999709799933, 1.4160000515654616, 2.3279999482259086, 79.60999999868869]
    
  • 我的服务器的等待时间样本(差异尤为显著):
    [59.73200001836568, 59.820000056281685, 60.4199999724552, 60.530999979116025, 60.79299996264279, 61.397000021353364, 61.590999948196114, 61.89499994969368, 62.058999961778525, 68.06700001706928, 68.25800005129724, 68.29399997562915, 68.88300005169958, 69.07899998541922, 69.38299999047071, 69.6550000514686, 69.6710000243038, 69.69899996588379, 69.76500002556294, 70.05899996621906, 70.57600003184378, 76.85900000137836, 256.38100003309546, 267.7780000296906, 280.696999967508, 461.3320000257194, 465.38599997801333, 476.49299997053294, 484.6409999888614, 748.1390000376775]
    

可以看到,即使是像cdnjs、fonts.gstatic这类知名CDN的请求也存在等待时间波动,但我自己的服务器上这个差异要大得多。

已排除的可能原因

  1. 缓存问题:我确认这些等待时间样本中,除了1个请求是MISS,其余都是缓存命中的。那个MISS请求的$request_time只有0.4秒,显然不是导致慢响应的原因。
  2. 资源瓶颈:服务器的带宽使用率仅10%左右,峰值CPU负载也低于40%(服务器是1Gbps带宽+高性能CPU,当前CPU使用率不到15%),资源完全没有耗尽。

我的OpenResty配置

以下是我的服务器配置文件:

events {
    worker_connections 1024;
}

env SERVER_BACKEND_NAME;
env SERVER_CDN_NAME;
env SERVER_CDN_SPESIFIC_NAME;

http {
    error_log /var/errors/externalNginx.http.error_1 error;

    lua_shared_dict auto_ssl 1m;
    lua_shared_dict auto_ssl_settings 64k;

    resolver 127.0.0.11;

    init_by_lua_block {
        auto_ssl = (require "resty.auto-ssl").new()
        auto_ssl:set("allow_domain", function(domain)
            return true
        end)
        auto_ssl:init()
    }

    init_worker_by_lua_block {
        auto_ssl:init_worker()
    }

    upstream cdnnginx_backend {
        server cdnnginx;
    }

    limit_req_log_level    warn;
    limit_req_zone         $binary_remote_addr zone=login:10m rate=10r/m;

    server {
        listen 443 ssl http2;
        server_name  ${SERVER_IMAGE_AND_FILE_CDN_NAME};
        error_log /var/errors/externalNginx.${SERVER_IMAGE_AND_FILE_CDN_NAME}.error_1 error;

        ssl_certificate_by_lua_block {
            auto_ssl:ssl_certificate()
        }

        large_client_header_buffers 4 32k;
        ssl_certificate /etc/resty-default-ssl/resty-auto-ssl-fallback.crt;
        ssl_certificate_key /etc/resty-default-ssl/resty-auto-ssl-fallback.key;

        gzip on;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        sendfile on;

        location /saved.html {
            root /var/compenion;
            more_clear_headers 'Server';
            more_set_headers 'Access-Control-Allow-Origin: *';
        }

        location / {
            more_clear_headers 'Server';
            return 404 'Nanana';
        }
    }

    server {
        listen 443 ssl http2;
        server_name my.server.com;
        error_log /var/errors/externalNginx.my.server.com.error_1 error;

        ssl_certificate_by_lua_block {
            auto_ssl:ssl_certificate()
        }

        ssl_certificate /etc/resty-default-ssl/resty-auto-ssl-fallback.crt;
        ssl_certificate_key /etc/resty-default-ssl/resty-auto-ssl-fallback.key;

        location /Health {
            return 200 "ComasTas";
        }

        location /Health2 {
            proxy_pass http://cdnnginx_backend/Health2;
            more_set_headers 'Access-Control-Allow-Origin: *';
        }

        location /1/Health {
            proxy_pass http://cdnnginx_backend/Health3;
            more_set_headers 'Access-Control-Allow-Origin: *';
        }

        location ~  "^\/(?:[0-9A-Fa-f]{2}){16}\/(?:[0-9A-Fa-f]{2}){16}\/(?:.?[^\/]+)$" {
            proxy_force_ranges on;
            more_set_headers 'Accept-Ranges: bytes';
            proxy_read_timeout 300s;

            set $continue_url $uri;
            if ($arg_sig) {
                set $temp_cache 1;
            }
            if ($arg_refere) {
                set $temp_cache 2$temp_cache;
            }
            if ($temp_cache = 1) {
                set $continue_url $uri?sig=$arg_sig;
            }
            if ($temp_cache = 21) {
                set $continue_url $uri?sig=$arg_sig&refere=$arg_refere;
            }
            if ($temp_cache = 2) {
                set $continue_url $uri?refere=$arg_refere;
            }

            if ($request_method = OPTIONS ) {
                more_set_headers 'Access-Control-Allow-Origin: *';
                more_set_headers 'Access-Control-Allow-Headers: refere, Origin';
                add_header Content-Length 0;
                add_header Content-Type text/plain;
                return 200;
            }

            proxy_set_header X-Forwarded-Host $scheme://$http_host;
            proxy_pass      http://cdnnginx_backend$continue_url;

            more_clear_headers 'Server';
            more_clear_headers 'V1Latency';
            more_clear_headers 'V1RequestTime';
            more_clear_headers 'ProxyCache';
            more_clear_headers 'S3priority';
            more_clear_headers 'V1internalcache';

            more_set_headers 'Access-Control-Allow-Origin: *';
            more_set_headers 'Access-Control-Allow-Headers: refere, Origin';

            more_set_headers 'start_time: $msec';
            more_set_headers 'total_time: $request_time';
        }

        error_page 404 403 500 502 503 /error-page.html;
        location = /error-page.html {
            internal;
            return 404 "Nanana";
        }

        location = / {
            return 404 "Nanana";
        }
    }

    server {
        listen 80;

        location /HealthCheck {
            return 200;
        }

        location /.well-known/acme-challenge/ {
            content_by_lua_block {
                auto_ssl:challenge_server()
            }
        }
    }

    server {
        listen 127.0.0.1:8999;

        client_body_buffer_size 128k;
        client_max_body_size 128k;

        location / {
            content_by_lua_block {
                auto_ssl:hook_server()
            }
        }
    }
}

系统资源监控数据

我检查了服务器的资源使用情况:

  • iftop数据:
    TX:             cum:    816MB   peak:   36.8Mb                                                                                                                               rates:   17.3Mb  24.2Mb  26.6Mb
    RX:                     272MB           13.2Mb                                                                                                                                        7.76Mb  7.92Mb  8.90Mb
    TOTAL:                 1.06GB           47.3Mb                                                                                                                                        25.1Mb  32.2Mb  35.5Mb
    
  • top数据:
    top - 08:26:56 up 5 days, 22:33,  2 users,  load average: 0.40, 0.27, 0.44
    Tasks: 271 total,   1 running, 270 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.6 us,  0.4 sy,  0.0 ni, 98.8 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
    MiB Mem :  31986.2 total,  12924.5 free,   3720.9 used,  15340.8 buff/cache
    MiB Swap:   1024.0 total,   1004.5 free,     19.5 used.  27610.2 avail Mem
    

求助问题

我实在搞不懂为什么同一资源的请求等待时间差异会这么大?这个问题是出在我的服务器上,还是客户端那边?有没有什么办法能精准定位问题根源?另外,我还能从哪些方向进一步排查这个问题呢?


备注:内容来源于stack exchange,提问作者0xPwn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 15:38:06