Docker 部署 Nginx 实现多级子域名映射不同 Web 项目

在现代 web 开发中,使用 Nginx 代理不同的子域名到相应的 web 项目是一个常见的需求。本文将详细介绍如何在 Docker 中部署 Nginx,并配置多级子域名(如三级、四级域名)映射到不同的 web 项目路径。

一、准备工作

1. Docker 和 Docker Compose 安装

确保系统已安装 Docker 和 Docker Compose。如果尚未安装,可以参考官方文档进行安装:

2. 创建项目目录

创建一个项目目录,并在其中创建 Nginx 配置文件和 Docker Compose 文件:

mkdir nginx-multi-domain
cd nginx-multi-domain

二、创建 Nginx 配置文件

在项目目录下创建一个名为 nginx.conf 的文件,用于定义 Nginx 的配置。

touch nginx.conf

编辑 nginx.conf 文件,添加以下内容:

events {}

http {
    server {
        listen 80;

        server_name sub1.example.com;

        location / {
            proxy_pass http://web1:80;
            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;
        }
    }

    server {
        listen 80;

        server_name sub2.example.com;

        location / {
            proxy_pass http://web2:80;
            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;
        }
    }

    server {
        listen 80;

        server_name sub3.sub2.example.com;

        location / {
            proxy_pass http://web3:80;
            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;
        }
    }
}

上述配置文件中定义了三个服务器块,每个块对应一个子域名,并将请求代理到不同的 web 服务。

三、创建 Docker Compose 文件

在项目目录下创建一个名为 docker-compose.yml 的文件,用于定义 Docker 服务。

touch docker-compose.yml

编辑 docker-compose.yml 文件,添加以下内容:

version: '3'

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - web1
      - web2
      - web3

  web1:
    image: nginx:latest
    container_name: web1
    volumes:
      - ./web1:/usr/share/nginx/html

  web2:
    image: nginx:latest
    container_name: web2
    volumes:
      - ./web2:/usr/share/nginx/html

  web3:
    image: nginx:latest
    container_name: web3
    volumes:
      - ./web3:/usr/share/nginx/html

在这个文件中,我们定义了四个服务:nginx、web1、web2 和 web3。nginx 服务作为反向代理,其他三个服务作为 web 服务,并挂载到本地不同的目录。

四、准备 Web 项目目录

在项目目录下创建三个子目录,分别用于存放三个 web 项目的文件:

mkdir web1 web2 web3

在每个目录下创建一个 index.html 文件,用于测试:

echo "Welcome to web1" > web1/index.html
echo "Welcome to web2" > web2/index.html
echo "Welcome to web3" > web3/index.html

五、启动服务

在项目目录下运行以下命令启动 Docker Compose 服务:

docker-compose up -d

该命令将启动所有定义的服务,并在后台运行。

六、验证配置

确保 DNS 或 /etc/hosts 文件中正确配置了子域名指向本机 IP 地址,例如:

127.0.0.1 sub1.example.com
127.0.0.1 sub2.example.com
127.0.0.1 sub3.sub2.example.com

在浏览器中访问以下 URL,验证每个子域名是否正确映射到相应的 web 项目:

七、总结

本文详细介绍了如何在 Docker 中部署 Nginx,实现多级子域名映射到不同的 web 项目路径。通过合理配置 Nginx 和 Docker Compose,可以轻松管理和扩展多域名、多项目的 web 服务。希望通过本文的步骤,您能顺利完成多级子域名的配置和部署。