容器化Nginx代理Django的端口重定向与域名配置问题
解决方案
核心思路是拆分Nginx的server配置块,分别处理HTTP(80)和HTTPS(443)流量,同时针对客户端用HTTP访问HTTPS端口的场景(错误码497),将重定向目标指向容器内部的HTTP服务而非宿主机,既满足TLS证书要求,又不破坏Django的ALLOWED_HOSTS配置。
关键调整说明
- 拆分两个独立server块:分别监听80和443端口,两者
server_name均设为H,完全匹配Django的ALLOWED_HOSTS值,无需修改Django配置。 - 497错误重定向目标改为
http://H:80$request_uri:在Docker内部网络中,H会被解析为当前Nginx容器的80端口(若Nginx容器服务名不是H,可替换为docker-compose中定义的服务名),确保流量在容器网络内部流转,不会跳转到宿主机。 - 保持
proxy_pass指向Django容器的服务地址http://django-host:5000,确保请求正确转发到Django服务。
完整Nginx配置
# 处理HTTP(80)端口请求 server { listen 80; server_name H; root /public/; index index.html; client_max_body_size 2500M; location / { proxy_read_timeout 600s; proxy_set_header Host $http_host; 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; # 动态传递请求协议 proxy_set_header X-Forwarded-Referrer $http_referer; proxy_set_header Referer $http_referer; proxy_cache_bypass $http_upgrade; proxy_pass http://django-host:5000; proxy_redirect off; } } # 处理HTTPS(443)端口请求 server { listen 443 ssl; server_name H; ssl_certificate /etc/nginx/ssl/certs/${NGINX_CERT}; ssl_certificate_key /etc/nginx/ssl/certs/${NGINX_CERT_KEY}; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; root /public/; index index.html; client_max_body_size 2500M; # 处理HTTP访问HTTPS端口的情况,重定向到容器内HTTP服务 error_page 497 http://H:80$request_uri; location / { proxy_read_timeout 600s; proxy_set_header Host $http_host; 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 https; # HTTPS请求固定传递https协议 proxy_set_header X-Forwarded-Referrer $http_referer; proxy_set_header Referer $http_referer; proxy_cache_bypass $http_upgrade; proxy_pass http://django-host:5000; proxy_redirect off; } }
额外注意事项
确保Nginx容器与Django容器处于同一个Docker自定义网络中,这样django-host才能被Docker内部DNS正确解析。若使用docker-compose,只需将两个服务放在同一配置文件中即可自动加入默认网络;若手动创建容器,需通过docker network connect命令将两者加入同一网络。
内容的提问来源于stack exchange,提问作者Demetry Pascal
相关产品推荐
相关产品推荐

