【问题标题】:NGINX - reverse proxy for Kibana using HTTPSNGINX - 使用 HTTPS 的 Kibana 反向代理
【发布时间】:2022-01-11 03:46:42
【问题描述】:

我在 Ubuntu Server 的 Docker 上安装了 Elastic Stack(Logstash、Elasticsearch 和 Kibana)。 所有容器都在一个桥接模式下的 docker 网络中。我在 Kibana 配置文件中强制使用 SSL,所以只能使用 HTTPS 打开。在本地 DNS 中,我添加了一个条目 kibana.home.com(home.com 只是示例),指向服务器的 IP 地址。通过在网络浏览器中输入https://kibana.home.com:5601,Kibana 页面打开,一切正常。

当我想保护服务器时,问题就开始了。 我需要端口 5601 不能从外部访问,并且所有网络流量都需要通过反向代理。 我尝试使用 Nginx 来实现,但我之前从未使用过 Nginx。可能我做错了什么。我将 Nginx 安装添加到 docker-compose 文件中,并创建了以下 Nginx 配置文件:

server {
        listen 443 ssl http2;

        ssl_certificate /etc/ssl/certs/nginx/certificate.crt;
        ssl_certificate_key /etc/ssl/certs/nginx/privateKey.key;

        location / {
            proxy_pass         https://kibana:5601;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
    }
    

Docker 编写文件:

version: '3.2'

services:

  nginx:
    build:
      context: nginx/
    ports:
      - "80:80"
      - "443:443"
    networks:
      - elk

  elasticsearch:
    build:
      context: elasticsearch/
      args:
        ELK_VERSION: $ELK_VERSION
        HOST_DNS: $HOST_DNS
    volumes:
      - type: bind
        source: ./elasticsearch/config/elasticsearch.yml
        target: /usr/share/elasticsearch/config/elasticsearch.yml
        read_only: true
      - type: volume
        source: elasticsearch
        target: /usr/share/elasticsearch/data
      - type: bind
        source: ./elasticsearch/templates/
        target: /usr/share/elasticsearch/templates/
        read_only: true
      - type: volume
        source: certs
        target: /usr/share/elasticsearch/config/certs
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xms4g -Xmx4g"
      ELASTIC_PASSWORD: Examplepass1
      discovery.type: single-node
    networks:
      - elk

  logstash:
    build:
      context: logstash/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./logstash/config/logstash.yml
        target: /usr/share/logstash/config/logstash.yml
        read_only: true
      - type: bind
        source: ./logstash/config/pipelines.yml
        target: /usr/share/logstash/config/pipelines.yml
        read_only: true
      - type: bind
        source: ./logstash/pipeline
        target: /usr/share/logstash/pipeline
        read_only: true
      - type: bind
        source: ./logstash/templates
        target: /usr/share/logstash/templates
      - type: volume
        source: certs
        target: /usr/share/logstash/config/certs
      - type: bind
        source: ./logstash/mib
        target: /usr/share/logstash/mib
    ports:
      - "5000:5000"
      - "5044:5044"
      - "9600:9600"
      - "5514:5514"
    environment:
      LS_JAVA_OPTS: "-Xmx512m -Xms512m"
    networks:
      - elk
    depends_on:
      - elasticsearch

  kibana:
    build:
      context: kibana/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./kibana/config/kibana.yml
        target: /usr/share/kibana/config/kibana.yml
        read_only: true
      - type: bind
        source: ./kibana/index-pattern/
        target: /usr/share/kibana/index-pattern/
        read_only: true
      - type: volume
        source: certs
        target: /usr/share/kibana/config/certs
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - elasticsearch

networks:
  elk:
    driver: bridge

volumes:
  elasticsearch:
  certs:

不幸的是,当我尝试连接(使用 DNS 和 IP 地址)时,我收到 501 Bad Gateway 消息。你能解释一下我做错了什么吗?我想像这样配置所有内容:

Connection Diagram Image

【问题讨论】:

  • kibana 不需要开启 SSL,nginx 会做 SSL 终止。显示您的 docker-compose.yml 文件。
  • @IvanShatsky 当然。我在主线程中添加了 docker-compose 文件内容(评论太长了)。
  • 您的问题在 StackOverflow 中是题外话。如果您将其移至Unix & LinuxSuperuser,您将更有机会得到答复。

标签: docker elasticsearch nginx kibana


【解决方案1】:

要使端口 5601 无法从外部访问,您应该从 kibana 服务中删除以下参数:

ports:
   -"5601:5601"

要让您的 3 个服务可以通过单独的子域访问,您应该在 nginx 配置中为每个子域创建单独的 3 个服务器块,如下所示:

server {
...
   server_name kibana.home.com;
...
}

server {
...
   server_name elastic.home.com;
...
}

server {
...
   server_name logstash.home.com;
...
}

here提到的,可以开启nginx调试。

【讨论】:

  • 感谢您的回复。该域仅作为指向服务器 IP 地址的 A 记录添加到本地 DNS 端。我还没有删除端口 5601,因为如果我这样做了,我将无法访问 Kibana,直到我正确设置 Nginx。将server_name kibana.home.com; 添加到配置文件没有帮助。
  • 执行 docker logs [NGINX_CONTAINER_NAME] 命令的结果是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 2017-08-25
  • 1970-01-01
  • 2017-01-18
  • 2021-04-06
  • 2016-01-09
  • 1970-01-01
相关资源
最近更新 更多