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

如何禁止直接访问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设置的反向代理头:

  1. 在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
  1. 在项目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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:08:03