1.Nginx安装与ufw防火墙实操完整总结(含命令+全部踩坑)
本文详解 Ubuntu 安装 Nginx 与 ufw 防火墙全套命令,汇总实操踩坑,附带 Nginx 日志查看、统计与故障排查方法。
Nginx安装与ufw防火墙实操完整总结(含命令+全部踩坑)
一、Nginx安装相关操作
更新软件源索引:
sudo apt update
一键安装Nginx(自动确认安装):
sudo apt install nginx -y
二、Nginx服务管理全套命令
错误写法(无 sudo,会触发权限验证弹窗):
systemctl start nginx
标准正确操作:
# 启动Nginx服务
sudo systemctl start nginx
# 设置开机自启
sudo systemctl enable nginx
# 查看运行状态,确认active(running)
sudo systemctl status nginx
# 修改配置后完整重启服务
sudo systemctl restart nginx
# 重载配置,不中断在线访问
sudo systemctl reload nginx
# 校验配置文件语法错误
sudo nginx -t
# 本地测试网页是否正常输出
curl localhost
三、ufw防火墙完整操作命令
# 查看系统内置防火墙应用模板
sudo ufw app list
# 基础查看防火墙状态
sudo ufw status
# 详细模式查看防火墙状态
sudo ufw status verbose
# 放行SSH远程登录端口(必须优先执行)
sudo ufw allow ssh
# 标准放行80/443,严格匹配大写名称
sudo ufw allow 'Nginx Full'
# 错误放行写法:小写名称,仅生成自定义标签,不会自动开放网页端口
sudo ufw allow 'nginx full'
# 删除错误小写规则
sudo ufw delete allow 'nginx full'
# 启用防火墙,弹窗输入y确认开启
sudo ufw enable
四、本次实操全部踩坑记录
踩坑1:systemctl操作不加sudo
现象:终端弹出身份验证,要求输入服务器登录密码
原理:系统服务属于root权限操作,普通用户无操作权限
解决:所有systemctl命令前追加sudo
踩坑2:ufw未激活(inactive)时看不到放行规则
现象:sudo ufw status仅输出Status: inactive,无端口列表
原理:防火墙关闭时规则仅保存配置,不会加载运行
解决:执行sudo ufw enable激活防火墙后才能查看完整规则
踩坑3:使用小写'nginx full'放行端口
现象:提示规则更新成功,但不会自动开放80、443;删除该规则时会模糊匹配,连带删掉大写'Nginx Full',网站端口被拦截
两种规避方案:
方案1:严格使用大写模板名称
sudo ufw allow 'Nginx Full'
方案2:直接放行数字端口,无大小写匹配bug(推荐)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
踩坑4:混用防火墙命令firewall-cmd
现象:Ubuntu执行firewall-cmd --list-all提示命令不存在
原理:firewall-cmd是CentOS、红帽系专用;Ubuntu默认防火墙工具为ufw,两套工具不互通
解决:全程仅使用ufw系列命令
踩坑5:只配置本机ufw,忽略腾讯云安全组
现象:服务器内部curl localhost正常,外网浏览器无法访问网站
原理:腾讯云存在双层防护,系统ufw + 云端安全组,安全组未开放80/443外网直接拦截
解决:登录腾讯云控制台,实例安全组添加入站规则放行80、443端口
踩坑6:开启防火墙前未放行ssh端口
风险:开启ufw后22端口阻断,直接断开远程连接,无法再次登录服务器
解决:启用防火墙前先执行sudo ufw allow ssh
五、无坑推荐防火墙完整配置(直接放行端口)
# 放行远程登录
sudo ufw allow 22/tcp
# 放行网页http、https
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 开启防火墙
sudo ufw enable
# 核对放行规则
sudo ufw status
六、Nginx 日志查看(运维日常核心操作)
日志文件位置
默认路径:
/var/log/nginx/access.log # 访问日志,记录每一次请求
/var/log/nginx/error.log # 错误日志,记录配置错误、后端异常等
如果你的 server 块里单独配了 access_log,日志会写到你指定的路径。
access.log 日志格式
shturl.cc/OFB6 - - [01/Jul/2026:10:23:45 +0000] "GET /api/articles HTTP/1.1" 200 12345 "https://demo.test.com/" "Mozilla/5.0..."
每列含义:
| 列 | 含义 |
|---|---|
| shturl.cc/OFB6 | 请求来源 IP |
| [01/Jul/2026:10:23:45 +0000] | 请求时间(UTC) |
| GET /api/articles HTTP/1.1 | 请求方法 + URL路径 + 协议版本 |
| 200 | HTTP 状态码 |
| 12345 | 响应体大小(字节) |
| "https://demo.test.com/" | Referer(从哪个页面跳过来的) |
| "Mozilla/5.0..." | User-Agent(浏览器/设备信息) |
tail -f 实时查看日志
# 实时跟踪访问日志(新请求会自动刷出来)
sudo tail -f /var/log/nginx/access.log
# 实时跟踪错误日志
sudo tail -f /var/log/nginx/error.log
# 同时看两个日志(开两个终端窗口)
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
操作流程:
- 先执行
tail -f看日志(终端会卡住等待) - 浏览器访问你的网站
- 终端实时刷出访问记录
- 按
Ctrl + C退出
只看最后 N 行
tail -50 access.log # 看最后 50 条
tail -100 error.log # 看最后 100 条错误
grep 过滤日志
# 只看状态码 502 的请求(后端挂了)
grep " 502 " /var/log/nginx/access.log
# 只看状态码 404 的请求(路径不存在)
grep " 404 " /var/log/nginx/access.log
# 只看某个 IP 的访问
grep "shturl.cc/kvuLa" /var/log/nginx/access.log
# 只看 /api/ 路径的请求
grep "/api/" /var/log/nginx/access.log
# 组合:看 502 错误的最后 20 条
grep " 502 " /var/log/nginx/access.log | tail -20
日志分析命令(面试能讲)
# 访问量最大的前 10 个 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# 每个 URL 路径的访问次数
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -20
# 状态码分布统计
awk '{print $9}' access.log | sort | uniq -c | sort -rn
逐段解释:
awk '{print $1}'— 提取每行第1列(IP)sort— 排序(相同 IP 相邻)uniq -c— 去重并计数sort -rn— 按数字倒序(最多在前)head -10— 只取前 10 条
实战排障流程
网站打不开时的标准排查:
# 1. 先看错误日志有没有线索
sudo tail -50 /var/log/nginx/error.log
# 2. 看访问日志,确认请求有没有到达 Nginx
sudo tail -50 /var/log/nginx/access.log
# 3. 如果 access.log 没有该请求记录 → 请求没到 Nginx(网络/防火墙问题)
# 4. 如果 access.log 有记录但状态码是 502 → 后端挂了
# 5. 如果 access.log 有记录但状态码是 403 → 权限问题
# 6. 如果 access.log 有记录但状态码是 404 → 路径配错
补充概念说明
apt:Ubuntu/Debian软件包管理工具,用于更新、安装程序
systemctl:系统服务管理器,管控Nginx启停、自启
ufw:Ubuntu简易防火墙;(v6)代表IPv6网络规则,系统自动生成无需手动修改
识别腾讯云服务器依据:主机名VM-xxx-xx-ubuntu、软件源mirrors.cloud.example.com
说明:文中域名、IP均为教学演示虚拟地址,无真实线上服务
评论
暂无评论,来写第一条吧
