日期:2026-09-02
环境 :腾讯云 Lighthouse
lhins-mxp4fa6e(ap-beijing)· Ubuntu 24.04 · nginx 1.24.0一句话 :安装 Nginx、打开 80 端口、让公网浏览器看到欢迎页 ------ 但真正学到的不是这条命令链,而是如何定位"通与不通"的边界。
一、目标与验收
| # | 验收项 | 验证方式 | 结果 |
|---|---|---|---|
| 1 | 装好 Nginx | nginx -v |
✅ nginx/1.24.0 (Ubuntu) |
| 2 | 在跑 + 开机自启 | systemctl status / is-enabled |
✅ active (running) / enabled |
| 3 | 服务器内部可访问 | curl -I 127.0.0.1 |
✅ 200 OK |
| 4 | 公网可访问 | 浏览器 + Mac curl |
✅ 欢迎页 / 200 OK |
| 5 | 说出"三层门"是哪三层 | 默写 | ✅ 见第五节 |
二、核心概念
1)Nginx 的两个身份
| 身份 | 做什么 | 什么时候用 |
|---|---|---|
| Web 服务器 | 自己回答请求,返回静态文件 | 今天 |
| 反向代理服务器 | 把请求转交给后端(Node / Python / SRS) | 第 9 天起 |
2)80 端口
- HTTP 默认端口(HTTPS 是 443)
- 浏览器输
http://IP/不写端口,默认就是敲 80 这个房间
3)systemctl(复习 Day 4)
| 命令 | 作用 | 是否换 PID |
|---|---|---|
enable |
注册开机自启(当场不启动) | --- |
start |
当场启动(不注册自启) | --- |
reload |
平滑重载配置 | ❌ 不变 |
restart |
真重启 | ✅ 全换 |
enable + start 配合使用才是合格操作。第 9 天改配置主要用 reload。
4)进程模型
- 1 master + N worker
- master 读配置、管手下;worker 真正处理请求
- worker 数默认 = CPU 核数(本机 2 核 → 2 worker)
三、比喻:写字楼的前台小姐
| 角色 | 对应 | 职责 |
|---|---|---|
| 写字楼 | Ubuntu 24.04 操作系统 | 提供水电气 |
| 大堂前台 小 N | Nginx | 客人进门第一个见到的人,决定他去哪间办公室 |
| 房间 80 | 80 端口 | 大楼正门(默认门牌号) |
| 浏览器客人 | 外部访客 | 顺着地址敲门 |
| 门口保安 | 安全组 + ufw | 决定谁能进大门 |
核心洞察 :就算前台小 N 已经坐在岗位上,如果门口保安不放人进去,外面敲再多也没用。 "服务就绪" ≠ "服务可达"。
Day 9 之后要做的事:让小 N 学会"听口音分诊" ------ 听到 /api/ 请上三楼(Node 服务),听到 /live/ 请去地下(视频流服务)。
四、实战记录
4.1 启动与自启
sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx
Loaded: loaded (...; enabled; preset: enabled)
Active: active (running) since Sun 2026-08-30 21:18:26 CST; 3 days ago
Main PID: 1019262 (nginx)
Tasks: 3 (limit: 2263)
CGroup: /system.slice/nginx.service
├─1019262 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
├─1019329 "nginx: worker process"
└─1019330 "nginx: worker process"
对已在运行 的服务执行
start不报错也不变化 ------start是幂等的。
4.2 三层门
| 层级 | 归属 | 怎么改 | 状态 |
|---|---|---|---|
| ❶ 腾讯云安全组 | 云厂商 | 控制台 / MCP,服务器上改不了 | ❌→✅ |
| ❷ 服务器 ufw | 操作系统 | ufw allow |
❌→✅ |
| ❸ 服务绑定地址 | 应用 | nginx 配置 | ✅ 一直是 |
4.3 关键闭环
| 时点 | 测试 | 结果 |
|---|---|---|
| 安全组未开 | 服务器内 curl -m 5 -I http://154.8.173.130/ |
curl: (28) Connection timed out ❌ |
| 安全组已开 | Mac curl -m 8 -I http://154.8.173.130/ |
HTTP/1.1 200 OK ✅ |
同一条命令,开关前后天壤之别 ------ 这就是因果最清晰的证明。
五、今天的五个坑
坑 1:curl 127.0.0.1 通,但 curl 公网IP 超时
| 命令 | 流量路径 | 过安全组 |
|---|---|---|
curl 127.0.0.1 |
纯本机回环,不出网卡 | 不过 |
curl 154.8.173.130 |
出网卡 → 云网络绕一圈 → 回来 | 要过 |
"自己访问自己"也要走完整网络栈 + 安全组。
坑 2:(28) timed out ≠ (7) refused
| 错误码 | 含义 | 你的判断 |
|---|---|---|
(28) timed out |
包被静默丢弃(防火墙 DROP) | 先查防火墙 |
(7) refused |
有人明确拒绝 | 服务没在听这个端口 |
坑 3:pgrep -c nginx 数的不是 worker 数
echo "worker 数: $(pgrep -c nginx)" # → 3(含 master!)
正确写法:
pgrep -c -f "nginx: worker process"
ps -eo args | grep -c "[n]ginx: worker"
[n]ginx的方括号是老运维手法:模式串[n]ginx≠ 进程字面量nginx,grep 不会把自己数进去。去掉方括号就多数 1 个。
坑 4:Default: deny (incoming) 时,DENY 规则是冗余的
那条 15809/tcp DENY IN(OpenClaw 卸载后遗留)没干活 ------ 默认策略已把未放行端口全挡了。
坑 5:查 80 端口别写成 grep ':80'
sudo ss -tlnp | grep -E ':80\b' # ✅ 锚定
sudo ss -tlnp | grep ':80' # ❌ 误捞 8080、8800
同理 grep -E '8000|8888' 竖线打丢会变成 88888889,静默筛空 。没输出 ≠ 不存在。
六、深层洞见(真正值钱的部分)
洞见 1:能定位"哪一层",比"会修"更值钱
今天从 timed out 一眼定位到防火墙层 ------ 这个判断力才是核心资产。
- 任何"端到端不通"的问题都能拆成 N 层
- 找到"通"与"不通"的分界点,就找到了故障点
- 推论:会修是技能,会定位是能力
洞见 2:沉默比拒绝的信息量更少
| 现象 | 你得到的信息 |
|---|---|
refused |
对方在,但不要你 → 服务活着 |
timed out |
对方不说话 → 什么都不知道 |
推论:遇到沉默,靠"分层对比测试"破局,不要靠猜。
顺带:DROP 之所以不给回应,是故意的 ------ 让攻击者分不清"端口空闲"和"端口存在但拒绝"。沉默是一种防御策略。
洞见 3:同一个东西,叫不同的名字,走完全不同的路
127.0.0.1→ 回环(lo),内核内部,不出网卡154.8.173.130→ eth0 → 云网络 → 绕回来
更深层:在云/分布式环境里,"标识"决定"路径",不是"是谁"决定路径。
这解释了运维界的经典噩梦:"本机测试通过,上线就挂"。
洞见 4:观测工具本身会影响你看到什么
pgrep -c nginx → 3;pgrep -c -f "nginx: worker" → 2。同一个系统,两种问法。
推论:当系统行为不符合预期,先怀疑"我的观测方式错了",再怀疑"系统错了"。
🚩 这是新手和高手的分水岭:新手第一反应是"系统坏了",高手第一反应是"我是不是看错了"。
洞见 5:冗余 ≠ 无用 ------ 配置会"说话"
15809/tcp DENY IN 技术上冗余,但它表达了意图:"我们特别警惕这个端口"。
- 代码/配置的价值不只是执行 ,还有沟通
- 推论:别急着删"看起来没用"的东西,先问它想表达什么
什么时候它才真正起作用?当你把默认策略改成
allow (incoming)时 ------ 那时它就成了唯一的拦截点。
洞见 6:白名单思维 vs 黑名单思维
| 思维 | 做法 | 安全性 |
|---|---|---|
| 白名单(今天用的) | 默认 deny,按需放行 | ✅ 漏一个只是不可用 |
| 黑名单 | 默认 allow,按需封堵 | ❌ 漏一个就是漏洞 |
推论:从"零信任"开始加例外,而不是从"全信"开始补窟窿。
洞见 7:可恢复性 > 当前可用
nginx 现在跑着不重要,重启后还在吗才重要。
enable就是买保险- 推论:任何需要手动拉起的服务,都是一颗定时炸弹
今天那台服务器还提示"需要重启系统"(内核更新待生效)。重启反而是一次真实的自愈演练 ------ 但会打断 SRS,所以先搁着。
洞见 8:尊重硬件约束
worker 数 = CPU 核数,不是"想开多少开多少"。
- 超过核数只会带来上下文切换开销,不会更快
- 同一个思想出现在:数据库连接池、线程池、K8s resource limit
- 推论:好的系统设计会尊重物理约束,而不是无视它
洞见 9:分层验证法(可复用的方法论)
今天做的事抽象出来只有 4 步:
1. 分层 → 把"能不能访问"拆成 N 层(云安全组 / ufw / 服务绑定)
2. 逐层验证 → 每层用不同视角的命令(控制台 / ss / curl)
3. 对比差异 → 内网 vs 外网、改前 vs 改后
4. 定位边界 → 找到"通"与"不通"的分界点 = 故障点
这个方法论可以迁移到任何"端到端不通"的排查:数据库连接不上、K8s Service 访问不了、微服务调用超时 ------ 套路完全一样。
