Nginx通过location规则配合proxy_pass实现动静分离:按后缀正则匹配静态资源并本地响应,或按路径前缀(如^~/static/)代理;动态请求交由后端,需注意proxy_pass末尾斜杠、头信息透传、超时设置及规则优先级。

用 proxy_pass 实现静态与动态分流,本质是让 Nginx 自己处理静态资源,只把动态请求转给后端——不是所有请求都转发,而是有选择地“放行”或“转交”。关键不在 proxy_pass 本身有多复杂,而在于它和 location 规则怎么配合。
按后缀匹配静态资源
最常用也最稳妥的方式,是用正则匹配文件扩展名。Nginx 能快速识别常见静态类型,直接从本地磁盘读取并返回,完全不经过后端。
- 写法示例:
location ~* \.(js|css|png|jpg|gif|woff2|svg|ttf|eot)$ { root /var/www/static; expires 1h; } -
~*表示忽略大小写的正则匹配,覆盖 .JS、.Css 等各种写法 -
root指向静态文件根目录,请求/css/app.css就会去找/var/www/static/css/app.css - 搭配
expires或Cache-Control头,浏览器和中间代理都能缓存
按路径前缀区分动静请求
当项目约定清晰(比如所有静态资源放在 /static/ 下),用路径前缀判断更直观,且优先级可控。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 推荐写法:
location ^~ /static/ { alias /var/www/static/; } -
^~表示前缀匹配且优先于正则,避免被后续 location ~ .* 冲突 -
alias和root不同:alias 会把匹配部分完全替换,/static/img/logo.png对应到/var/www/static/img/logo.png - 动态接口如
/api/v1/users、/login可统一交给后端,用location /api/或兜底的location /
proxy_pass 转发动态请求的关键细节
转发本身简单,但路径处理和头信息稍不注意就会出 404 或后端拿不到真实 IP。
- 末尾斜杠决定路径是否被截断:
proxy_pass http://backend/;会去掉匹配的前缀;proxy_pass http://backend;则原样转发完整 URI - 必须透传关键头:
proxy_set_header Host $host;、X-Real-IP $remote_addr;、X-Forwarded-For $proxy_add_x_forwarded_for; - 设好超时,防止后端卡住拖垮 Nginx:
proxy_connect_timeout 5s;、proxy_read_timeout 30s;、proxy_send_timeout 30s; - 建议用
upstream块管理后端地址,便于加权重、健康检查或扩实例
避免常见踩坑点
很多配置上线后出问题,其实就卡在几个看似微小的地方。
- 静态规则要定义在动态规则之前,或用
^~、=提高优先级,否则location /可能先命中,全转给后端 -
/favicon.ico请求高频且小,单独写location = /favicon.ico { log_not_found off; access_log off; }减少日志干扰 - 如果后端依赖原始 Host 头,别漏掉
proxy_set_header Host $host;,否则可能跳转异常或证书校验失败 - 静态目录权限要放开,确保 Nginx worker 进程能读取文件,否则返回 403

















