Nginx反向代理Django DRF遇404,API URL缺失端口求助
解决Nginx反向代理下DRF API 404及URL缺失端口问题
问题根源
你遇到的DRF接口404,本质是反向代理后Django/DRF生成的API链接缺少外部访问端口(8080):点击页面上的无端口链接时,请求会默认走80端口,而你的服务监听的是8080,所以返回404;手动添加端口后能访问,说明后端服务本身是正常的,只是URL生成逻辑错误。
修复步骤
1. 调整Nginx配置,传递完整的主机端口信息
修改Nginx配置,让它把外部访问的端口一并传递给Django容器:
upstream django { server store:27036; } server { listen 8080; location / { proxy_pass http://django; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递包含端口的完整Host头,替代原来的仅$host proxy_set_header Host $host:$server_port; # 显式传递外部端口给Django proxy_set_header X-Forwarded-Port $server_port; proxy_redirect off; } location /static { alias /vol/static; } }
2. 配置Django信任反向代理头
在你的生产环境配置my_app.settings.prod中添加以下设置,让Django正确识别反向代理传递的外部请求信息:
# 启用反向代理头支持,让Django使用X-Forwarded-*头生成正确的外部URL USE_X_FORWARDED_HOST = True # 如果你的服务使用HTTPS,取消下面的注释;HTTP环境可以忽略 # SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 确保ALLOWED_HOSTS包含你访问时用的主机(比如127.0.0.1、localhost) ALLOWED_HOSTS = ['127.0.0.1', 'localhost'] # 也可以保留你原来的环境变量配置 # 确认静态文件根目录配置,对应容器内的挂载路径 STATIC_ROOT = '/vol/web' # 配合store容器的static_data卷挂载,collectstatic会把静态文件放到这里
3. 重启容器生效
修改配置后,重启相关容器让配置生效:
docker-compose restart nginx store
额外检查
- 确保已执行静态文件收集:进入store容器运行
python manage.py collectstatic --noinput,保证静态文件已同步到Nginx能访问的卷中。 - 验证ALLOWED_HOSTS:如果访问时用的是其他IP/域名,要加到ALLOWED_HOSTS里,避免Django返回400错误。
内容的提问来源于stack exchange,提问作者Monk
相关产品推荐
相关产品推荐

