我有 nginx/1.27.0 (今天的最新主线版本)充当反向代理,将在 docker 中运行的 grafana 实例公开到互联网。
我在 nginx 端启用了 HTTP3 / QUIC,并注意到对 Grafana 的一些(任意且罕见的)请求被卡住(Grafana 有时在某些面板中显示“N/A”)。大多数 HTTP3 请求都可以顺利处理。
HTTP3 / QUIC 总体工作正常(由 https://http3check.net/ 验证):
nginx 错误日志中没有任何内容。在 nginx 访问日志中,那些卡住的请求具有“000”状态代码,传输“0”字节:
1.2.3.4 - - [12/Aug/2024:06:24:05 +0000] "POST /api/ds/query?ds_type=prometheus&requestId=Q137 HTTP/3.0" 000 0 "https://grafana.example.com/d/123456789/linux-server-overview?orgId=1&refresh=30s&var-DS_PROMETHEUS=***&var-job=***&var-node=***&var-diskdevices=***&from=now-1h&to=now" "my-user-agent-here"
在 Firefox 开发者工具中,那些卡住的请求是红色的,没有任何 HTTP 状态代码,大小为“0”,并且“已传输”列中出现 NS_ERROR_NET_RESET。
如果在 nginx 中禁用 HTTP3 / QUIC,仅使用 HTTP1+HTTP2 - 一切正常。
如何调试这个?
nginx 配置(基于文档):
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream grafana {
server 127.0.0.1:3000; # docker port
}
server {
server_name grafana.example.com;
error_log /var/log/nginx/grafana.error.log;
access_log /var/log/nginx/grafana.access.log;
location / {
proxy_pass http://grafana;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /api/live/ {
# proxy Grafana Live WebSocket connections
proxy_pass http://grafana;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
add_header Alt-Svc 'h3=":443"; ma=86400,h3-29=":443"; ma=86400'; # for HTTP3/QUIC
http2 on;
listen 443 ssl;
listen 443 quic;
ssl_certificate /etc/letsencrypt/live/grafana.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/grafana.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = grafana.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name grafana.example.com;
listen 80;
return 404; # managed by Certbot
}
我对反向代理 nginx (1.16.2) 和一些 .Net Web 应用程序也有同样的问题。在执行长 XHR 请求时,nginx 报告 000 状态代码。有时,请求在“已传输”列中以 NS_ERROR_NET_RESET 结束,有时仅以空字符串结束。相同的请求在 Chrome 上运行没有错误,但在 Firefox 上则不然。我尝试过调整 nginx 配置,但根本没有帮助。感谢您指出,在反向代理上禁用 HTTP3 / QUIC 解决了 Firefox 的问题。看起来 Firefox 中的 XHR 和 QUIC 存在一些问题。