Portainer搭配Caddy反向代理出现HTTP请求发至HTTPS服务器错误的解决
Caddy反向代理Portainer报错「Client sent an HTTP request to an HTTPS server」的解决办法
问题场景
通过Docker部署Portainer,使用官方启动命令:
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
配置Caddy反向代理时,指向了Portainer的9443端口:
www.portainer.mydomain.ovh { root * /usr/share/caddy/test file_server reverse_proxy localhost:9443 log { output file /etc/caddy/portainer.log } }
此时通过域名https://www.portainer.mydomain.ovh访问时,出现错误提示:Client sent an HTTP request to an HTTPS server;直接用https://[服务器IP]:9443访问虽能进入,但会提示站点不安全、证书无效。
错误原因
Portainer的9443端口是其自带HTTPS服务的端口,使用自签名证书;而Caddy默认以HTTP协议向反向代理目标发送请求,相当于用HTTP请求访问HTTPS服务,因此触发上述错误。直接访问9443时,浏览器识别到自签名证书,所以提示不安全。
解决方案
Portainer提供了9000端口作为HTTP服务端口,我们需要映射该端口,并让Caddy反向代理到这个HTTP端口,由Caddy负责对外提供Let's Encrypt签发的合法HTTPS证书。
修改后的Docker启动命令
docker run -d -p 8000:8000 -p 9000:9000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
修改后的Caddy配置
www.portainer.mydomain.ovh { reverse_proxy localhost:9000 log { output file /etc/caddy/portainer.log } }
修改完成后重启Portainer容器和Caddy服务,即可通过域名正常HTTPS访问Portainer,且不会出现证书不安全的提示。
内容的提问来源于stack exchange,提问作者krcarbo
相关产品推荐
相关产品推荐

