Docker Compose下Nginx反向代理后端服务转发异常排查
故障根因
现有Nginx配置存在3个核心错误,导致请求无法正常转发:
- rewrite规则使用
last标记,路径重写为根路径/后会重新发起Nginx内部location匹配,不会进入当前location的proxy_pass逻辑,最终请求落到Nginx默认静态文件目录,触发日志中记录的index.html不存在404错误。 - location匹配规则仅写了
/api/search/(带尾斜杠),访问不带尾斜杠的/api/search时Nginx会先返回301跳转到带尾斜杠的地址,额外增加了不必要的跳转逻辑。 - 多余的location嵌套没有实际作用,反而增加了匹配逻辑的复杂度。
实际上Nginx原生支持通过proxy_pass路径写法自动剥离前缀,不需要额外写rewrite规则,稳定性更高。
修复配置
直接替换reverse_proxy.conf文件全部内容为以下配置:
server { listen 80; server_name _; # 匹配所有/api/search开头的请求,包含带/不带尾斜杠的场景 location ^~ /api/search { # 注意末尾必须加斜杠,该配置会自动剥离/api/search前缀再转发 proxy_pass http://meilisearch:7700/; # 透传请求头,保证后端服务获取真实请求信息 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规则抢占proxy_pass地址末尾必须加斜杠,携带/时,Nginx会自动将location匹配到的/api/search前缀替换为/,例如请求/api/search/health转发到后端时会变为/health,正好满足前缀剥离需求,不需要额外rewrite。- 现有
docker-compose.yml配置的网络连通性正常,两个服务在同一个自定义bridge网络下,可以直接通过服务名meilisearch解析到后端地址,无需修改。
配置生效操作
修改完配置文件后,执行以下命令重载服务:
# 先校验Nginx配置语法是否正确 sudo docker-compose exec nginx nginx -t # 语法校验通过后,热重载Nginx配置,无需重启容器 sudo docker-compose exec nginx nginx -s reload
功能验证
执行curl命令测试转发效果:
curl http://localhost/api/search
正常会返回Meilisearch的服务信息响应,不再出现301跳转、404找不到静态文件的错误。
内容的提问来源于stack exchange,提问作者Dr Deo
相关产品推荐
相关产品推荐

