使用 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教程-9-构建镜像并上传到DockerHub仓库