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 优先级顺序(从高到低)

  1. 精准匹配location = / {} → 最高
  2. 前缀匹配(^~)location ^~ /images/ {} → 第二
  3. 正则匹配
    • ~:区分大小写(如 location ~ /News/
    • ~*:不区分大小写(如 location ~* \.(gif\|jpg)$
  4. 普通前缀匹配location /data/ {}
  5. 默认匹配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,但继续当前 location
    • redirect: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 监控栈

  1. 部署 nginx_exporter(采集 stub_status 数据)
  2. Prometheus 配置
    - job_name: 'nginx'
      static_configs:
        - targets: ['192.168.88.104:9113']
    
  3. 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 查看响应头
  • 避免混用 systemctlnginx -s reload

十、DevOps 项目实战(NiuShop 电商)

10.1 环境要求

  • LNMP:Nginx 1.26 + MySQL 5.7 + PHP 7.4
  • 扩展fileinfo 必须启用
  • 内存:PHP ≥ 512M

10.2 部署流程

  1. 宝塔面板安装:一键部署 LNMP
  2. 域名绑定www.shop.com → 192.168.88.104(本地 hosts)
  3. 伪静态配置(解决 404):
    location / {
        if (!-e $request_filename) {
            rewrite (.*)$ /index.php/$1 last;
            break;
        }
    }
    
  4. 目录调整:网站根目录设为 /niushop 子目录

总结:Nginx 运维核心思想

维度 关键点
安全 防盗链、IP 控制、隐藏版本、禁用目录列表
性能 Gzip、缓存、Keepalive
可观测 日志 + GoAccess + Prometheus
自动化 配置标准化、日志轮转脚本、CI/CD 集成
高可用 反向代理 + 负载均衡(后续章节)

💡 终极目标:通过 Nginx 构建安全、高效、可观测、易维护的 Web 服务基础设施。

posted @ 2025-12-25 16:58  ShiLiCoder  阅读(105)  评论(0)    收藏  举报