插件窝 干货文章 Docker中如何使用Nginx代理多个应用站点

Docker中如何使用Nginx代理多个应用站点

proxy Nginx app header 268    来源:    2025-04-26

使用Docker和Nginx代理多个应用站点

在Docker环境中使用Nginx作为反向代理来服务多个应用站点是一种常见的部署方式。以下是详细的实现方法:

基本架构

  1. 每个应用运行在自己的容器中
  2. Nginx作为主反向代理运行在单独的容器中
  3. 通过不同的域名或路径将请求路由到不同的应用容器

实现步骤

1. 准备应用容器

假设你有两个应用: - 一个Node.js应用(监听3000端口) - 一个Python Flask应用(监听5000端口)

为每个应用创建Docker容器,可以通过docker-compose.yml来管理:

version: '3'

services:
  node-app:
    image: your-node-app-image
    ports:
      - "3000:3000"
    networks:
      - app-network

  flask-app:
    image: your-flask-app-image
    ports:
      - "5000:5000"
    networks:
      - app-network

  nginx-proxy:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./certs:/etc/nginx/certs
    depends_on:
      - node-app
      - flask-app
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

2. 配置Nginx

创建nginx.conf文件,配置多个站点的代理:

events {
    worker_connections 1024;
}

http {
    upstream node-app {
        server node-app:3000;
    }

    upstream flask-app {
        server flask-app:5000;
    }

    server {
        listen 80;
        server_name nodeapp.example.com;

        location / {
            proxy_pass http://node-app;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

    server {
        listen 80;
        server_name flaskapp.example.com;

        location / {
            proxy_pass http://flask-app;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

3. 基于路径的路由(替代子域名)

如果你想通过路径而不是子域名来区分应用:

server {
    listen 80;
    server_name example.com;

    location /nodeapp/ {
        proxy_pass http://node-app/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /flaskapp/ {
        proxy_pass http://flask-app/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

4. 添加HTTPS支持

使用Let's Encrypt证书:

server {
    listen 443 ssl;
    server_name nodeapp.example.com;

    ssl_certificate /etc/nginx/certs/nodeapp.example.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/nodeapp.example.com/privkey.pem;

    location / {
        proxy_pass http://node-app;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    listen 80;
    server_name nodeapp.example.com;
    return 301 https://$host$request_uri;
}

5. 使用docker-compose启动

docker-compose up -d

高级配置选项

  1. 负载均衡:在upstream块中添加多个服务器实例
  2. 缓存控制:添加proxy_cache指令
  3. WebSocket支持:添加特定的WebSocket代理头
  4. 健康检查:配置主动或被动健康检查
  5. 访问控制:限制IP访问或添加基本认证

替代方案:使用nginx-proxy自动配置

如果你不想手动配置Nginx,可以使用jwilder/nginx-proxy自动生成配置:

version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs

  node-app:
    image: your-node-app-image
    environment:
      - VIRTUAL_HOST=nodeapp.example.com
    networks:
      - app-network

  flask-app:
    image: your-flask-app-image
    environment:
      - VIRTUAL_HOST=flaskapp.example.com
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

这种方法会自动检测新容器并根据VIRTUAL_HOST环境变量生成Nginx配置。

希望这个指南能帮助你在Docker环境中使用Nginx代理多个应用站点!