使用 Docker 并希望 HTTP 到 HTTPS 使用 NGINX 反向代理到 HTTP Grafana

Posted

技术标签:

【中文标题】使用 Docker 并希望 HTTP 到 HTTPS 使用 NGINX 反向代理到 HTTP Grafana【英文标题】:Using Docker and wanting HTTP to HTTPS using NGINX reverse proxy to HTTP Grafana 【发布时间】:2020-12-30 04:29:50 【问题描述】:

我正在使用 Docker,并为 nginx 和 Grafana 提供单独的容器。我试图最终使与浏览器的连接成为 HTTPS 并能够看到 Grafana 站点。我需要做 3 件事才能做到这一点,但无论我用多少 Google 搜索,我都无法让它发挥作用。

    将所有去往 NGINX 的 HTTP 流量切换到 HTTPS 拥有 NGINX 反向代理,将 HTTPS 流量传输到 Grafana 容器。

这些又在 Docker 容器中。我想将 Docker 网络用于 NGINX 和 Grafana 之间的流量,容器的名称是端口 3000 上的 grafana。

我目前的 NGINX default.conf 为:

    server 
        listen 80;
        listen [::]:80;
        server_name localhost;
        return 301 https://$host$request_uri;
    

    server 
        listen 443 ssl;
        server_name localhost;
        ssl_certificate                 /etc/ssl/certs/nginx-selfsigned.crt; # 
     or /etc/ssl/openhab.crt
        ssl_certificate_key             /etc/ssl/private/nginx-selfsigned.key; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!MD5;
        location / 
            proxy_pass http://grafana/;
        
     

它没有将其发送到 Grafana。它会将 HTTPS 切换到 HTTP,但会停在那里。我正在使用另一台计算机,其主机文件已编辑,mmig.com 将访问这台计算机的 IP 地址。

我可以看到 http://mmig.com 转到 https://mmig.com 然后它停在那里。它不会带我去 Grafana。

运行时出现以下错误。

nginx        | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginx        | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginx        | 10-listen-on-ipv6-by-default.sh: error: can not modify /etc/nginx/conf.d/default.conf (read-only file system?)
nginx        | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
nginx        | /docker-entrypoint.sh: Configuration complete; ready for start up
nginx        | 2020/09/11 17:26:59 [emerg] 1#1: host not found in upstream "grafana" in /etc/nginx/conf.d/default.conf:16
nginx        | nginx: [emerg] host not found in upstream "grafana" in /etc/nginx/conf.d/default.conf:16```


Docker-compose
``` grafana:
    image: grafana/grafana
    container_name: grafana
    restart: always
    depends_on:
     - influxdb
     - nginx
    ports:
     - "3000:3000"
    networks:
     - monitoring
    volumes:
      - grafana-db:/var/lib/grafana
      - grafana-log:/var/log/grafana
      - grafana-conf:/etc/grafana
      - ./certs:/etc/ssl:ro
  nginx:
   image: nginx
   container_name: nginx
   restart: always
   ports:
    - "80:80"
    - "443:443"
   networks:
    - monitoring
   volumes:
    - ./nginx/etc/nginx:/etc/nginx:ro
    - ./certs:/etc/ssl:ro
networks:
  monitoring:

nginx.conf

```
    user  nginx;
    worker_processes  1;

    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;


    events 
        worker_connections  1024;
    


    http 
      include       /etc/nginx/mime.types;
      default_type  application/octet-stream;

      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    upstream grafana 
        server grafana:3000;
    

    include /etc/nginx/conf.d/*.conf;
    
```

这是我当前的 NGINX default.conf 文件,其中 HTTP 转到 HTTPS,但它甚至不会转到默认的 NGINX 主页。我还没弄清楚为什么会这样。

```   server 
        listen       80;
        server_name  localhost;
        return       301 https://$host$request_uri;
    
    server 
        listen       443 ssl;
        server_name  localhost;
    # SSL
        ssl_certificate                 /etc/ssl/certs/nginx-selfsigned.crt; # 
     or /etc/ssl/openhab.crt
        ssl_certificate_key             /etc/ssl/private/nginx-selfsigned.key;

     location / 
            root   /usr/share/nginx/html;
        index  index.html index.htm;
        
     
```

【问题讨论】:

看起来主机名“grafana”没有解析。这两个容器是桥接网络的一部分吗? docs.docker.com/network/bridge/…您是使用 docker-compose 来管理这两个容器,还是只是单独的 docker 命令? 是的,它们是 Docker 中监控网络的一部分。我也在为此使用 docker-compose。这是 Docker-Compose 与这两个容器相关的输出。 你能发布你的 docker-compose.yml 吗?这可能是相关的。 好的,我刚刚也将其添加到我的问题中。如果我没有 HTTPS 部分,它就可以找到将它交给 Grafana。当我在其中添加 HTTPS 时发生了一些事情。所以 HTTP 到 HTTPS 有效,但对 Grafana 无效,HTTP 到 Grafana 反向代理有效,但 HTTP-HTTPS-Grafana 无效。 更多信息可能会有所帮助。我将上游命令移至 nginx.conf 文件。它仍然没有看到它。 2020/09/11 18:05:20 [emerg] 1#1: host not found in upstream "grafana:3000" in /etc/nginx/nginx.conf:32 nginx: [emerg] host not found in upstream "grafana:3000" in /etc/nginx/nginx.conf:32 【参考方案1】:

看起来因为我的主机在 Virtualbox VM 上并且在 NAT 之后,因为另一个 VM 正在使用桥接网络,所以代理通行证被破坏了。我用这个虚拟机设置了另一台计算机,它能够使用桥接网络并且工作得很好。

【讨论】:

以上是关于使用 Docker 并希望 HTTP 到 HTTPS 使用 NGINX 反向代理到 HTTP Grafana的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nginx docker elastic beanstalk中将http重定向到https

第四篇:Docker安装并启动一个http容器

Docker教程-9-构建镜像并上传到DockerHub仓库

裸域和 http 到 https 重定向

如何使用 Traefik 2.0 和 Docker Compose 标签将 http 重定向到 https?

docker拉取自建http镜像仓库