Nginx通过server块+server_name按域名或location按路径前缀区分请求,用proxy_pass反向代理或root托管静态文件,实现多应用共用80端口;需注意proxy_pass末尾斜杠、header传递、语法测试及HTTPS单独配置。

Nginx 实现多个应用共用 80 端口,核心是靠 server 块 + server_name 区分请求来源,再配合 proxy_pass 或 root 分发到不同后端服务。不需要改端口、不暴露内部路径,用户访问 a.com 和 b.com 就像在不同服务器上一样。
按域名区分服务(最常用)
每个 server 块监听 80 端口,但指定不同的 server_name(即域名),Nginx 自动根据 Host 请求头匹配:
-
server_name a.com www.a.com;→ 所有发往 a.com 的请求走这个块 -
server_name b.com www.b.com;→ 所有发往 b.com 的请求走另一个块
匹配后可选择:
- 直接托管静态文件:用
root /path/to/a; index index.html; - 反向代理后端服务:用
proxy_pass http://localhost:3000;(假设 Node.js 在 3000) - 注意
proxy_pass后不能带多余路径(如/api/),否则可能引发路径错位;需配合proxy_set_header传递原始信息
按路径前缀区分服务(单域名多应用)
如果只有一个域名(比如都用 example.com),但想把 /admin/ 和 /api/ 分给不同服务,就不用多个 server,改用 location:
-
location /admin/ { proxy_pass http://localhost:8081/; }(末尾斜杠很重要,会截掉/admin/再转发) -
location /api/ { proxy_pass http://localhost:8082/; } -
location / { root /var/www/frontend; try_files $uri $uri/ /index.html; }(主站 SPA)
配置要点与避坑提醒
-
server_name支持通配符(如*.example.com)和多个值(空格分隔),但不能用正则混写(需用~开头) - 多个
server块中server_name重复也没关系,只要域名不冲突,Nginx 按字面精确匹配优先,通配符次之 - 修改后必须执行
sudo nginx -t测试语法,再sudo systemctl reload nginx生效 - 若用 HTTPS,每个
server块都要单独配ssl_certificate和ssl_certificate_key,不能复用或省略
不复杂但容易忽略











