Docker部署Nginx+Django时ALLOWED_HOSTS请求受限问题解决
针对两种访问控制场景的API配置调整方案
场景1:允许本地Python客户端调用
Django settings.py 调整
修改ALLOWED_HOSTS,添加本地访问所需的主机/IP:
ALLOWED_HOSTS = [ 'localhost', '127.0.0.1', '0.0.0.0', # 适配Docker容器内服务的网络绑定需求 ]
注:
0.0.0.0让Django服务能绑定到容器的所有网络接口,确保Nginx容器和本地主机可正常请求。
Nginx 配置 (nginx.conf)
在server块中添加本地IP段的允许规则,拒绝其他来源请求:
server { listen 80; server_name _; # 允许本地回环地址、Docker默认桥接网络IP段 allow 127.0.0.1; allow 172.17.0.0/16; deny all; location / { proxy_pass http://django:8000; # 对应docker-compose中Django服务名 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
Docker Compose 调整
限制端口暴露范围,避免API对外公开:
services: django: build: ./django command: python manage.py runserver 0.0.0.0:8000 networks: - api_network # 注释端口映射,仅让内部网络访问Django服务 # ports: # - "8000:8000" nginx: build: ./nginx ports: - "127.0.0.1:80:80" # 仅绑定本地80端口,外部无法直接访问 networks: - api_network depends_on: - django networks: api_network: driver: bridge
场景2:仅允许指定IP地址调用,封禁其余IP
Django settings.py 调整
添加指定客户端IP到ALLOWED_HOSTS,保留容器内部访问配置:
ALLOWED_HOSTS = [ '127.0.0.1', '0.0.0.0', '192.168.1.100', # 替换为你需要允许的客户端IP ]
Nginx 配置 (nginx.conf)
明确指定允许的IP,拒绝所有其他请求:
server { listen 80; server_name _; # 可添加多个allow行,配置多个允许的IP allow 192.168.1.100; # 目标客户端IP allow 127.0.0.1; # 保留本地测试权限(可选) deny all; location / { proxy_pass http://django:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
Docker Compose 调整(可选)
进一步限制Nginx端口的绑定范围:
services: nginx: ports: - "192.168.1.100:80:80" # 仅让指定IP能访问Nginx端口
验证方法
部署后用curl测试规则是否生效:
# 从允许的IP请求,应返回正常响应 curl http://你的API地址/目标端点 # 从禁止的IP请求,应返回403 Forbidden curl http://你的API地址/目标端点
内容的提问来源于stack exchange,提问作者Junaid Ali
相关产品推荐
相关产品推荐

