kginana 5.5.1落后于nginx 1.13代理(dockerized)

时间:2017-08-17 08:51:38

标签: docker nginx proxy elastic-stack kibana-5

目标:

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

Kibana服务(默认端口5601)

http://<server>.com:5601

应该可通过以下地址访问:

http://<server>.com/kibana

问题:

问题是,在将server.basePath设置添加到配置后,无法访问kibana站点。如果我将每个基本api调用Kibana添加到nginx配置(/ api,/ ui,...),我只能调出服务。

配置:

Kibana的配置:

/opt/kibana/config/kibana.yml

具有以下条目:

server.host: "0.0.0.0"
server.basePath: "/kibana"

其他一切都是默认的

Doku 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.

nginx配置:

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

我使用sebp/elk:551泊坞窗图片和以下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

我尝试了什么:

我尝试过与Kibana 4.6.1相同的设置,并且按预期完美运行。

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

我不想要的东西:

我不想添加像/api, /ui, /app/kibana, ...这样的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

响应标头

Connection:keep-alive
Content-Length:575
Content-Type:text/html
Date:Thu, 24 Aug 2017 13:54:49 GMT
Server:nginx/1.13.3

请求标题

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

从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"

3 个答案:

答案 0 :(得分:1)

我没有和你完全一样的部署,但我使用的是一个码头化的kibana。

首先,您需要在nginx设置中使用以下内容:

    location /kibana/ {
      proxy_pass http://kibana_server:5601/;
    }

根据您的环境更改值,但最终的斜线至关重要!不要删除它们!他们确保按照Kibana的预期完成重写 - 例如,kibana从请求中的URL中移除到kibana服务器。

然后保持以下内容:

server.basePath: /kibana

在你的kibana设置中。这可确保kibana(链接和网址)提供的文档具有前缀/kibana

它对我有用。

答案 1 :(得分:0)

我花了几个小时来解决这个问题。基本上,如果您在nginx后面运行kibana,则应设置环境变量SERVER_BASEPATH = / yourpath

nginx配置:

upstream kibana {
    server kibana:5601;
}

server {
    listen 80;

    location /kibana/ {
        rewrite /kibana/(.*) /$1 break;
        proxy_pass http://kibana/;
    }
}

在docker-compose中设置Kibana:

kibana:
image: kibana:7.7.1
ports:
  - "5601:5601"    # Important: In a production environment remove external port
environment:
  - ELASTICSEARCH_URL=http://elasticsearch:9200
  - SERVER_BASEPATH=/kibana
depends_on:
  - elasticsearch
networks:
  - backend

注意:elasticsearch是docker-compose文件中的另一项服务。

检查实现以获取更多详细信息:https://github.com/Jamaxack/Kangaroo

答案 2 :(得分:-2)

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

接下来将你的nginx配置改为

location /kibana/ {
  proxy_pass http://<server>.com:5601/;
}

当您访问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";
   }
}
}

现在结果解释了所有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