大家好我是舒一笑不秃头,喜欢写作和分享,更多精彩内容~

一句话总结:前端路径前缀、网关转发前缀、后端真实路径 这三件事如果没彻底对齐,线上一定会“随机炸”。
项目原来跑在 /ais,现在要挂到网关 :8000/kb/。
同时后端有两套服务:
188.104.159.164:10003188.104.159.164:8012前端请求统一走 /aiskb/...,再由 Nginx 分发到不同 upstream。
502 Connection refused
原因:容器里转发到了 127.0.0.1:10003,但后端不在容器内。
405 Not Allowed
原因:请求没命中 API location,掉进了静态 location /kb/,POST 被静态资源处理逻辑拒绝。
413 Request Entity Too Large
原因:Nginx 默认 body 太小(常见 1m)。
前端登录页 404
原因:后端返回 Location: /login,但前端实际部署在 /kb/login。
/kb/license/validate 被重写成 /license/validate
原因:rewrite 写猛了,把后端真实需要的 /kb 也干掉了。
预览接口走错后端
原因:/kl/api/saas/element/preview/* 应该去 8012,却被通用规则发到 10003。
以为是 Host 丢失导致 405
结论:不是。405 多数是路由命中错误,不是 Host 头问题。
^~ + 顺序)。proxy_redirect 或兜底重定向兼容。client_max_body_size。upstream ais_backend { server 188.104.159.164:10003;}upstream ais_preview { server 188.104.159.164:8012;}server { listen 8000; server_name _; root /usr/share/nginx/html; index index.html index.htm; client_max_body_size 2g; location = / { return 301 /kb/; } location = /kb { return 301 /kb/; } # 预览服务:必须放在通用 /aiskb/ 之前 location ^~ /aiskb/kl/api/saas/element/preview/ { rewrite ^/aiskb/(.*)$ /$1 break; proxy_pass http://ais_preview; 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 ^~ /aiskb/ { rewrite ^/aiskb/(.*)$ /$1 break; proxy_pass http://ais_backend; proxy_redirect ~^/(login|register|sso|home)(/.*)?$ /kb/$1$2; 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; } # 兼容后端真实需要 /kb 的接口(不要 rewrite 掉 /kb) location ^~ /kb/license/ { proxy_pass http://ais_backend; proxy_redirect ~^/(login|register|sso|home)(/.*)?$ /kb/$1$2; 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; } # 后端静态兼容 location ^~ /kb/ais/ { rewrite ^/kb/(ais/.*)$ /$1 break; proxy_pass http://ais_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; } location ^~ /ais/ { proxy_pass http://ais_backend; proxy_redirect ~^/(login|register|sso|home)(/.*)?$ /kb/$1$2; 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; } # 后端返回 /login 时的前端兼容 location ~ ^/(login|register|sso|home)(/.*)?$ { return 302 /kb$uri$is_args$args; } # 前端 SPA location /kb/ { rewrite ^/kb/(.*)$ /$1 break; try_files $uri $uri/ /index.html; }}413,再排后端 multipart 限制。Location 响应头。这类问题本质不是“会不会写 Nginx”,而是你有没有把 路径语义 设计清楚。
只要把“入口路径、网关路径、后端真实路径、重写规则、优先级”画成一张表,80% 的线上故障都能提前消失。