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

Nginx auth_request第二次请求超时:/novnc/正常 /vncproxy/返回504

原因分析与解决方案

1 单线程开发服务器阻塞(最高概率)

Django 自带的 runserver 开发服务器默认是单线程工作模式,首次处理 /novnc-auth 认证请求后,novnc 建立的 WebSocket 长连接会持续占用唯一的工作线程,后续 /vncproxy/ 路径触发的 auth_request 认证请求无法被服务端接收处理,直接超时。
解决方法:

  • 开发环境启动时开启多线程:python manage.py runserver --threading
  • 生产/测试环境使用多进程/多线程的 WSGI/ASGI 服务器(如 Gunicorn、Uvicorn)替代 runserver。

2 auth_request 子请求头缺失

nginx auth_request 发起的子请求默认会剥离原请求的多数请求头,若依赖的 novnc Cookie 未被透传,会导致 Django 侧逻辑异常卡住。
解决方法:修改 /novnc-auth 配置块,主动透传必要请求头:

location = /novnc-auth {
    internal;
    proxy_pass http://127.0.0.1:8000/api/proxmox/novnc-connection-lookup/$cookie_novnc/;
    proxy_pass_request_headers on;
    proxy_set_header Cookie $http_cookie;
    # 统一子请求为GET方法,兼容原请求为POST/WebSocket的场景
    proxy_method GET;
}

3 跨域AJAX未携带Cookie

如果弹窗页面与 /vncproxy/ 接口存在跨域,浏览器默认不会在AJAX请求中携带Cookie,导致 $cookie_novnc 为空,Django侧逻辑异常。
解决方法:

  • 前端AJAX请求配置 withCredentials: true
  • Django 侧配置 CORS_ALLOW_CREDENTIALS = True,明确配置允许的跨域源,不可使用通配符 *。

4 重复认证导致性能瓶颈

相同novnc Cookie对应的认证结果是固定的,每次请求都重复发起认证会增加服务端负载,高并发下容易触发超时。可以开启nginx认证缓存减少重复请求:

# http块中新增缓存配置
http {
    proxy_cache_path /var/cache/nginx/auth_cache levels=1:2 keys_zone=auth_cache:10m max_size=100m inactive=60s use_temp_path=off;

    location = /novnc-auth {
        internal;
        proxy_pass http://127.0.0.1:8000/api/proxmox/novnc-connection-lookup/$cookie_novnc/;
        proxy_cache auth_cache;
        proxy_cache_key $cookie_novnc;
        proxy_cache_valid 200 60s;
        proxy_pass_request_headers on;
        proxy_set_header Cookie $http_cookie;
        proxy_method GET;
    }
}

内容的提问来源于stack exchange,提问作者James Lin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:06:02