Nginx反向代理Elasticsearch带/elasticsearch路径访问报404错误咨询
你遇到的404报错本质是两层规则不匹配导致的:
- Elasticsearch的默认路由规则:会把HTTP请求路径的第一级非空路径段,直接识别为要访问的索引/别名名称,没有额外路径前缀的兼容逻辑。
- 你当前Nginx的
proxy_pass写法会把用户的原始请求路径完整透传给后端Elasticsearch。也就是说你访问https://<nginx_server>/elasticsearch时,ES实际收到的请求是GET /elasticsearch,自然会把elasticsearch当成索引名去匹配,找不到对应索引就抛出了报错里的index_not_found_exception。
关于你提到找不到的basePath、rewriteBasePath配置:这部分是你记错了配置名称,Elasticsearch原生并没有rewriteBasePath这个配置项,用来适配反向代理路径前缀的原生配置是http.base_path,从7.x版本开始内置支持,不需要额外安装插件。
因为你当前场景无法使用子域名配置,有两种可落地的修改方式,可根据需求选择:
方案1:调整Nginx转发规则,自动替换路径前缀
这是不需要修改Elasticsearch配置的最小改动方案,只要把Nginx的location和proxy_pass的斜杠配对调整对,让Nginx自动把/elasticsearch这段前缀剥掉再转发给后端即可。
修正后的配置如下:
location /elasticsearch/ { # 注意proxy_pass末尾必须加斜杠,才能触发路径替换逻辑 proxy_pass http://localhost:9200/; proxy_http_version 1.1; proxy_set_header Host $host; # 补充长连接所需的请求头,避免ES的流式查询、监听接口断连 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_cache_bypass $http_upgrade; }
调整后,你访问https://<nginx_server>/elasticsearch/时,ES实际收到的请求是GET /,会正常返回集群的基础信息,不会再触发索引查找逻辑。
注意:这个方案的小缺陷是Elasticsearch本身不知道自己被部署在子路径下,返回的接口自链接(比如文档的_self地址、搜索分页链接)会是根路径格式,前端调用时需要手动拼接/elasticsearch前缀,不然会出现404。
方案2:给Elasticsearch配置全局基础路径
如果想要让ES自动返回带正确前缀的链接,直接在elasticsearch.yml中添加以下配置即可:
http.base_path: /elasticsearch
配置完成后重启Elasticsearch,此时ES会自动给所有接口加上/elasticsearch的路径前缀,你原来写的不带斜杠的Nginx配置可以直接复用,不需要做修改。ES收到/elasticsearch开头的请求时,会自动剥掉前缀匹配对应的路由逻辑,返回的所有自链接也会自动带上正确的前缀,不需要前端额外处理。
你之前观察到的“用子域名配置server_name就不会出问题”是完全正确的——子域名场景下请求没有额外的路径前缀,后端ES收到的路径从根路径/开始,完全符合ES的默认路由规则,自然不会出现把路径段当成索引名的报错。
内容的提问来源于stack exchange,提问作者stewchicken

