kibana server.basePath 结果为 404

kibana server.basePath results in 404

我是 运行 RHEL 7.2 上的 kibana 4.4.1

当 kibana.yml 文件不包含设置 server.basePath 时一切正常。 Kibana成功启动并吐出消息

[info][listening] Server running at http://x.x.x.x:5601/

curl http://x.x.x.x:5601/app/kibana return 是预期的 HTML。

但是,当 basePath 设置为 server.basePath: "/kibana4" 时,http://x.x.x.x:5601/kibana4/app/kibana 会导致 404。为什么?

服务器以相同的日志记录成功启动

[info][listening] Server running at http://x.x.x.x:5601/

但是

curl http://x.x.x.x:5601/ returns

<script>
  var hashRoute = '/kibana4/app/kibana';
  var defaultRoute = '/kibana4/app/kibana';
  ...
</script>

curl http://x.x.x.x:5601/kibana4/app/kibanareturns {"statusCode":404,"error":"Not Found"}

为什么“/kibana4/app/kibana”return 是 404?

server.basePath 不符合我的预期。

我原以为 server.basePath 会对称地影响 URL。这意味着请求 URLs 将在子域 /kibana4 下,响应 URLs 也将在子域 /kibana4.

事实并非如此。 server.basePath 不对称地影响 URL。这意味着所有请求 URL 保持不变,但响应 URL 已包含子域。例如,仍然可以在 http://x.x.x.x:5601/app/kibana 访问 kibana 主页,但所有 hrefs URL 都包含子域 /kibana4.

server.basePath 仅当您使用在将请求转发到 kibana 之前删除子域的代理时才有效

下面是我使用的 HAProxy 配置

frontend main *:80
   acl url_kibana   path_beg   -i /kibana4
   use_backend kibana   if url_kibana

backend kibana
   mode http
   reqrep ^([^\ ]*)\ /kibana4[/]?(.*) \ /\
   server x.x.x.x:5601

重要的一点是 reqrep 表达式,它在将请求转发到 kibana 之前从 URL 中删除了子域 /kibana4。

另外,改完server.basePath后,可能需要修改nginx conf来重写request,否则就不行了。下面是适合我的

        location /kibana/ {
            proxy_pass http://<kibana IP>:5601/; # Ensure the trailing slash is in place!
            proxy_buffering off;
            #proxy_http_version 1.1;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $http_connection;
            #access_log off;
        }