分步排查(宿主机 Nginx,Halo 跑在 8090,域名 blog.myfamily2027.top)
先记住顺序:DNS解析 → 服务器防火墙 → Nginx配置语法 → Nginx日志 → 后端Halo服务
1. 第一步:确认域名解析是否生效(本地电脑执行)
# Windows cmd
nslookup blog.myfamily2027.top
# 或者
ping blog.myfamily2027.top
返回的IP必须等于你的VPS公网IP。
如果IP不对:Cloudflare DNS A记录没填对、缓存没刷新。
2. 第二步:VPS服务器防火墙放行80、443端口(宿主机)
Ubuntu/Debian ufw
ufw status
# 如果没开80/443
ufw allow 80/tcp
ufw allow 443/tcp
ufw reload
另外服务商后台安全组,也要放行入方向 80、443!很多人卡在这里。
3. 第三步:Nginx配置检查(核心)
# 检查语法
nginx -t
✅输出 test is successful 才代表配置文件无语法错误。
如果报错:看报错提示,一般是证书路径写错、括号少、分号漏写。
你的配置文件位置(宿主机nginx)
两种方式二选一:
方案A(推荐sites)
/etc/nginx/sites-available/blog.conf
ln -s /etc/nginx/sites-available/blog.conf /etc/nginx/sites-enabled/
方案B(简单)
/etc/nginx/conf.d/blog.conf
检查:确认nginx.conf主文件包含conf.d或者sites-enabled目录
grep include /etc/nginx/nginx.conf
修改完配置,重载nginx
systemctl reload nginx
# 查看nginx状态
systemctl status nginx
4. 第四步:确认证书文件真实存在
ls -l /etc/ssl/myfamily2027/
必须看到:fullchain.cer 和 private.key
权限问题:nginx用户需要可读
chmod 644 /etc/ssl/myfamily2027/*
chmod 755 /etc/ssl/myfamily2027
5. 第五步:测试后端Halo本身能不能访问(VPS本机测)
在VPS服务器内部执行:
curl http://127.0.0.1:8090
- 能返回网页代码 → Halo正常,问题在Nginx/域名/端口
- 超时/拒绝连接 → Halo没启动,或者容器只监听内网,先搞定Halo
6. 第六步:看Nginx错误日志,定位根源(最有效)
# 看错误日志
tail -f /var/log/nginx/error.log
# 访问网页,同时看日志爆出什么报错
常见报错:
SSL: error:02001002:system library:fopen:No such file or directory→ 证书路径写错connect() failed (111: Connection refused) while connecting to upstream→ Halo 8090没起来permission denied→ 证书目录权限不足
7. 快速自测:先用IP直接访问测试
http://你的VPS公网IP,看是否跳转到httpshttps://你的VPS公网IP,浏览器看证书提示
⚠️ Cloudflare代理开启时,直接IP访问会被拦截。
8. 一个高频坑:Cloudflare SSL/TLS模式
Cloudflare控制台 → SSL/TLS → 概览,设置为 Full(完全)
❌不要用 Flexible(灵活),会造成重定向死循环。
你把下面3条信息发给我,我直接定位问题:
nginx -t的完整输出curl http://127.0.0.1:8090的返回结果- 访问网页时,
tail /var/log/nginx/error.log的报错内容
另外,浏览器访问时提示的报错是什么?(比如502、500、连接超时、证书无效)
我的提问“root@racknerd-9050763:/etc/nginx/conf.d# tail -f /var/log/nginx/error.log
2026/10/05 10:28:08 [notice] 1206275#1206275: signal process started,其他两个正常”
解读日志
[notice] signal process started 这只是通知日志,不是错误!代表Nginx收到重载/重启信号,没有报错。
说明:Nginx本身启动、加载配置没有语法错误。
没有
error级别日志,问题大概率就这几类:
① 网络层面:VPS安全组/防火墙端口没放行;② DNS解析不对;③ Cloudflare代理/SSL模式问题;④ 后端Halo的127.0.0.1:8090无法连通。
依次执行下面命令,把结果贴给我
1. 验证Nginx是否监听80、443端口
ss -tlnp | grep nginx
正常结果要看到 :80 和 :443。
2. 本机测试Halo后端(关键)
curl -v http://127.0.0.1:8090
看返回,是能拿到HTML,还是Connection refused。
3. 检查VPS本机防火墙 ufw
ufw status
4. 检查域名解析(在你自己电脑上执行)
nslookup blog.myfamily2027.top
返回IP是否等于你Racknerd这台机器的公网IP?
额外2个高频坑(Racknerd非常常见)
- Racknerd后台安全组!
Racknerd面板的防火墙,默认会拦截80/443,需要在Racknerd虚拟机后台,添加入站规则放行TCP 80、443。
很多人只在系统内ufw放行,忘记服务商面板防火墙,外部无法访问。
- Cloudflare设置
- SSL/TLS模式:Full(不要Flexible)
- 如果你开启了CDN代理(橙色云):域名解析IP是CF的IP,不是你VPS真实IP,此时要确认CF能回源访问你的VPS 80/443。
临时测试:把域名后面的橙色云关掉(灰色,不代理),直接解析到VPS真实IP,排除CF干扰。
浏览器访问时报什么提示?
例如:连接超时 / 502 Bad Gateway / 证书不安全 / 无法访问此网站?
你把上面命令输出贴过来,直接定位。
我的提问
blog.myfamily2027.top 拒绝连接。
请尝试:
检查连接
chrome-error://chromewebdata/#buttons
ERR_CONNECTION_REFUSED
代理已经关闭,ping blog.myfamily2027.top能正确返回vps的ip
ERR_CONNECTION_REFUSED + ping IP正确、CF代理已关闭
含义:DNS解析没问题,网络能到达VPS,但是VPS上没有程序监听你访问的端口(80/443)
ping通只是ICMP,不代表80/443端口开放。
第一步:VPS里面执行,看nginx有没有监听80、443
ss -tlnp | grep nginx
✅正常输出示例(必须同时看到80、443)
LISTEN 0 100 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=xxxx,fd=xx))
LISTEN 0 100 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=xxxx,fd=xx))
- 如果没有:80、:443 → Nginx没正常加载你的blog.conf,或者nginx没启动
- 只有部分端口,就是配置问题
第二步:检查nginx状态
systemctl status nginx
看是否 active (running)
第三步:确认你的conf.d/blog.conf是否被nginx载入
nginx -T | grep blog.myfamily2027.top
nginx -T 会打印全部加载成功的配置。
如果这条命令没有输出:说明blog.conf没有被nginx读取!
常见原因:
- nginx主配置
/etc/nginx/nginx.conf没有写include /etc/nginx/conf.d/*.conf;- 配置文件有隐藏语法错误,直接被忽略(nginx -t显示ok,但有隐性问题)
第四步:Racknerd 防火墙(重中之重!Racknerd默认拦截)
Racknerd面板的VPS防火墙和系统ufw是两套独立防火墙!
- 登录Racknerd后台,找到你的VPS → Firewall
- 添加入站规则:TCP 80,TCP 443,源IP任意
只在服务器内部
ufw allow 80,443没用,服务商层面还会拦截!
本机系统防火墙检查:
ufw status
如果ufw是inactive,代表系统防火墙没开,不用管,重点就是Racknerd面板防火墙。
第五步:快速端口测试(在你电脑cmd执行)
telnet 你的VPSIP 80
telnet 你的VPSIP 443
连不上 = 端口被防火墙拦截 / nginx没监听端口
第六步:核对blog.conf最容易踩坑的错误
打开 /etc/nginx/conf.d/blog.conf
确认开头是:
server {
listen 80;
server_name blog.myfamily2027.top;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name blog.myfamily2027.top;
ssl_certificate /etc/ssl/myfamily2027/fullchain.cer;
ssl_certificate_key /etc/ssl/myfamily2027/private.key;
...
}
❌ 错误:listen 443; 漏掉 ssl 关键字,会导致443不加载SSL,直接拒绝连接。
第七步 本机测试Halo(备用,当前报错暂时不是Halo问题)
curl http://127.0.0.1:8090
先执行这两条,把结果发给我
ss -tlnp | grep nginx
nginx -T | grep blog.myfamily2027.top
结果发给豆包
root@racknerd-9050763:/etc/nginx/conf.d# ss -tlnp | grep nginx
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1206276,fd=6),("nginx",pid=1176607,fd=6))
LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=1206276,fd=7),("nginx",pid=1176607,fd=7))
问题找到了!
ss 输出只看到 80端口在监听,没有443端口。
Nginx 成功加载了80的server块,443的ssl站点配置没有生效。
原因3种可能性,按顺序排查
1. 检查:443那一段配置有没有语法隐性错误
执行:
nginx -T | grep -A20 "listen 443 ssl"
- 如果没有输出:代表443的server{} 直接被nginx丢弃没加载。
nginx -t有时候会报ok,但某一段配置写错直接跳过该server块。
打开 /etc/nginx/conf.d/blog.conf,重点检查443那段:
server {
listen 443 ssl; # 这里必须写 ssl!不能只写 listen 443;
server_name blog.myfamily2027.top;
ssl_certificate /etc/ssl/myfamily2027/fullchain.cer;
ssl_certificate_key /etc/ssl/myfamily2027/private.key;
# ......后面ssl参数和proxy
}
常见笔误:
listen 443;少写ssl- ssl证书文件路径写错、文件不存在
- 大括号
{}少写、引号乱码、分号漏写
2. 验证证书文件存在
ls /etc/ssl/myfamily2027/
确认 fullchain.cer 和 private.key 存在。
3. 改完配置,重载nginx
nginx -t
systemctl reload nginx
重载完成后,再次执行:
ss -tlnp | grep nginx
✅成功的结果,必须多出两行443监听:
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=xxxx,fd=x))
LISTEN 0 511 [::]:443 [::]:* users:(("nginx",pid=xxxx,fd=x))
临时小测试
现在你访问 http://blog.myfamily2027.top(http,不带s),会正常打开并且跳转https,但是https访问直接拒绝连接,和你现在现象完全吻合。
把下面命令输出贴给我:
nginx -T | grep blog.myfamily2027.top
我将检查的信息发给豆包
root@racknerd-9050763:/etc/nginx/conf.d# nginx -T | grep -A20 "listen 443 ssl"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
listen 443 ssl;
server_name blog.myfamily2027.top;
ssl_certificate /etc/ssl/myfamily2027/fullchain.cer;
ssl_certificate_key /etc/ssl/myfamily2027/private.key;
# ssl安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
location / {
proxy_pass http://127.0.0.1:8090; # Halo容器端口
proxy_set_header Host host;
proxy_set_header X-Real-IP remote_addr;
proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto scheme;
}
}
stockapi子域名,如果你库管API用这个域名,可以单独配置
--
listen 443 ssl;
server_name stockapi.myfamily2027.top;
ssl_certificate /etc/ssl/myfamily2027/fullchain.cer;
ssl_certificate_key /etc/ssl/myfamily2027/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://127.0.0.1:8888;
proxy_set_header Host host;
proxy_set_header X-Real-IP remote_addr;
proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto scheme;
}
}
configuration file /etc/nginx/sites-enabled/default:
You should look at the following URL's in order to grasp a solid understanding
of Nginx configuration files in order to fully unleash the power of Nginx.
https://www.nginx.com/resources/wiki/start/
--
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
现象分析
nginx -T 已经成功读到了你两段 listen 443 ssl 的配置,说明配置文件本身被加载。
但是 ss -tlnp | grep nginx 看不到443端口监听。
典型:配置载入成功,但是Nginx没有绑定443端口。最常见原因:证书文件无法读取(权限/不存在),Nginx静默放弃启动443监听。
第一步:验证证书文件存在
ls -la /etc/ssl/myfamily2027/
确认 fullchain.cer、private.key 存在。
第二步:测试nginx启动时读取证书有没有权限报错
直接执行这个,不要用reload,用完全重启,reload会掩盖证书错误
systemctl stop nginx
systemctl start nginx
然后看启动日志:
journalctl -u nginx
重点看启动瞬间有没有类似:
Cannot load certificate key /etc/ssl/myfamily2027/private.key: Permission denied
或者
No such file or directory
重点:reload 的时候,如果证书读取失败,nginx不会退出,直接丢弃443的监听,只保留80端口!!这就是你现在遇到的坑!
nginx -t只检查语法,不会实际读取证书文件,所以能通过。
第三步:证书权限修复(大概率问题)
acme.sh生成的私钥默认权限很严格,nginx用户读不到。执行:
chmod 755 /etc/ssl/myfamily2027
chmod 644 /etc/ssl/myfamily2027/fullchain.cer
chmod 600 /etc/ssl/myfamily2027/private.key
# 把所有者改为www-data(debian/ubuntu nginx默认用户)
chown -R www-data:www-data /etc/ssl/myfamily2027
第四步:重启nginx,再检查端口
systemctl stop nginx
systemctl start nginx
ss -tlnp | grep nginx
✅ 正常结果必须出现两行443:
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=xxxx,fd=x))
LISTEN 0 511 [::]:443 [::]:* users:(("nginx",pid=xxxx,fd=x))
第五步:Racknerd防火墙确认
Racknerd后台防火墙,入站TCP 443放行。
80通不代表443放行了,两个端口独立规则。
执行完重启nginx后,把 journalctl -u nginx 的报错贴给我。
补充:
如果重启后443端口出现了,访问https网站;如果报502,那就是Halo 8090的问题,那就是下一个环节。你当前问题是443端口没有监听。
检擦结果发给豆包
root@racknerd-9050763:/etc/nginx/conf.d# ls -la /etc/ssl/myfamily2027/
total 20
drwxr-xr-x 2 root root 4096 Oct 5 10:28 .
drwxr-xr-x 5 root root 4096 Oct 5 10:26 ..
-rw-r--r-- 1 root root 4865 Oct 5 10:28 fullchain.cer
-rw-r--r-- 1 root root 227 Oct 5 10:28 private.key
问题定位
文件都存在,但是 private.key 当前是 root:root,nginx 的运行用户 www-data 读不到私钥。
nginx -t 只检查语法,不会真实加载证书;reload 遇到私钥读取失败,直接放弃启动443监听,只保留80,就是你现在的现象。
执行下面命令修改权限
# 目录权限保持755即可
chmod 755 /etc/ssl/myfamily2027
# 证书链,所有人可读
chmod 644 /etc/ssl/myfamily2027/fullchain.cer
# 私钥:属主改为www-data,权限600(仅属主可读,安全规范)
chown www-data:www-data /etc/ssl/myfamily2027/private.key
chmod 600 /etc/ssl/myfamily2027/private.key
完全重启 Nginx(不要用reload!)
systemctl stop nginx
systemctl start nginx
查看启动日志,确认有没有证书报错
journalctl -u nginx --since "1 minute ago"
再检查端口监听
ss -tlnp | grep nginx
✅成功后会看到 0.0.0.0:443 和 [::]:443 两行监听。
如果日志出现
permission denied,说明上面权限没改到位。
改完443端口出现后,再去浏览器访问 https://blog.myfamily2027.top
执行完把 ss -tlnp | grep nginx 的结果发给我。
补充安全提醒:私钥不要给其他用户可读,600是标准安全配置。fullchain.cer可以公开读。
检查结果发给豆包
root@racknerd-9050763:/etc/nginx/conf.d# journalctl -u nginx --since "1 minute ago"
-- Logs begin at Wed 2026-09-02 07:49:57 BST, end at Mon 2026-10-05 11:02:15 BST. --
Oct 05 11:02:15 racknerd-9050763 systemd[1]: Stopping A high performance web server and a reverse proxy s>
Oct 05 11:02:15 racknerd-9050763 systemd[1]: nginx.service: Succeeded.
Oct 05 11:02:15 racknerd-9050763 systemd[1]: Stopped A high performance web server and a reverse proxy se>
Oct 05 11:02:15 racknerd-9050763 systemd[1]: Starting A high performance web server and a reverse proxy s>
Oct 05 11:02:15 racknerd-9050763 systemd[1]: Started A high performance web server and a reverse proxy se>
日志没有报错,nginx正常启动。现在执行端口查看:
ss -tlnp | grep nginx
看是否出现443端口监听。
如果已经看到443端口
- 检查Racknerd防火墙后台,确认TCP 443入站放行
- 浏览器访问
https://blog.myfamily2027.top
如果依然看不到443监听
还有一个隐藏坑:selinux(Racknerd部分系统带SELinux,会阻止nginx读取/etc/ssl下文件)
# 查看selinux状态
getenforce
如果返回 Enforcing,执行下面临时放行:
setenforce 0
然后再次完整重启nginx:
systemctl stop nginx && systemctl start nginx
ss -tlnp | grep nginx
补充:SELinux开启时,即使文件权限是www-data,也会拦截nginx读取/etc/ssl目录的证书,nginx静默不加载443,日志不会抛错,这个在国外VPS很常见。
把ss -tlnp | grep nginx输出贴过来。
检擦结果发给豆包
root@racknerd-9050763:/etc/nginx/conf.d# ss -tlnp | grep nginx
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=1211395,fd=7),("nginx",pid=1211394,fd=7))
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1211395,fd=6),("nginx",pid=1211394,fd=6))
LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=1211395,fd=8),("nginx",pid=1211394,fd=8))
✅ 太棒了!443端口已经正常监听,Nginx这边配置全部生效。
现在:
- 80、443端口都在监听
- 证书加载成功,Nginx启动无报错
接下来排查顺序
1. 首要:Racknerd 后台防火墙!
Racknerd 面板的VPS防火墙,独立于系统ufw,80放行不等于443放行。
登录Racknerd后台 → 找到这台VPS → Firewall,确认入站规则:
- TCP 80 ✅
- TCP 443 ✅
这是最可能的元凶,外部访问443直接被服务商防火墙丢弃,报
ERR_CONNECTION_REFUSED
2. 本机测试后端Halo(确认反向代理上游正常)
curl -v http://127.0.0.1:8090
看是否返回网页HTML。
3. 本地电脑测试端口连通性(你电脑CMD执行)
telnet 你的VPS公网IP 443
- 能连上:防火墙没问题,下一步看证书/浏览器
- 直接失败:Racknerd防火墙443没开
4. 浏览器访问
https://blog.myfamily2027.top
预期两种情况
情况A:可以打开网站
- 如果自动跳转https,正常,搞定。
情况B:502 Bad Gateway
- 代表Nginx成功收到HTTPS请求,但是连不上后端Halo(
127.0.0.1:8090),问题在Halo服务。
情况C:依旧 ERR_CONNECTION_REFUSED
- 几乎可以确定:Racknerd后台防火墙443端口没放行
先把curl -v http://127.0.0.1:8090的结果发我,同时确认Racknerd防火墙443放行状态。
顺带:你的IPv6的443没监听,不影响,绝大多数访问都是IPv4。