在启用 HTTP3 / QUIC 的情况下使用 nginx 进行反向代理时,任意 NS_ERROR_NET_RESET 和“000”HTTP 状态代码

问题描述 投票:0回答:1

我有 nginx/1.27.0 (今天的最新主线版本)充当反向代理,将在 docker 中运行的 grafana 实例公开到互联网。

我在 nginx 端启用了 HTTP3 / QUIC,并注意到对 Grafana 的一些(任意且罕见的)请求被卡住(Grafana 有时在某些面板中显示“N/A”)。大多数 HTTP3 请求都可以顺利处理。

HTTP3 / QUIC 总体工作正常(由 https://http3check.net/ 验证): http3check

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 http3
1个回答
0
投票

我对反向代理 nginx (1.16.2) 和一些 .Net Web 应用程序也有同样的问题。在执行长 XHR 请求时,nginx 报告 000 状态代码。有时,请求在“已传输”列中以 NS_ERROR_NET_RESET 结束,有时仅以空字符串结束。相同的请求在 Chrome 上运行没有错误,但在 Firefox 上则不然。我尝试过调整 nginx 配置,但根本没有帮助。感谢您指出,在反向代理上禁用 HTTP3 / QUIC 解决了 Firefox 的问题。看起来 Firefox 中的 XHR 和 QUIC 存在一些问题。

© www.soinside.com 2019 - 2024. All rights reserved.