Nginx笔记
Nginx运维综合笔记
一、Nginx 核心架构与配置
1.1 配置文件结构
- 主配置路径:
/usr/local/nginx/conf/nginx.conf - 核心区块:
http { server { location / { ... } } } - 关键指令:
worker_processes auto;:建议设为 CPU 核数error_log logs/error.log;pid logs/nginx.pid;
✅ 最佳实践:修改前备份
cp nginx.conf nginx.conf.bak,使用nginx -t检查语法。
1.2 虚拟主机(Virtual Host)配置
| 类型 | 配置方式 | 应用场景 |
|---|---|---|
| 基于域名 | server_name www.devops.com; |
多站点共享 IP(最常用) |
| 基于 IP | listen 80; server_name 192.168.88.200; |
单机多 IP 或测试环境 |
| 基于端口 | listen 8080; |
内部系统、隐蔽访问 |
⚠️ 注意:若请求 Host 不匹配任何
server_name,Nginx 返回第一个 server 块的内容。
二、location 匹配机制(高优先级!)
2.1 优先级顺序(从高到低)
- 精准匹配:
location = / {}→ 最高 - 前缀匹配(^~):
location ^~ /images/ {}→ 第二 - 正则匹配:
~:区分大小写(如location ~ /News/)~*:不区分大小写(如location ~* \.(gif\|jpg)$)
- 普通前缀匹配:
location /data/ {} - 默认匹配:
location / {}→ 兜底
🔍 匹配原则:一旦匹配成功即终止,不再继续后续规则。
2.2 实战示例
location = / { return 401; } # 精准匹配 → 401
location ^~ /img/ { deny all; } # 以 /img/ 开头 → 403
location ~* \.(png\|jpg)$ { # 图片文件 → 允许
expires 7d;
}
location / { return 404; } # 其他所有请求 → 404
三、Rewrite 重定向与防盗链
3.1 Rewrite 基本语法
rewrite <匹配URI> <替换URI> [flag];
- Flag 标记:
last:继续匹配其他 location(内部跳转)break:停止 rewrite,但继续当前 locationredirect:302 临时重定向(URL 变)permanent:301 永久重定向(URL 变,SEO 友好)
3.2 域名重定向(301 永久迁移)
server {
listen 80;
server_name www.old.com;
rewrite ^/(.*)$ http://www.new.com/$1 permanent;
}
✅ 适用于公司域名升级,搜索引擎会更新索引。
3.3 防盗链(推荐方案)
location ~* \.(jpg\|png\|gif)$ {
valid_referers none blocked *.devops.com devops.com;
if ($invalid_referer) {
return 403; # 或 rewrite ^/ /default.jpg last;
}
}
- 原理:检查 HTTP 请求头中的
Referer - 优点:低成本、高效,避免带宽被第三方盗用
四、安全与访问控制
4.1 基于 IP 的访问控制
location /admin/ {
deny 192.168.1.100; # 禁止单个 IP
allow 192.168.1.0/24; # 允许网段
deny all; # 拒绝其他所有
}
📌 规则从上到下顺序匹配,首次命中即生效。
4.2 基于用户的认证(Basic Auth)
location /private/ {
auth_basic "Restricted Area";
auth_basic_user_file /usr/local/nginx/conf/passwd.db;
}
- 生成密码文件:
yum install -y httpd-tools htpasswd -c /usr/local/nginx/conf/passwd.db user1
4.3 安全加固
- 隐藏版本号:
http { server_tokens off; } - 目录列表禁用(生产环境必须关闭):
location / { autoindex off; # 默认即为 off }
五、性能优化
5.1 Gzip 压缩
gzip on;
gzip_min_length 1k;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript;
gzip_vary on;
- 效果:文本类资源体积减少 50%~80%
- 注意:禁用 IE6 压缩(已淘汰)
5.2 客户端缓存
location ~* \.(css\|js\|png\|jpg)$ {
expires 7d; # 缓存 7 天
}
- 优势:减少请求次数,提升页面加载速度
六、日志管理与分析
6.1 日志类型
- access.log:记录所有访问(用于流量分析)
- error.log:记录错误(用于排错)
6.2 日志格式关键变量
| 变量 | 含义 |
|---|---|
$remote_addr |
客户端 IP |
$http_referer |
来源页面(防盗链依据) |
$status |
响应状态码(200/404/502) |
$body_bytes_sent |
发送字节数 |
$http_user_agent |
浏览器信息 |
6.3 日志轮转(Log Rotation)
#!/bin/bash
date_info=$(date +%F-%H-%M)
mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access.log.$date_info
/usr/local/nginx/sbin/nginx -s reload
- 计划任务:
crontab -e添加每日执行
6.4 GoAccess 实时分析
goaccess access.log -f --log-format=COMBINED -o report.html
- 输出:交互式 HTML 报告,支持浏览器查看
七、监控与可观测性
7.1 启用 stub_status(内置监控)
location /nginx_status {
stub_status on;
allow 192.168.88.0/24;
deny all;
}
- 指标:Active connections, accepts, handled, requests
7.2 Prometheus + Grafana 监控栈
- 部署 nginx_exporter(采集 stub_status 数据)
- Prometheus 配置:
- job_name: 'nginx' static_configs: - targets: ['192.168.88.104:9113'] - Grafana 导入模板 ID:12708
✅ 实现:活跃连接数、请求速率、错误率等可视化。
八、高级功能与模块
8.1 第三方模块安装
- 常用模块:
fancyindex:美化目录列表(表格形式)echo-nginx-module:调试输出变量(echo $request_uri;)
- 安装方式:需重新编译 Nginx(动态模块需 NGINX Plus)
8.2 Nginx 发行版对比
| 版本 | 特点 | 适用场景 |
|---|---|---|
| 官方社区版 | 免费,基础功能 | 学习、中小项目 |
| Tengine(淘宝) | 电商优化,更多模块 | 高并发电商 |
| OpenResty | 集成 Lua,可编程 | WAF、API 网关 |
| NGINX Plus | 商业版,WAF + 支持 | 企业生产 |
九、常见错误与排错
| 状态码 | 含义 | 排查方向 |
|---|---|---|
| 403 Forbidden | 权限不足或缺少 index 文件 | 检查目录权限、index 指令 |
| 404 Not Found | 文件不存在 | 检查 root 路径、URI 拼写 |
| 502 Bad Gateway | 后端服务(如 PHP-FPM)未启动 | 检查 upstream 服务状态 |
| Address already in use | 端口冲突 | ss -tulnp | grep :80 |
🔧 排错习惯:
- 先看
error.log- 使用
curl -I http://ip查看响应头- 避免混用
systemctl与nginx -s reload
十、DevOps 项目实战(NiuShop 电商)
10.1 环境要求
- LNMP:Nginx 1.26 + MySQL 5.7 + PHP 7.4
- 扩展:
fileinfo必须启用 - 内存:PHP ≥ 512M
10.2 部署流程
- 宝塔面板安装:一键部署 LNMP
- 域名绑定:
www.shop.com → 192.168.88.104(本地 hosts) - 伪静态配置(解决 404):
location / { if (!-e $request_filename) { rewrite (.*)$ /index.php/$1 last; break; } } - 目录调整:网站根目录设为
/niushop子目录
总结:Nginx 运维核心思想
| 维度 | 关键点 |
|---|---|
| 安全 | 防盗链、IP 控制、隐藏版本、禁用目录列表 |
| 性能 | Gzip、缓存、Keepalive |
| 可观测 | 日志 + GoAccess + Prometheus |
| 自动化 | 配置标准化、日志轮转脚本、CI/CD 集成 |
| 高可用 | 反向代理 + 负载均衡(后续章节) |
💡 终极目标:通过 Nginx 构建安全、高效、可观测、易维护的 Web 服务基础设施。

浙公网安备 33010602011771号