如何禁止直接访问Django(Gunicorn)服务,强制走Nginx反向代理?
解决Gunicorn直接暴露端口问题,强制通过Nginx访问
步骤1:修改Gunicorn绑定地址,限制仅本地访问
当前你的Gunicorn命令绑定了0.0.0.0,导致服务器所有网卡的8000端口对外开放。将绑定地址改为本地回环地址,让Gunicorn只接受服务器内部的请求(比如Nginx的转发请求):
修改后的Gunicorn启动命令:
gunicorn --bind 127.0.0.1:8000 --forwarded-allow-ips="*" partyapp.wsgi:application --access-logfile - --error-logfile - --log-level debug
127.0.0.1:8000表示Gunicorn仅监听服务器本地的8000端口,外部用户直接访问http://{IP}:8000会被拒绝连接。
步骤2:(可选增强)在Django中添加反向代理验证
为进一步确保请求来自Nginx(防止服务器内部未授权进程直接访问Gunicorn),可在Django中添加自定义中间件,检查请求是否携带Nginx设置的反向代理头:
- 在Django项目根目录创建
middleware.py文件,写入以下代码:
from django.http import HttpResponseForbidden class ProxyOnlyMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 检查请求是否包含Nginx设置的X-Forwarded-Host头 if not request.META.get('HTTP_X_FORWARDED_HOST'): return HttpResponseForbidden("请通过反向代理访问服务") response = self.get_response(request) return response
- 在项目
settings.py的MIDDLEWARE列表中添加该中间件(建议放在靠前位置):
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', # 替换为你的项目名称 'your_project_name.middleware.ProxyOnlyMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # 其他原有中间件... ]
步骤3:重启服务使配置生效
修改完成后,重启Gunicorn和Nginx服务:
- 重启Gunicorn(若使用systemd管理):
sudo systemctl restart gunicorn
- 重启Nginx:
sudo systemctl restart nginx
完成以上操作后,外部用户只能通过http://{IP}(Nginx监听的80端口)访问服务,直接访问http://{IP}:8000会被拒绝,实现强制通过反向代理访问的需求。
内容的提问来源于stack exchange,提问作者Eloi
相关产品推荐
相关产品推荐

