Traefik转发HTTPS到php-nginx容器运行Laravel出现400错误求助
核心问题定位
你日志中出现的\x16\x03\x01开头的乱码请求是TLS握手请求,Nginx返回400说明TLS握手失败,优先排查以下内容:
优先排查项(90%概率是该类问题)
- 证书路径不匹配问题:你将宿主机SSL证书挂载到了容器的
/etc/ssl目录,但从Nginx配置可以看到,SSL证书读取路径为/opt/docker/etc/nginx/ssl/server.crt和/opt/docker/etc/nginx/ssl/server.key,路径完全不匹配,Nginx无法读取有效证书导致握手失败。
解决方法二选一:- 修改docker-compose的volumes配置,将证书挂载到容器的
/opt/docker/etc/nginx/ssl/路径 - 修改
/opt/docker/etc/nginx/vhost.ssl.conf中的ssl_certificate和ssl_certificate_key配置,指向/etc/ssl下对应的证书文件
- 修改docker-compose的volumes配置,将证书挂载到容器的
- 端口监听校验:进入starapp容器执行
ss -tulnp | grep 443,确认Nginx已经正常监听443端口
次要排查项
- Traefik后端证书校验问题:如果你的证书是自签名证书,Traefik默认会校验后端证书有效性,校验失败也会导致握手错误。可以临时添加Traefik标签
traefik.http.services.starapp.loadbalancer.server.insecureSkipVerify=true测试,生产环境建议将自签名根证书加入Traefik的信任根存储,不要长期开启跳过校验 - 本地连通性测试:进入starapp容器执行
curl -vk https://127.0.0.1,如果本地无法拿到正常响应,确认证书文件权限是否正确,证书和密钥是否匹配
Laravel混合内容问题优化建议
你当前的全链路HTTPS架构可以正常解决混合内容问题,也可以选择更轻量的架构,减少性能损耗:
- Traefik侧完成SSL卸载,将请求以HTTP协议转发到后端Nginx的80端口
- 在Nginx的fastcgi参数中添加
fastcgi_param HTTP_X_FORWARDED_PROTO $http_x_forwarded_proto;,将Traefik传递的协议头透传给PHP - 配置Laravel的
TrustProxies中间件,信任Traefik所属的代理网段,或直接在AppServiceProvider的boot方法中添加\URL::forceScheme('https');,强制Laravel生成HTTPS链接
内容的提问来源于stack exchange,提问作者Dwija
相关产品推荐
相关产品推荐

