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

如何用Nginx Proxy整合同一服务器上的两个Django虚拟环境

用Nginx Proxy整合main/test环境的配置方案

1. 让Nginx接入两个项目的网络

因为你的main和test项目各有独立的外部网络,Nginx得同时接入这两个网络才能和两边的后端通信。

如果用docker-compose部署Nginx,写个docker-compose.yml:

version: "3.8"
services:
  nginx-proxy:
    image: nginx:alpine
    container_name: nginx-proxy
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/nginx/ssl  # 要搞HTTPS的话,把证书放这里
    networks:
      - main_swag_network
      - test_swag_network

networks:
  main_swag_network:
    external: true  # 对应你main项目里的那个外部网络
  test_swag_network:
    external: true  # 对应test项目的外部网络,和main的配置类似

要是直接用docker命令启动,先接main网络,再连test:

docker run -d --name nginx-proxy --network main_swag_network -p 80:80 -p 443:443 -v ./nginx.conf:/etc/nginx/nginx.conf nginx:alpine
docker network connect test_swag_network nginx-proxy

2. 写Nginx的代理配置

核心是用域名或者路径前缀区分两个环境,下面两种方式选一种就行:

方式一:不同域名区分(推荐)

比如main用main.yourdomain.com,test用test.yourdomain.com,编辑nginx.conf:

http {
  # main环境代理配置
  server {
    listen 80;
    server_name main.yourdomain.com;

    location / {
      proxy_pass http://backend:内部端口;  # 这里的backend是main项目后端容器的名字,用它内部暴露的端口,不用主机映射的端口
      proxy_set_header Host $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;
    }

    # 要是有静态文件(比如Django的static),单独代理
    location /static/ {
      alias /nginx挂载的main静态文件路径/;  # 或者把main项目的static_volume挂载到Nginx容器里,指向对应目录
    }
  }

  # test环境代理配置
  server {
    listen 80;
    server_name test.yourdomain.com;

    location / {
      proxy_pass http://backend-test:内部端口;  # test项目后端容器的名字+内部端口
      proxy_set_header Host $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;
    }

    location /static/ {
      alias /nginx挂载的test静态文件路径/;
    }
  }
}

方式二:路径前缀区分

不想搞多个域名的话,用yourdomain.com/main和yourdomain.com/test来区分:

http {
  server {
    listen 80;
    server_name yourdomain.com;

    location /main/ {
      proxy_pass http://backend:内部端口/;  # 注意末尾的斜杠,不然路径会拼接错
      proxy_set_header Host $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;
    }

    location /test/ {
      proxy_pass http://backend-test:内部端口/;
      proxy_set_header Host $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;
    }
  }
}

3. 验证配置并重启

  • 先检查配置有没有错:docker exec nginx-proxy nginx -t
  • 没问题的话重启Nginx:docker exec nginx-proxy nginx -s reload

几个要注意的点

  • 确保main和test的后端容器名在各自网络里能被解析(Docker容器名默认就是网络内的DNS名称,直接用就行)
  • 别把后端端口暴露到主机,用内部网络通过Nginx代理更安全
  • 要搞HTTPS的话,在Nginx配置里加SSL监听和证书路径就行

内容的提问来源于stack exchange,提问作者Mikhail Turkhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:55:34