Administrator
发布于 2026-10-05 / 1 阅读
0
0

Nginx反向代理安装一系列问题解决过程

分步排查(宿主机 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
# 访问网页,同时看日志爆出什么报错

常见报错:

  1. SSL: error:02001002:system library:fopen:No such file or directory → 证书路径写错
  2. connect() failed (111: Connection refused) while connecting to upstream → Halo 8090没起来
  3. permission denied → 证书目录权限不足

7. 快速自测:先用IP直接访问测试

  1. http://你的VPS公网IP,看是否跳转到https
  2. https://你的VPS公网IP,浏览器看证书提示

⚠️ Cloudflare代理开启时,直接IP访问会被拦截。

8. 一个高频坑:Cloudflare SSL/TLS模式

Cloudflare控制台 → SSL/TLS → 概览,设置为 Full(完全)
❌不要用 Flexible(灵活),会造成重定向死循环。


你把下面3条信息发给我,我直接定位问题:

  1. nginx -t 的完整输出
  2. curl http://127.0.0.1:8090 的返回结果
  3. 访问网页时,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非常常见)

  1. Racknerd后台安全组!
    Racknerd面板的防火墙,默认会拦截80/443,需要在Racknerd虚拟机后台,添加入站规则放行TCP 80、443。

很多人只在系统内ufw放行,忘记服务商面板防火墙,外部无法访问。

  1. 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读取!
常见原因:

  1. nginx主配置 /etc/nginx/nginx.conf 没有写 include /etc/nginx/conf.d/*.conf;
  2. 配置文件有隐藏语法错误,直接被忽略(nginx -t显示ok,但有隐性问题)

第四步:Racknerd 防火墙(重中之重!Racknerd默认拦截)

Racknerd面板的VPS防火墙和系统ufw是两套独立防火墙!

  1. 登录Racknerd后台,找到你的VPS → Firewall
  2. 添加入站规则: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
}

常见笔误:

  1. listen 443; 少写 ssl
  2. ssl证书文件路径写错、文件不存在
  3. 大括号 {} 少写、引号乱码、分号漏写

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端口

  1. 检查Racknerd防火墙后台,确认TCP 443入站放行
  2. 浏览器访问 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。

成功安装好Nginx反向代理


评论