Skip to content

Nginx 基于路径配置多站点(节省端口资源)

现阶段服务器Nginx配置,都基于不同端口,进入不同项目站点。但随项目增加,站点也不断增多,会造成服务器端口资源紧张,且访问时端口记忆不易。

故使用基于路径配置多站点, 可以仅在使用一个主端口后,映射不同的二级子站点(可有意义命名如qfd, surrogate, cmdb等)实现“节省端口资源”的目标,更多的可以“同域名端口”下部署不同路径的项目多版本。

实用场景

  1. http://www.simapplab.cn:8006 可以访问主站点;
  2. http://www.simapplab.cn:8006/v1 可以访问历史版本或新开发分支版本;
  3. 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;
        }
    }

}