Portainer反向代理访问报错:HTTP请求发送至HTTPS服务
问题原因
报错核心是反向代理与后端服务的协议不匹配,和浏览器到反向代理的HTTPS连接无关:
- 你的Apache反向代理443虚拟主机配置中,转发目标写为
http://192.168.178.69:9443/,意味着反向代理接收到浏览器的HTTPS请求后,会向后端Portainer发送明文HTTP请求 - Portainer的9443端口是默认HTTPS监听端口,仅接受加密HTTPS请求,收到明文HTTP请求时就会返回
Client sent an HTTP request to an HTTPS server的错误响应,最终透传给浏览器显示 - 之前配置的webserver服务可正常访问,是因为其8080端口本身就是HTTP监听端口,和反向代理的转发协议匹配,不存在协议冲突。
修复方案
共有两种可行修复路径,其中容器内网转发是生产环境更推荐的方案:
方案1:保留现有网络结构,修正转发协议
如果不想调整Docker网络配置,直接修改Apache代理规则的协议类型,同时关闭对后端自签证书的校验即可:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName portainer.my-domain.com ProxyPreserveHost On DocumentRoot /var/www/html ProxyPass /.well-known ! # 开启SSL代理,关闭后端证书校验 SSLProxyEngine on SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off # 转发协议改为https ProxyPass / https://192.168.178.69:9443/ ProxyPassReverse / https://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>
修改完成后重启Apache服务即可生效,该方案需要额外维护后端证书校验规则,走宿主机IP转发的性能略低于容器内网转发。
方案2:容器内网HTTP转发(已验证最优方案)
将反向代理与Portainer加入同一个Docker自定义网桥,直接通过容器名做DNS解析,走Portainer默认的9000 HTTP端口转发,无需处理证书校验问题,转发延迟更低:
- 编写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:
- 修改Apache的Portainer代理规则,将目标地址改为Portainer容器名+9000 HTTP端口:
ProxyPass / http://reverse-proxy_portainer_1:9000/ ProxyPassReverse / http://reverse-proxy_portainer_1:9000/
- 重启Apache容器即可正常访问。
补充说明:Docker自定义网桥内置DNS解析能力,直接通过容器名访问不需要配置固定IP,容器重建后IP变化也不会影响转发规则有效性。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

