跳转至

子路由与子域名

通过 Nginx 的 443 端口代理多个应用,你可以使用 子路径子域名 来区分每个应用的访问路径。这两种方式都有各自的使用场景。接下来我会分别介绍如何实现:

1. **使用子路径(路径匹配)代理多个应用

通过 Nginx,可以将不同的应用映射到不同的子路径,例如:

  • https://example.com/mapdemo
  • https://example.com/minigame
  • https://example.com/bookmanagement

示例配置:

nginx复制代码server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/cert.crt;
    ssl_certificate_key /etc/nginx/ssl/cert.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # BookManagement 应用在 /bookmanagement 路径下
    location /bookmanagement/ {
        proxy_pass http://127.0.0.1:8001;  # BookManagement 应用通过 Gunicorn 运行在 8001 端口
        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;
    }

    # Minigame 应用在 /minigame 路径下
    location /minigame/ {
        proxy_pass http://127.0.0.1:8002;  # Minigame 应用通过 Gunicorn 运行在 8002 端口
        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;
    }

    # Mapdemo 应用在 /mapdemo 路径下
    location /mapdemo/ {
        proxy_pass http://127.0.0.1:8003;  # Mapdemo 应用通过 Gunicorn 运行在 8003 端口
        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;
    }
}

解释:

  • proxy_pass 指定代理后端应用的位置,多个应用运行在不同的端口。
  • 每个应用都有自己单独的 location 块,用于指定它的访问路径。
  • 子路径 /bookmanagement/, /minigame/, /mapdemo/ 分别映射到不同的后端应用。

注意事项:

  • 后端应用要能够处理前缀路径,确保应用的静态资源、路由等正常工作。你可以通过应用配置或使用 Nginx 进行子路径重写来解决这个问题。

2. 使用子域名代理多个应用

如果你想通过子域名来访问不同的应用,例如:

  • https://mapdemo.example.com
  • https://minigame.example.com
  • https://bookmanagement.example.com

示例配置:

nginx复制代码# BookManagement 应用
server {
    listen 443 ssl;
    server_name bookmanagement.example.com;

    ssl_certificate /etc/nginx/ssl/bookmanagement_cert.crt;
    ssl_certificate_key /etc/nginx/ssl/bookmanagement_cert.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

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

# Minigame 应用
server {
    listen 443 ssl;
    server_name minigame.example.com;

    ssl_certificate /etc/nginx/ssl/minigame_cert.crt;
    ssl_certificate_key /etc/nginx/ssl/minigame_cert.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

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

# Mapdemo 应用
server {
    listen 443 ssl;
    server_name mapdemo.example.com;

    ssl_certificate /etc/nginx/ssl/mapdemo_cert.crt;
    ssl_certificate_key /etc/nginx/ssl/mapdemo_cert.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

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

解释:

  • 每个应用都有自己的子域名,比如 bookmanagement.example.comminigame.example.com 等。
  • 每个子域名指向不同的 proxy_pass 后端应用。
  • SSL 配置也针对每个子域名分别处理。

注意事项:

  • 你需要确保 DNS 设置中为每个子域名创建正确的 A 记录或 CNAME 记录,将其指向服务器的 IP 地址。

3. **SSL 证书配置

如果你使用子域名,建议为每个子域名申请独立的 SSL 证书,或者你可以使用 通配符证书 一次性为所有子域名配置 SSL,例如 *.example.com

使用 Let's Encrypt 为子域名配置免费 SSL,可以参考: sudo certbot --nginx -d example.com -d mapdemo.example.com -d minigame.example.com -d bookmanagement.example.com

4. **重启 Nginx

配置完成后,确保没有配置错误,并重启 Nginx:

sudo nginx -t  # 检查 Nginx 配置是否正确
sudo systemctl restart nginx

总结:

  • 使用 子路径 可以有效利用相同的域名和 SSL 证书,适合项目在同一域名下运行。
  • 使用 子域名 可以为不同的应用分配不同的域名,比较适合将多个独立的项目分开运行。

你可以根据应用的需求选择最适合的方式来配置 Nginx 代理。