多Docker容器下HTTPS环境API服务配置故障排查求助
解决Apache反向代理Docker容器API的HTTPS握手问题
Hey there! 作为物理专业背景的朋友,我完全理解这种跨领域配置的头疼——咱们一步步拆解这个问题,搞定它!
问题核心分析
你遇到的SSL握手失败+API访问超时,本质是三个配置逻辑问题:
- Docker容器间通信不该用
0.0.0.0,桥接网络里要通过容器/服务名直接访问 - 给代理端口
9010额外配置SSL完全没必要,后端side-container本身是HTTP服务,强制SSL会导致握手失败 ProxyPass和ProxyPassReverse的协议不匹配,一个HTTP一个HTTPS,会引发跳转混乱
第一步:修正Apache httpd.conf配置
把你原来的0.0.0.0:9010虚拟主机配置替换成下面的内容,同时给443端口加一条更友好的代理规则:
# 删掉原来的Listen 0.0.0.0:9010 https,改成普通HTTP监听 Listen 9010 # 可选:保留9010端口的代理(如果需要直接访问这个端口) <VirtualHost *:9010> ServerName main.com # 只开启代理引擎,不需要给内部代理端口加SSL ProxyEngine On # 用Docker服务名访问side-container,容器内部直接走HTTP ProxyPass /apptest http://side-container:8080/ # 反向代理协议要和源一致,也是HTTP ProxyPassReverse /apptest http://side-container:8080/ </VirtualHost> # 重点:给443端口加代理,用户直接通过HTTPS访问API <Virtualhost *:443> ServerName main.com SSLEngine on SSLCertificateFile /usr/local/apache2/conf/certificate.crt SSLCertificateKeyFile /usr/local/apache2/conf/private.key SSLCertificateChainFile /usr/local/apache2/conf/ca_bundle.crt # 新增:把HTTPS的/apptest路径代理到后端HTTP服务 ProxyEngine On ProxyPass /apptest http://side-container:8080/ ProxyPassReverse /apptest http://side-container:8080/ </VirtualHost>
第二步:优化docker-compose.yml配置
因为已经通过443端口反向代理API了,没必要把side-container的8080和main的9010暴露给主机(内部网络就能访问):
version: '3' services: main-container: build: context: . dockerfile: Dockerfile container_name: "main" restart: "always" ports: - "80:80" - "443:443" # 删掉9010端口映射,内部访问即可 networks: - fu side-container: image: side-container:latest container_name: "side-container" # 删掉8080端口映射,不需要对外暴露 volumes: - ${HOME}/data:/data restart: "always" networks: - fu networks: fu: driver: bridge
第三步:验证与测试
- 重启容器生效:
docker-compose down && docker-compose up -d --build - 访问
https://main.com/apptest,应该能正常返回API数据 - 如果还有问题,查看main容器日志排查:
docker logs main
内容的提问来源于stack exchange,提问作者Whir
相关产品推荐
相关产品推荐

