通过NGINX为Docker PHP服务配置SSL的本地测试问题
问题根因
你遇到的HTTPS访问500错误由两个核心原因导致:
- 配置中声明了
LETSENCRYPT_HOST参数,acme-companion会自动向Let's Encrypt申请公网SSL证书,但你本地使用的boats.trotalo.com没有公网DNS解析记录,Let's Encrypt的域名所有权校验失败,没有生成有效证书供外层反向代理使用,外部HTTPS请求到达反向代理层时就会触发报错。 - 你配置了
VIRTUAL_PROTO: https,反向代理会尝试用HTTPS协议和后端Apache服务通信,而Apache使用的是自签名证书,如果反向代理没有配置信任该自签名证书,也会触发TLS握手失败返回500。
你在WSL内部curl可以正常访问,是因为请求直接到达了Apache容器,跳过了外层反向代理的证书校验环节。
你完全可以在本地完成全流程SSL链路测试,不需要等到部署到公网托管环境,Apache内置的自签名证书本身不会引发问题,只要做好反向代理侧的配置即可。
方案1:保留本地SSL链路(符合架构SSL要求)
如果需要保持全链路走SSL协议,按以下步骤配置:
- 先修改本地解析规则:Windows侧修改
C:\Windows\System32\drivers\etc\hosts文件,WSL侧修改/etc/hosts文件,都添加一行记录127.0.0.1 boats.trotalo.com,保证本地可以正常解析该测试域名。 - 手动生成对应域名的自签名证书,在你nginx-proxy服务的配置目录下新建
certs文件夹,执行openssl命令生成证书:
生成过程中Common Name字段填写openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout boats.trotalo.com.key -out boats.trotalo.com.crtboats.trotalo.com即可,其余字段可随意填写。 - 修改当前
docker-compose.yml中web服务的环境变量,删除LETSENCRYPT_HOST、LETSENCRYPT_EMAIL两个参数,不需要acme-companion再申请公网证书。 - nginx-proxy会自动加载
certs目录下和VIRTUAL_HOST同名的证书,重启容器后即可正常访问,浏览器提示证书不安全属于正常现象,你也可以将自签名证书导入Windows和WSL的信任根证书存储,消除不安全提示。 - 多实例共存只需要给每个实例配置不同的
VIRTUAL_HOST,例如dev1.boats.trotalo.com、dev2.boats.trotalo.com,分别生成对应域名的证书,在hosts文件中添加对应解析即可,不需要修改端口配置,反向代理会根据域名自动转发请求,不会出现冲突。
方案2:临时去掉SSL配置
如果暂时不需要SSL校验,按以下步骤调整:
- 修改当前
docker-compose.yml中web服务的环境变量:将VIRTUAL_PROTO改为http,VIRTUAL_PORT改为80,删除LETSENCRYPT_HOST、LETSENCRYPT_EMAIL两个参数。 - 调整Apache服务配置,关闭443端口监听,或者将HTTPS请求重定向到HTTP即可,反向代理会用HTTP协议和后端通信,外部直接用HTTP访问域名即可正常使用。
内容的提问来源于stack exchange,提问作者Camilo Casadiego
相关产品推荐
相关产品推荐

