日期: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 | 公网可访问 | 浏览器 + Maccurl | ✅ 欢迎页 /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❌ |
| 安全组已开 | Maccurl -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 访问不了、微服务调用超时 —— 套路完全一样。