远程Jekyll环境部署后浏览器遇SSL协议错误,curl正常求助
首先,根据你描述的情况,浏览器访问出错但curl正常,核心原因大概率是浏览器默认尝试用HTTPS访问,但你的Jekyll服务只提供HTTP服务——毕竟Jekyll的serve命令默认是启动纯HTTP的web服务,没有配置SSL证书的话,HTTPS请求必然会触发SSL错误。
下面是一步步的排查和解决步骤:
第一步:确保用HTTP协议访问
直接在浏览器地址栏输入完整的HTTP地址:http://[你的真实IP]:4000,不要省略http://前缀,也不要写成https://。很多浏览器现在会默认把无协议的地址自动转成HTTPS,这就是你看到SSL错误的主要原因。第二步:清除浏览器缓存或用无痕模式测试
如果之前不小心用HTTPS访问过这个地址,浏览器可能会缓存这个跳转规则,即使你输入HTTP也会自动转成HTTPS。这时可以:- 清除对应网站的缓存和Cookie(Chrome里可以按F12打开开发者工具,在「Application」标签里清除)
- 直接用浏览器的无痕/隐私模式打开地址,避免缓存干扰
第三步:确认Jekyll服务正常监听端口
远程服务器上执行netstat -tulpn | grep 4000(或者ss -tulpn | grep 4000,取决于系统支持),确认输出里有ruby进程监听在你指定的IP的4000端口,比如类似这样的结果:tcp 0 0 [你的IP]:4000 0.0.0.0:* LISTEN 12345/ruby这能确保服务确实在正确的端口上运行,没有被其他进程占用。
进阶:如果需要HTTPS访问
如果你必须用HTTPS访问,可以通过两种方式实现:- 用Jekyll自带的SSL参数启动:生成自签名证书(或者用Let's Encrypt的合法证书),然后启动命令改成:
不过自签名证书会被浏览器提示不安全,适合测试场景;JEKYLL_ENV=production jekyll serve --host "ip-address" --baseurl "" --ssl-key ./server.key --ssl-cert ./server.crt - 用Nginx做反向代理:在服务器上安装Nginx,配置SSL证书,然后把Nginx的HTTPS请求转发到Jekyll的4000端口,这是生产环境更推荐的方式。
- 用Jekyll自带的SSL参数启动:生成自签名证书(或者用Let's Encrypt的合法证书),然后启动命令改成:
另外,你提到服务器端没有错误日志,这也符合HTTP服务收到HTTPS请求的情况——服务器无法解析HTTPS的请求报文,所以不会输出有效日志,但curl用HTTP请求就能正常响应,完全匹配这个场景。
内容的提问来源于stack exchange,提问作者Danis Fermi

