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个请求是MISS,其余都是缓存命中的。那个MISS请求的
$request_time只有0.4秒,显然不是导致慢响应的原因。 - 资源瓶颈:服务器的带宽使用率仅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
相关产品推荐
相关产品推荐

