Nginx 基于路径配置多站点(节省端口资源)
现阶段服务器Nginx配置,都基于不同端口,进入不同项目站点。但随项目增加,站点也不断增多,会造成服务器端口资源紧张,且访问时端口记忆不易。
故使用基于路径配置多站点, 可以仅在使用一个主端口后,映射不同的二级子站点(可有意义命名如qfd, surrogate, cmdb等)实现“节省端口资源”的目标,更多的可以“同域名端口”下部署不同路径的项目多版本。
实用场景
- http://www.simapplab.cn:8006 可以访问主站点;
- http://www.simapplab.cn:8006/v1 可以访问历史版本或新开发分支版本;
- http://www.simapplab.cn:8006/docs 可以访问其他站点;
Nginx 配置示例
nginx
server {
listen 1600;
server_name localhost;
# 主站点配置
root "D:/code/qfd/mvt-qfd-quality-client/frontend/dist";
index index.html index.htm;
access_log logs/main.log;
error_log logs/main.log;
location / {
# try_files $uri $uri/ =404;
try_files $uri $uri/ /index.html;
}
# # # # # 基于路径下的二级站点配置
location ^~/qfd {
alias "D:/code/qfd/mvt-qfd-quality-client/frontend/.vscode/dist";
index index.html;
# 默认首页
access_log logs/qfd.log;
error_log logs/qfd.log;
######### API 代理目标地址-1
location ^~ /qfd/userapi/ {
# 代理目标地址(结尾 / 要保留,确保路径拼接正确)
proxy_pass http://xxxx.cn:8053/;
# 反向代理必备的请求头配置
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header REMOTE-HOST $remote_addr;
# 超时和协议配置
proxy_connect_timeout 60s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
}
######### API 代理目标地址-2
location ^~ /qfd/api/ {
# 代理目标地址(结尾 / 要保留,确保路径拼接正确)
proxy_pass http://xxxx.cn:8054/;
# 反向代理必备的请求头配置
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header REMOTE-HOST $remote_addr;
# 超时和协议配置
proxy_connect_timeout 60s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
}
try_files $uri $uri/ /qfd/index.html;
# 注意:兜底路径是 /docs/index.html,不是 /index.html(后者会跳主站点)
# 可选:禁止访问隐藏文件,提高安全性
location ~ /\. {
deny all;
return 404;
}
}
# ========== docs 子目录配置 ==========
location ^~/docs {
# root 路径:打包后的 dist 目录(VitePress 打包后默认输出到 .vitepress/dist)
root "D:/code/wjw/vite_press/docs/.vitepress/dist";
index index.html;
autoindex off; # 显式禁用目录列表
error_page 403 =200 /docs/index.html;
error_page 500 =200 /docs/index.html;
# 核心修复:用 -f 判断文件是否存在(而非 -e),避免目录判断干扰
# 只要请求的不是真实文件,就重写到 /docs/index.html
if (!-f $request_filename) {
rewrite ^/docs/(.*)$ /docs/index.html break;
}
# 兜底规则:确保所有请求都能命中 index.html
try_files $uri $uri/ /docs/index.html;
# 禁止访问隐藏文件
location ~ /\. {
deny all;
return 404;
}
}
}