子路由与子域名
通过 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.com
,minigame.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 代理。