nginx让多个应用共用80或443端口,核心靠按域名(server_name)、路径(location)或后端端口(proxy_pass)区分请求;推荐按域名分发用于正式环境,需确保域名已解析、主配置含include指令、无重复server_name。

Nginx 让多个应用共用 80(或 443)端口,核心靠的是 区分请求来源:要么按域名(server_name),要么按路径(location),要么按后端服务端口(反向代理)。配置不难,关键在逻辑清晰、避免冲突。
按不同域名分发(推荐用于正式环境)
适合多个独立站点,比如 `blog.example.com` 和 `admin.example.com` 每个域名对应一个 `server` 块,监听同一端口,靠 `server_name` 匹配:在 /etc/nginx/conf.d/ 下新建 blog.conf:
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
再建 admin.conf:
server {
listen 80;
server_name admin.example.com;
root /var/www/admin;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
注意:
• 域名必须已解析到该服务器 IP
• 不要遗漏 include /etc/nginx/conf.d/*.conf; 在主配置中
• 同一端口下不能有两个 `server_name _;` 或重复域名
按不同路径分发(适合内部系统或子应用)
适合单页应用嵌套,比如 `/app1/` 和 `/app2/`,前端需配合设置 `publicPath`一个 `server` 块内用 `location` 划分路径:
server {
listen 80;
server_name example.com;
# app1 映射到 /app1/
location /app1/ {
alias /var/www/app1/;
try_files $uri $uri/ /app1/index.html;
}
# app2 映射到 /app2/
location /app2/ {
alias /var/www/app2/;
try_files $uri $uri/ /app2/index.html;
}
}
注意:
• `alias` 末尾必须带 `/`,否则路径拼接会出错
• Vue/React 项目打包时 `publicPath` 要设为 `/app1/` 或 `/app2/`,否则资源加载 404
• `root` 和 `alias` 行为不同,别混用
代理到本地不同端口服务(适合前后端分离或微服务)
适合后端服务已运行在 `8001`、`8002` 等端口,统一由 Nginx 暴露 80 端口例如两个 Spring Boot 服务分别跑在 `localhost:8001` 和 `localhost:8002`:
server {
listen 80;
server_name api1.example.com;
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;
}
}
server {
listen 80;
server_name api2.example.com;
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_pass` 末尾加 `/` 表示路径重写(去掉前缀),不加则保留原路径
• 必须设置 `Host` 和 `X-Real-IP`,否则后端日志和鉴权可能异常
• 后端服务需允许来自 Nginx 的跨域或信任代理头
验证与生效
配完别急着重启,先检查语法:
nginx -t
确认无误后重载配置:
nginx -s reload 或 systemctl reload nginx
浏览器访问对应域名或路径,观察是否返回预期内容。如果 502,重点查后端服务是否运行、端口是否通、`proxy_pass` 地址是否可连。











