You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过NGINX为Docker PHP服务配置SSL的本地测试问题

问题根因

你遇到的HTTPS访问500错误由两个核心原因导致:

  1. 配置中声明了LETSENCRYPT_HOST参数,acme-companion会自动向Let's Encrypt申请公网SSL证书,但你本地使用的boats.trotalo.com没有公网DNS解析记录,Let's Encrypt的域名所有权校验失败,没有生成有效证书供外层反向代理使用,外部HTTPS请求到达反向代理层时就会触发报错。
  2. 你配置了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命令生成证书:
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout boats.trotalo.com.key -out boats.trotalo.com.crt
    
    生成过程中Common Name字段填写boats.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:57:04