Kibana4 + nginx 反向代理使用位置 /kibana4/ = 未找到 404

Kibana4 + nginx 反向代理使用位置 /kibana4/ = 未找到 404

我正在尝试设置Kibana4使用 nginx 反向代理,目前部分成功。以下是与 Kibana 相关的配置:

server {
  listen 82;
  server_name ${HOSTNAME};

  set $kibana kibana.docker;

  location /kibana4/ {
    proxy_pass              http://$kibana:5601;
    proxy_set_header        Host $host;
    proxy_set_header        Referer "";
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version      1.1;
    proxy_connect_timeout   150;
    proxy_send_timeout      100;
    proxy_read_timeout      100;
    proxy_buffers           16 64k;
    proxy_busy_buffers_size 64k;
    client_max_body_size    256k;
    client_body_buffer_size 128k;
  }
}

在这种情况下,如果我去,http://localhost:82/kibana4/我会得到未找到 404

但是如果我location /kibana4/用替换location /,则一切都正常 - 当然http://localhost:82在这种情况下 URL 会更改为。

我发现了一些与类似问题相关的其他主题,例如:

在 Web 目录中的 nginx 反向代理后面运行 sinatra 程序 [Kibana]

但那里描述的解决方案对我不起作用。我甚至尝试了这个配置:

server {
  listen 82;
  server_name ${HOSTNAME};

  set $kibana kibana.docker;

  location /kibana4 {
    proxy_pass              http://$kibana:5601/;
    proxy_set_header        Host $host;
    proxy_set_header        Referer "";
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version      1.1;
    proxy_connect_timeout   150;
    proxy_send_timeout      100;
    proxy_read_timeout      100;
    proxy_buffers           16 64k;
    proxy_busy_buffers_size 64k;
    client_max_body_size    256k;
    client_body_buffer_size 128k;
  }
}

它启动了主机代理kibana.docker,但问题是所有 URL 都被重写到同一个 kibana 加载页面。这导致任何 CSS 或 JavaScript 文件都无法正确加载。

我的问题是:有人知道这里可能出了什么问题吗?有人从服务器根目录以外的位置成功运行 Kibana4 吗?非常感谢您的帮助。

答案1

谢谢 HD。您在我之前的帖子下面提问 - 非常有启发性。它帮助我意识到问题所在。我总是忘记位置部分也会传递给代理,这就是为什么在我的情况下必须重写它。正确的配置应该是这样的:

  location ~ ^/kibana4/(.*)$ {
    rewrite /kibana4/(.*) /$1  break;
    proxy_pass              http://$kibana:5601;
    proxy_set_header        Host $host;
    proxy_set_header        Referer "";
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version      1.1;
    proxy_connect_timeout   150;
    proxy_send_timeout      100;
    proxy_read_timeout      100;
    proxy_buffers           16 64k;
    proxy_busy_buffers_size 64k;
    client_max_body_size    256k;
    client_body_buffer_size 128k;
  }

这也解释了为什么location /如果没有rewrite部分,设置仍能正常工作。添加后rewrite,只有其余部分会传递给代理,并且效果很好。

再次感谢您,我学到了教训:-)

答案2

虽然来晚了,但我想在这里为 Apache 留下一个令人满意的解决方案,因为我找不到它们。对我来说,从子目录进行代理工作的方法是在 ProxyPass 目录后添加一个尾部斜杠:

ProxyPass /kibana/ http://localhost:5601/
ProxyPassReverse /kibana/ http://localhost:5601/

看这里:

http://www.marathon-studios.com/blog/solved-kibana-5-not-loading-404ing-when-reverse-proxying-in-a-subdirectory/

答案3

从 Kibana 6.3 开始,设置现在可在kibana.yml

server.host: "example.com"
server.basePath: "/tools/kibana"
server.rewriteBasePath: true

这将在以下位置提供应用程序:http://example.com/tools/kibana包含 Kibana UI 中的所有链接

相关内容