Nginx接口Mock分发本质是通过upstream定义Mock服务池,结合location+proxy_pass按路径/域名/请求头精准路由,支持rewrite改写、header透传及静态响应,实现零代码侵入的前后端分离开发与测试。

用 Nginx 做接口 Mock 分发,本质是把请求按规则“骗”到本地或远程的 Mock 服务,而不是真实后端。它不依赖代码改动,适合联调、测试、前端独立开发等场景。关键在于:用 upstream 定义 Mock 服务池,再用 location + proxy_pass 控制路由,配合 proxy_set_header 和 rewrite 灵活改写路径或头信息。
配置 Mock 服务上游(upstream)
先定义一组 Mock 接口提供者,可以是本地 Node.js 服务、Mock.js 服务器、JSON Server,也可以是第三方 Mock 平台(如 Mockoon、Apifox 的本地服务):
- 若 Mock 服务运行在本地 http://127.0.0.1:3001,直接加进 upstream:
upstream mock_api {
server 127.0.0.1:3001;
}- 支持多实例负载均衡(轮询/权重/IP hash),例如接入两个 Mock 环境:
upstream mock_api {
server 127.0.0.1:3001 weight=2;
server 127.0.0.1:3002;
}- 可加健康检查(需启用 ngx_http_upstream_health_check_module 或用商业版);简单场景下,Nginx 默认失败重试已够用。
按路径/域名/请求头精准路由到 Mock
不是所有请求都走 Mock,得区分环境或接口范围。常用方式有:
-
路径前缀匹配:比如所有
/api/mock/开头的请求转 Mock
location ^~ /api/mock/ {
rewrite ^/api/mock/(.*)$ /$1 break;
proxy_pass http://mock_api;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}-
基于请求头分流:前端在请求中加
X-Mock: true,Nginx 判断后转发
map $http_x_mock $mock_target {
"true" "http://mock_api";
default "http://real_backend";
}
<p>location /api/ {
proxy_pass $mock_target;
}-
子域名隔离:用
mock.example.com专门跑 Mock 流量,避免污染主站配置
server {
listen 80;
server_name mock.example.com;
location /api/ {
proxy_pass http://mock_api;
}
}适配 Mock 服务的常见细节处理
真实后端和 Mock 服务的路径、参数、响应格式常不一致,Nginx 可在转发前做轻量转换:
-
重写 URL 路径:真实接口是
/v1/user/info,Mock 服务只认/user,用 rewrite 处理
location /v1/user/ {
rewrite ^/v1/user/(.*)$ /user/$1 break;
proxy_pass http://mock_api;
}-
透传或伪造请求头:Mock 服务可能校验
Authorization或需要固定Content-Type
proxy_set_header Authorization "Bearer mock-token"; proxy_set_header Content-Type "application/json; charset=utf-8";
- 返回静态 JSON(极简 Mock):无需启动服务,直接用 Nginx 返回预置响应
location /api/test {
add_header Content-Type "application/json";
return 200 '{"code":0,"data":{"msg":"mock success"}}';
}与前端开发流程结合的小技巧
让 Mock 分发真正好用,要贴合实际工作流:
- 开发时通过
localhost:8080访问页面,Nginx 把/api/请求代理到本地 Mock;上线前只需注释或切换 upstream 指向真实后端,零代码修改 - 用
include抽离 Mock 配置,不同环境(dev/staging)加载不同 conf 文件 - 配合浏览器插件(如 ModHeader)临时加
X-Mock: true,随时切 Mock/真实,不依赖部署 - 日志中记录是否命中 Mock,便于排查:
log_format mock_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$http_x_mock"';
<p>access_log /var/log/nginx/mock_access.log mock_log;


















