NGINX多站点部署:如何仅代理上游API请求不代理静态资源
NGINX 单域名多Angular站点静态资源+API代理配置方案
核心逻辑是利用NGINX的location匹配优先级,将API请求和静态资源请求拆分处理:匹配精度更高、带^~修饰符的API规则会优先命中,不会落到静态资源的alias规则上,两类请求互不干扰。
具体配置步骤
- 首先在server块外定义Tomcat的上游服务池
upstream tomcat_backend { server 你的Tomcat服务IP:端口; # 比如127.0.0.1:8080 keepalive 32; }
- 在server块内,把API代理规则写在静态资源规则的前面,确保优先匹配。以下是完整的server块参考配置:
server { listen 443 http2 ssl; server_name site.local; # 省略SSL证书、日志、上传大小限制等全局配置 # site1 API请求代理规则 # ^~ 修饰符表示匹配到该前缀后不再检索其他正则/低优先级规则 location ^~ /site1/api/ { # 重写路径,去掉URL里的/site1前缀,还原成Tomcat实际的接口路径 rewrite ^/site1/(.*)$ /$1 break; proxy_pass http://tomcat_backend; # 通用代理请求头配置 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; } # site2 API请求代理规则 location ^~ /site2/api/ { rewrite ^/site2/(.*)$ /$1 break; proxy_pass http://tomcat_backend; 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; } # 静态资源处理规则,仅非API请求会走到这里 location /site1 { alias /usr/share/nginx/html/site1/dist/; # 替换为site1打包文件的实际存放路径 index index.html; # 适配Angular单页应用路由,解决页面刷新404问题 try_files $uri $uri/ /site1/index.html; } location /site2 { alias /usr/share/nginx/html/site2/dist/; # 替换为site2打包文件的实际存放路径 index index.html; try_files $uri $uri/ /site2/index.html; } }
注意事项
- 上述配置默认前端所有API请求带统一
/api前缀,如果你的项目用的是其他标识(比如/rest、/service),直接替换location匹配的路径即可。如果前端接口没有统一前缀,必须先和前端约定加统一前缀,否则NGINX无法区分同一前缀下的请求是静态资源还是接口,规则无法生效。 - 之前直接在/site1的location块里配置proxy_pass导致静态资源被代理,是因为
location /site1会匹配所有以/site1开头的请求,不管是静态资源还是接口,全部转发给上游服务,自然会导致静态资源加载失败。 - 配置修改完成后先执行
nginx -t检查语法是否正确,确认无报错后执行nginx -s reload重载配置即可生效。
内容的提问来源于stack exchange,提问作者harrys
相关产品推荐
相关产品推荐

