WP环回请求失败(cURL error 52)修复

    1,380

问题

在 WordPress 后台【工具 → 站点健康】中出现如下错误:

错误:cURL error 52: Empty reply from server(http_request_failed)

该错误意味着:

服务器无法通过 HTTP/HTTPS 访问自己的网站域名。

直接影响功能包括:

  • WP-Cron 定时任务(缓存自动清理等)
  • 插件/主题在线更新
  • REST API

问题排查

curl http://localhost
→ 301 Moved Permanently
Location: https://localhost/

curl -Iv https://localhost
→ 证书 CN = xxx.com
→ subjectAltName does not match localhost

curl https://atmoyu.com/wp-cron.php?doing_wp_cron
curl: (92) HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)

才想起我的服务器设置了默认站点并开启了强制ssl,用于防止类似censys的程序扫描到我真实网站泄露ip。

这是一个经典的:

多站点服务器 + HTTPS + default_server + 未设置 hosts

导致的 内部请求命中错误虚拟主机 的问题。

问题分析

WordPress
  ↓
访问 https://atmoyu.com
  ↓
服务器未在 /etc/hosts 中找到映射
  ↓
向公网 DNS 查询
  ↓
解析得到服务器公网 IP
  ↓
连接 公网IP:443
  ↓
Nginx 在 TLS 阶段尚未获得有效 SNI
  ↓
命中 default_server
  ↓
返回 默认站点 的证书
  ↓
证书与 atmoyu.com 不匹配
  ↓
TLS 握手失败
  ↓
cURL error 52

为什么会命中 默认站点?

HTTPS 与 HTTP 的关键差异

  • HTTP:
    • 先连接
    • 再发送 Host 头
  • HTTPS:
    • 先 TLS 握手
    • 再发送 HTTP 请求

在 TLS 阶段,服务器必须先选择证书。

如果没有可匹配的 SNI(Server Name Indication),Nginx 只能回退到:

default_server

为什么浏览器直接访问没问题?

客户端电脑访问:

atmoyu.com → 公网 DNS → 公网IP → Host: atmoyu.com

Nginx 可以根据 Host 命中正确虚拟主机。

而服务器访问自己时路径不同,导致走偏。

修复方案

在服务器中建立本地域名映射

编辑:

nano /etc/hosts

添加:

127.0.0.1   atmoyu.com
::1         atmoyu.com

问题即可解决

防止服务器重启后host重置

找到cloud.cfg,通常在/etc/cloud中。
删除以下内容

  • set_hostname
  • update_hostname
  • update_etc_hosts

验证结果

curl -Iv https://atmoyu.com

输出:

SSL certificate verify ok.
HTTP/2 200

修复后的正确链路

WordPress
  ↓
访问 https://atmoyu.com
  ↓
/etc/hosts 命中 127.0.0.1
  ↓
连接本机 443
  ↓
TLS ClientHello 携带 SNI = atmoyu.com
  ↓
Nginx 命中 atmoyu.com 虚拟主机
  ↓
返回 atmoyu.com 证书
  ↓
SSL 校验通过
  ↓
HTTP 200

摸鱼小屋」 (atmoyu.com)版权所有,引用、转载时必须标明原文出处!

消息盒子
# 您需要首次评论以获取消息 #
# 您需要首次评论以获取消息 #

只显示最新10条未读和已读信息