如何用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
相关产品推荐
相关产品推荐

