Kibana 5.5.1 位于 nginx 1.13 代理之后(dockerized)

neu*_*ron 5 proxy nginx docker elastic-stack kibana-5

目标:

我想在 docker 容器中运行 elk 堆栈。能够通过 nginx 代理访问 ELK Stack,以绕过服务的各个端口。

Kibana 服务(默认端口 5601)

http://<server>.com:5601
Run Code Online (Sandbox Code Playgroud)

应可通过以下地址访问:

http://<server>.com/kibana
Run Code Online (Sandbox Code Playgroud)

问题:

问题是,在我将 server.basePath 设置添加到配置后,无法访问 kibana 站点。只有将 Kibana 的每个基本 api 调用添加到 nginx 配置(/api、/ui、...)中,我才能启动该服务。

配置:

Kibana 的配置:

/opt/kibana/config/kibana.yml
Run Code Online (Sandbox Code Playgroud)

有以下条目:

server.host: "0.0.0.0"
server.basePath: "/kibana"
Run Code Online (Sandbox Code Playgroud)

其他一切都是默认的

多库server.basePath

# Enables you to specify a path to mount Kibana at if you are running behind a proxy. This only affects
# the URLs generated by Kibana, your proxy is expected to remove the basePath value before forwarding requests
# to Kibana. This setting cannot end in a slash.
Run Code Online (Sandbox Code Playgroud)

nginx 配置:

location /kibana/ {
  rewrite ^/kibana(/.*)$ $1 break;
  proxy_pass http://<server>.com:5601/;
}
Run Code Online (Sandbox Code Playgroud)

我使用sebp/elk:551 docker 映像和以下 docker-compose 文件:

version: '2'
services:
  elk:
    image: sebp/elk:551
    container_name: "elk"
    volumes:
      - /etc/kibana/config/kibana.yml:/opt/kibana/config/kibana.yml
    ports:
      - "5601:5601"
      - "9200:9200"
      - "5044:5044"
    environment:
      SERVICE_5601_NAME: "kibana"
      SERVICE_9200_NAME: "elasticsearch"
      SERVICE_5044_NAME: "logstash"
    restart: always
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

我在 Kibana 4.6.1 上尝试了相同的设置,它按预期完美运行。

我测试过但不起作用的版本:5.4.3、5.1.2、5.0.2

我不想要什么:

我不想添加 Kibana 的每个子目录,就像/api, /ui, /app/kibana, ...添加到代理配置中一样。

还有其他解决方案或版本吗?

Edit1: @whites11:浏览器从 nginx 返回 502 Bad Gateway 站点。浏览器信息:

一般的

Request URL:http://<server-name>.com/kibana/
Request Method:GET
Status Code:502 Bad Gateway
Remote Address:<server-ip>:80
Referrer Policy:no-referrer-when-downgrade
Run Code Online (Sandbox Code Playgroud)

响应头

Connection:keep-alive
Content-Length:575
Content-Type:text/html
Date:Thu, 24 Aug 2017 13:54:49 GMT
Server:nginx/1.13.3
Run Code Online (Sandbox Code Playgroud)

请求标头

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Host:<server-name>.com
Upgrade-Insecure-Requests:1
Run Code Online (Sandbox Code Playgroud)

从 nginx 登录

34#34: *8 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: <IP>, server: , request: "GET /kibana/ HTTP/1.1", upstream: "http://<server-ip>:5601/", host: "<server-name>.com"
Run Code Online (Sandbox Code Playgroud)

Tar*_*ani -2

首先,接触 Kibana 是没有意义的,因为我们无论如何都会使用 Nginx 作为反向代理。所以放弃你的 server.basePath

接下来更改你的 nginx 配置哟

location /kibana/ {
  proxy_pass http://<server>.com:5601/;
}
Run Code Online (Sandbox Code Playgroud)

这意味着当您访问http://<nginxhost>:<port>/kibana/xyz/abc. 这相当于使用http://<server>.com:5601/xyz/abc. 消除系统的任何复杂性

编辑-1

对于那些认为这不起作用的人来说,事实并非如此。这是我在发布此答案之前设置的示例测试用例。

events {
    worker_connections  1024;
}
http {
server {
   listen 80;

   location /test1 {
     proxy_pass http://127.0.0.1:81;
   }

   location /test2 {
     proxy_pass http://127.0.0.1:81/;
   }

   location /test3/ {
     proxy_pass http://127.0.0.1:81;
   }

   location /test4/ {
     proxy_pass http://127.0.0.1:81/;
   }

}

server {
   listen 81;

   location / {
     echo "$request_uri";
   }
}
}
Run Code Online (Sandbox Code Playgroud)

现在结果解释了所有 4 个位置块之间的差异

$ curl http://192.168.33.100/test1/abc/test
/test1/abc/test

$ curl http://192.168.33.100/test2/abc/test
//abc/test

$ curl http://192.168.33.100/test3/abc/test
/test3/abc/test

$ curl http://192.168.33.100/test4/abc/test
/abc/test
Run Code Online (Sandbox Code Playgroud)