You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:30:51