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
相关产品推荐
相关产品推荐

