gpt4 book ai didi

docker - Portainer:客户端向 HTTPS 服务器发送 HTTP 请求 - 尽管 URL 是 https://

转载 作者:行者123 更新时间:2023-12-04 22:39:32 27 4
gpt4 key购买 nike

我对主题服务器配置非常陌生,现在我遇到了使用 ssl 证书访问容器的问题。
我的设置是什么:
我有一个带有 docker 的树莓派。连接到端口 80 和 443 的容器是一个反向代理,它将传入的子域定向到不同的其他容器。
例子:
webserver.my-domain.com 指向 IP 192.168.178.69:8080。我通过此配置将其存档在文件夹 sites-enabled 中:

<VirtualHost *:80>
ServerName webserver.my-domain.com
ProxyPreserveHost On
DocumentRoot /var/www/html
ProxyPass /.well-known !
ProxyPass / http://192.168.178.69:8080/
ProxyPassReverse / http://192.168.178.69:8080/
RewriteEngine on
RewriteCond %{SERVER_NAME} =webserver.my-domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
我还在反向代理容器内创建了一个让我们加密的证书。这创建了一个附加文件 webserver-le-ssl.conf :
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName webserver.my-domain.com
ProxyPreserveHost On
DocumentRoot /var/www/html
ProxyPass /.well-known !
ProxyPass / http://192.168.178.69:8080/
ProxyPassReverse / http://192.168.178.69:8080/

SSLCertificateFile /etc/letsencrypt/live/my-domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/my-domain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
到目前为止,一切都很好。如果我尝试 URL https://webserver.my-domain.com,我的内容是可用的.
我的问题是什么
我使用 Portainer 来管理我的 docker 容器,我希望 Portainer 可以通过 portainer.my-domain.com 使用。 .
所以这是 sites-enabled 内部的搬运工配置:
<VirtualHost *:80>
ServerName portainer.my-domain.com
ProxyPreserveHost On
DocumentRoot /var/www/html
ProxyPass /.well-known !
ProxyPass / http://192.168.178.69:9443/
ProxyPassReverse / http://192.168.178.69:9443/
RewriteEngine on
RewriteCond %{SERVER_NAME} =portainer.my-domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
还有用于此的 ssl 配置:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName portainer.my-domain.com
ProxyPreserveHost On
DocumentRoot /var/www/html
ProxyPass /.well-known !
ProxyPass / http://192.168.178.69:9443/
ProxyPassReverse / http://192.168.178.69:9443/

SSLCertificateFile /etc/letsencrypt/live/my-domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/my-domain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
如果我调用 192.168.178.69:9443/我可以毫无问题地到达容器。
但如果我尝试访问 URL portainer.my-domain.com我刚收到消息:
Client sent an HTTP request to an HTTPS server.
但在网址中显示: https://portainer.my-domain.com/ .
所以我不明白为什么会有 HTTP 请求,即使我的浏览器显示连接是使用 https。
有人可以向我解释一下并告诉我如何解决这个问题吗?
更新:我的解决方案
经过多次尝试,我找到了解决方案:
当我将反向代理和 portainer 作为 docker 容器运行时,我将这两个容器都放入了带有 docker-compose 的网络中:
version: "3.4"

services:
apache:
build:
context: .
dockerfile: Dockerfile
ports:
- "80:80"
- "443:443"
volumes:
- /home/pi/reverse-proxy/:/etc/apache2
networks:
- homeserver

portainer:
image: portainer/portainer-ce:latest
ports:
- "8000:8000"
- "9000:9000"
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
networks:
- homeserver

networks:
homeserver:

volumes:
portainer_data:
apache2的体积是 /etc/apache2的完整配置文件夹.之后,我将 ProxyPass 的 IP 更改为容器的名称:
 ProxyPass / http://reverse-proxy_portainer_1:9000/
ProxyPassReverse / http://reverse-proxy_portainer_1:9000/
在此更改之后,它起作用了。

最佳答案

所以根据你的问题,这似乎有效

ProxyPass / http://192.168.178.69:8080/
但这不会:
ProxyPass / http://192.168.178.69:9443/
请注意,在这两种情况下都使用普通的 http://协议(protocol),即使涉及不同的端口。并且端口号 9443 表明您应该在此处使用 https://而不是 http://。如果是这种情况,这将解释您收到的错误消息:发送纯 HTTP 请求是因为将协议(protocol)设置为 http://而不是 https://。

But in the URL shows: https://portainer.my-domain.com/


这里的这个协议(protocol)是关于客户端和nginx之间的连接,而不是nginx和内部服务器之间的连接。后者取决于 ProxyPass URL 中给出的协议(protocol)。

关于docker - Portainer:客户端向 HTTPS 服务器发送 HTTP 请求 - 尽管 URL 是 https://,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72583330/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com