配置Nginx后Swagger请求URL缺失端口82的问题求助
解决Nginx反向代理后drf_yasg Swagger请求端口缺失问题
问题分析
核心问题是Nginx反向代理时没把端口信息传给Django服务,导致drf_yasg生成的Swagger请求URL丢了82端口;另外你之前尝试的API_URL并不是drf_yasg控制请求地址的正确配置项。
解决方案
1. 修正Nginx的Host头配置
当前Nginx的proxy_set_header Host $host;只传了主机名,没带端口。修改为:
location /api/v1/swagger/ { proxy_pass http://127.0.0.1:8000/swagger/; # 传递完整的主机+端口信息 proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
如果Nginx是通过listen 82;监听端口,$server_port会自动获取82,确保Django能拿到正确的请求端口。
2. 配置Django信任反向代理头部
在Django的settings.py里加以下配置,让Django识别反向代理传递的头部信息:
# 信任反向代理的Host头 USE_X_FORWARDED_HOST = True # 若用https协议需配置下面一行,http则不需要 # SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
3. 正确配置drf_yasg的服务器地址
在settings.py的SWAGGER_SETTINGS中添加SERVERS配置,明确指定Swagger使用的服务器地址:
SWAGGER_SETTINGS = { # 保留你原有的其他配置 'SERVERS': [ { 'url': 'http://127.0.0.1:82/api/v1/', 'description': '本地开发服务器' } ], # 删掉之前无效的API_URL配置 }
SERVERS是OpenAPI规范定义的服务器地址配置项,drf_yasg会依据这个生成正确的请求URL。
4. 重启服务
- 重启Nginx:
sudo systemctl restart nginx - 重启Django服务(比如Gunicorn/Uwsgi):
sudo systemctl restart 你的Django服务名
做完这些步骤后,Swagger UI发送的请求应该会自动带上82端口,指向正确的http://127.0.0.1:82/api/v1/albums/地址。
内容的提问来源于stack exchange,提问作者Kae K
相关产品推荐
相关产品推荐

