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

容器化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 01:40:13