第一章 Nginx 核心基础
1.1 Nginx 核心作用
Nginx 是企业通用的高性能网关服务,核心用途:托管静态资源、反向代理后端服务、负载均衡分发流量、网站安全防护、流量限流管控。主打低占用、高并发、稳定不宕机,是所有 Web 项目的统一入口服务。
核心优势:基于 epoll 事件模型、Master+Worker 进程架构,单服务可支撑十万级并发,远超传统 Apache、Tomcat。
1.2 正向代理与反向代理
正向代理:帮客户端上网(例:公司统一上网、翻墙),服务端看不到真实用户。
反向代理(99% 企业场景):帮后端服务接收请求,用户看不到真实后端服务,实现统一入口、隐藏服务地址、防护后端安全。
1.3 四大核心实战功能
-
静态托管:部署前端页面、图片、JS/CSS 等静态资源,速度远超后端程序
-
反向代理:转发接口请求至 Java/Go/Python 后端服务
-
负载均衡:多台后端服务分摊流量,避免单节点宕机、压力过载
-
网关治理:HTTPS 加密、压缩提速、限流防爬、跨域、日志审计、安全拦截
1.4 进程原理
Master 主进程:只管理配置、管控子进程,不处理用户请求
Worker 工作进程:真正处理用户请求,一般配置等于 CPU 核心数,性能最优
热重载原理:执行 reload 不会中断现有请求,新请求用新配置,业务零停机更新
1.5 长短连接适配
短连接:请求完成立即断开,适合静态资源,频繁握手、性能一般
长连接:一次握手、多次复用,适合接口、WebSocket,生产默认开启,配置合理超时避免资源占用
1.6 版本选型规范
学习/生产一律选用 Stable 稳定版,无未知漏洞、兼容性强;主线版仅测试尝新,禁止上线。
第二章 全平台安装与基础运维
2.1 安装前置依赖
所有 Linux 环境安装前执行,补齐编译、正则、压缩依赖,规避编译报错:
bash
# 安装Nginx编译必备依赖:gcc编译工具、pcre正则库、zlib压缩库
yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel make
2.2 快速安装
CentOS/RHEL
bash
# yum一键安装稳定版Nginx
yum install -y nginx
# 验证安装是否成功,输出版本号
nginx -v
Ubuntu/Debian
bash
# 更新软件源并安装Nginx
apt update && apt install -y nginx
# 验证安装
nginx -v
macOS
bash
# Homebrew安装并验证版本
brew install nginx && nginx -v
2.3 源码编译安装
适合企业定制版本、新增第三方模块、固定指定版本场景,可直接复制执行:
bash
# 下载官方1.24.0稳定版源码(企业通用稳定版本)
wget http://nginx.org/download/nginx-1.24.0.tar.gz
# 解压源码包
tar -zxvf nginx-1.24.0.tar.gz
# 进入源码目录
cd nginx-1.24.0
# 编译配置:指定安装路径 + 开启生产必备模块
./configure \
--prefix=/usr/local/nginx \ # 指定Nginx安装根目录
--with-http_gzip_module \ # 开启Gzip压缩模块(页面提速必备)
--with-http_ssl_module \ # 开启SSL加密模块(HTTPS必备)
--with-http_stub_status_module \ # 开启状态监控模块(监控QPS、连接数)
--with-http_v2_module # 开启HTTP2协议(提升并发访问速度)
# 编译并安装(纯源码编译,无外部依赖)
make && make install
# 配置系统全局命令,任意目录可直接使用nginx命令
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
# 验证编译安装成果
nginx -v
2.4 Windows 安装注意事项
- 仅下载稳定版压缩包;2. 解压至纯英文无空格路径;3. 必须在根目录执行命令
bash
start nginx # 启动Nginx服务
nginx -s reload # 热重载配置(不中断业务)
nginx -s quit # 优雅停止服务(等待请求结束再关闭)
nginx -t # 校验配置文件语法是否正确
2.5 核心目录作用
-
sbin:启动程序目录,存放Nginx主启动二进制文件 -
conf/nginx.conf:主配置文件,全局通用核心配置入口 -
conf.d:子配置目录(多站点拆分专用,规范项目结构) -
logs:日志目录(存放访问日志、错误日志、切割日志) -
html:默认静态资源目录,默认页面存放路径
2.6 核心运维命令
bash
nginx -t # 校验配置语法(修改配置后必执行,避免报错)
nginx -s reload # 热重载配置(生产更新首选,零停机不中断业务)
systemctl start/stop/restart nginx # 启停重启服务
systemctl enable nginx # 设置开机自启(服务器重启自动恢复服务)
2.7 外网访问故障排查
bash
# 防火墙放行HTTP(80)、HTTPS(443)端口,允许外网访问
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
# 重载防火墙规则,生效配置
firewall-cmd --reload
# 临时关闭SELinux(测试环境排障使用,生产可配置放行规则)
setenforce 0
第三章 Nginx 配置语法与规范
3.1 配置层级关系
全局块 → events 块 → http 块 → server 块(站点)→ location 块(路由匹配),下级配置覆盖上级,就近优先生效。
3.2 Location 匹配优先级
优先级从高到低:精准匹配 > 正则匹配 > 前缀匹配 > 通用兜底
-
location = /xxx精准匹配(最高优先级,完全匹配路径) -
location ~ /xxx区分大小写正则匹配 -
location ~* /xxx不区分大小写正则匹配 -
location /xxx前缀最长匹配(匹配开头路径) -
location /通用兜底匹配(所有未匹配路径全部命中)
3.3 语法易错点避坑
-
Nginx 不支持 if 嵌套,多条件禁止嵌套判断,会直接报错
-
root :拼接路径(root+访问路径);alias:替换路径(精准替换目录,静态资源代理首选)
-
try_files:优先匹配静态文件,不存在则跳转指定路径,专门解决 Vue/React 单页项目刷新404问题
3.4 Rewrite 重写规则
用于域名跳转、旧路由兼容、伪静态配置,四大关键字用途:
-
last:终止当前匹配,重新走全局location匹配(站内跳转)
-
break:终止匹配,直接执行当前location剩余配置
-
redirect:302 临时跳转(临时切换域名/路由,浏览器保留旧缓存)
-
permanent:301 永久跳转(域名永久迁移,浏览器永久缓存跳转规则)
nginx
# 落地案例:旧路由/old/xxx永久跳转新路由/new/xxx,适配项目路由迭代兼容
location /old {
# ^/old/(.*)$ 匹配所有old开头的子路径,$1承接原有路径参数
rewrite ^/old/(.*)$ /new/$1 permanent;
}
3.5 常用内置变量
-
$remote_addr:客户端真实IP地址 -
$host:当前访问的域名/主机名 -
$request_uri:完整原始请求地址(含参数) -
$proxy_add_x_forwarded_for:多层代理场景,拼接完整真实IP链路
3.6 高频变量深度避坑
这两个变量是路由404、参数丢失、重定向异常的核心诱因,是生产最高频踩坑点,二者核心差异与使用场景严格区分:
-
$request_uri :原始请求完整地址,包含GET参数、不会自动解码、永久不变,适合用于日志记录、重定向跳转、参数透传,生产优先使用
-
$uri :Nginx内部标准化后的URI,自动解码URL、自动去除参数、会被内部rewrite修改,适合用于匹配静态文件、路径判断,禁止用于跳转与日志
nginx
# 实战避坑示例:防止重定向参数丢失
# 正确写法:使用$request_uri,保留完整请求参数
return 301 https://$host$request_uri;
# 错误写法:使用$uri,会丢失所有GET参数,导致业务异常
# return 301 https://$host$uri;
第四章 核心实战场景配置
4.1 静态网站部署
nginx
# 静态站点服务配置,适配所有前后端分离SPA项目、静态官网
server {
listen 80; # 监听80端口,外网HTTP默认端口
server_name web.test.com; # 绑定当前站点域名,多个域名空格分隔
root /home/nginx/web; # 静态资源根目录,项目打包文件存放路径
index index.html index.htm; # 默认访问首页文件优先级
# 解决Vue/React单页项目刷新404问题
# 优先匹配真实静态文件,无文件则转发至index.html,由前端路由接管
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存配置,提升访问速度、减少服务器压力
# 图片、样式、脚本类资源长期缓存
location ~* \.(jpg|png|gif|js|css|ico|svg)$ {
expires 7d; # 浏览器缓存7天
add_header Cache-Control "public"; # 公开缓存,CDN可缓存
}
# 禁止访问.开头的隐藏文件(.env、.git、隐藏配置文件),防止信息泄露
location ~ /\. {
deny all;
}
}
4.2 反向代理配置
适配所有后端 Java/Go/Node 项目,含 WebSocket 长连接配置,全生产优化参数,可直接复用:
nginx
# 后端接口反向代理服务配置
server {
listen 80;
server_name api.test.com;
# 普通HTTP接口请求反向代理
location / {
proxy_pass http://127.0.0.1:8080; # 后端服务真实地址端口
proxy_set_header Host $host; # 向后端传递原始访问域名
proxy_set_header X-Real-IP $remote_addr; # 向后端传递客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路IP
# 生产环境缓冲与重定向优化
proxy_redirect off; # 关闭自动重定向,避免路由错乱
proxy_buffer_size 128k; # 响应缓冲区大小
proxy_buffers 4 128k; # 缓冲区数量与单块大小
proxy_connect_timeout 60s; # 连接后端超时时间
proxy_read_timeout 120s; # 读取后端响应超时时间(适配慢接口)
}
# WebSocket长连接配置(适配聊天、实时推送、在线协同场景)
location /ws {
proxy_pass http://127.0.0.1:8080/ws; # 后端WebSocket服务地址
proxy_http_version 1.1; # 启用HTTP1.1,支持长连接升级
proxy_set_header Upgrade $http_upgrade; # 声明协议升级
proxy_set_header Connection "upgrade"; # 开启连接升级
proxy_set_header Host $host;
proxy_read_timeout 300s; # 长连接超时时间,避免连接频繁断开
proxy_send_timeout 300s;
}
}
4.3 负载均衡策略
包含轮询、权重、会话保持、故障重试、备用节点,可按需开启,适配多节点后端集群:
nginx
http {
# 定义后端服务集群池,统一管理多节点服务
upstream backend_pool {
# 普通节点:3次失败判定节点故障,30秒内不再分发流量
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
# 备用节点:主节点全部故障后自动启用,平时不承载流量
server 192.168.1.12:8080 backup;
# 权重模式(默认轮询注释,权重越高,分配流量越多,适配配置不同性能节点)
# server 192.168.1.10:8080 weight=3;
# server 192.168.1.11:8080 weight=1;
# ip_hash会话保持:同一客户端IP固定访问同一后端节点,适配登录态场景
# ip_hash;
# least_conn最少连接:优先分发流量至空闲节点,适配请求耗时不均场景
# least_conn;
}
# 负载均衡入口服务
server {
listen 80;
server_name lb.test.com;
location / {
proxy_pass http://backend_pool; # 流量转发至集群池
# 透传客户端信息至后端集群节点
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
4.4 HTTPS 加密配置
nginx
# 80端口强制跳转HTTPS,全站加密,杜绝明文传输
server {
listen 80;
server_name ssl.test.com;
# 永久重定向,所有HTTP请求强制跳转HTTPS
return 301 https://$host$request_uri;
}
# 443加密端口核心配置,全站HTTPS+HTTP2提速
server {
listen 443 ssl http2; # 监听443加密端口,开启HTTP2多路复用
server_name ssl.test.com;
# 配置SSL证书路径(替换为自己的域名证书文件)
ssl_certificate /home/nginx/ssl/fullchain.pem; # 公钥证书
ssl_certificate_key /home/nginx/ssl/private.key; # 私钥证书
# 安全加密协议配置,禁用老旧不安全协议
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on; # 优先使用服务端加密套件
ssl_session_cache shared:SSL:10m; # 开启SSL会话缓存,减少握手耗时
ssl_session_timeout 10m; # 会话缓存有效期
# 静态站点托管
location / {
root /home/nginx/static;
index index.html;
try_files $uri $uri/ /index.html;
}
}
第五章 进阶功能配置
5.1 Gzip 压缩提速
nginx
http {
gzip on; # 开启Gzip全局压缩功能
gzip_min_length 1k; # 小于1KB的文件不压缩(避免压缩损耗大于传输损耗)
gzip_comp_level 6; # 压缩等级1-9,6级兼顾压缩率与CPU性能
# 指定需要压缩的文件类型(文本类资源压缩收益最高)
gzip_types text/plain text/css application/javascript application/json;
gzip_vary on; # 响应头标记压缩适配,兼容各类浏览器
}
5.2 Brotli 高阶压缩
nginx
http {
brotli on; # 开启Brotli高阶压缩(压缩率比Gzip高15%-20%)
brotli_min_length 1k; # 小文件跳过压缩
brotli_comp_level 6; # 压缩等级均衡性能与压缩率
# 适配文本、静态资源、SVG图片压缩
brotli_types text/plain text/css application/javascript application/json image/svg+xml;
}
5.3 限流风控配置
请求频率限流
nginx
http {
# 限流规则定义:基于客户端IP限流,内存空间10M,单IP每秒10次请求
# zone=req_limit:10m 开辟10M内存存储限流状态
# rate=10r/s 每秒最多10次请求
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
listen 80;
location / {
limit_req zone=req_limit burst=20 nodelay;
# burst=20 允许突发20次请求缓冲
# nodelay 突发请求不排队,直接放行,超出阈值返回429
root /home/nginx/static;
}
}
}
连接数限流
nginx
http {
# 定义并发连接限流内存区域
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
location / {
limit_conn conn_limit 10; # 单个IP最大允许10个并发连接
limit_conn_status 429; # 超出限制返回429状态码
}
}
}
5.4 IP 黑白名单
nginx
location / {
allow 127.0.0.1; # 放行本机回环地址
allow 192.168.1.0/24; # 放行内网整段网段,内网设备可自由访问
deny all; # 拒绝所有其他外网IP访问
}
5.5 跨域配置
nginx
location / {
add_header Access-Control-Allow-Origin *; # 允许所有域名跨域访问
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; # 允许的请求方式
add_header Access-Control-Allow-Headers *; # 允许所有请求头参数
# 预处理浏览器OPTIONS预检请求,直接返回成功,不转发后端
if ($request_method = OPTIONS) {
return 204;
}
}
5.6 文件上传大小限制
nginx
http {
client_max_body_size 50M; # 全局限制单请求最大50M,解决大文件上传413报错
}
5.7 动静分离架构
nginx
# 动静分离架构:静态资源Nginx直接托管,动态接口转发后端,大幅减轻后端压力
server {
listen 80;
server_name ds.test.com;
# 所有静态资源直接由Nginx处理,长期缓存
location ~* \.(png|jpg|gif|css|js|html)$ {
root /home/nginx/static; # 静态资源存放目录
expires 15d; # 浏览器缓存15天
add_header Cache-Control "public,max-age=1296000"; # 缓存时长秒数
}
# 动态接口、业务请求转发后端服务
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
5.8 多层代理真实IP获取
nginx
location / {
proxy_set_header X-Real-IP $remote_addr; # 传递直连客户端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 拼接完整代理IP链路
proxy_trusted_addresses 192.168.1.0/24; # 信任内网代理节点,避免IP伪造
}
5.9 安全加固配置
nginx
http {
server_tokens off; # 隐藏Nginx版本号,防止黑客针对特定版本漏洞攻击
# 拦截非法请求方式,只允许常规业务请求方法
if ($request_method !~ ^(GET|POST|PUT|DELETE|OPTIONS)$) {
return 403;
}
# 简易防盗链:仅允许本站域名访问资源,防止恶意盗刷流量
valid_referers none blocked *.test.com;
if ($invalid_referer) {
return 403;
}
}
5.10 状态监控模块
nginx
server {
listen 80;
# 开启Nginx原生状态监控页面
location /status {
stub_status on; # 启用状态统计功能,可查看连接数、请求数、QPS
allow 127.0.0.1; # 仅本机可访问监控页面,禁止外网暴露
deny all;
}
}
5.11 代理缓存配置
Nginx代理缓存是企业核心性能优化方案,可缓存后端接口、静态页面响应,减少后端重复计算、降低CPU/数据库压力、提升接口响应速度,适配首页、列表页、静态接口等高频只读场景。
nginx
http {
# 1. 定义缓存内存空间:路径、缓存大小、内存占用、过期时间、缓存键
proxy_cache_path /var/nginx/cache
levels=1:2 # 缓存文件目录分级存储,提升读写效率
keys_zone=api_cache:200m # 开辟200M内存存储缓存索引
max_size=10g # 磁盘缓存最大10G,自动淘汰旧缓存
inactive=7d # 7天未访问的缓存自动清理
use_temp_path=off; # 关闭临时目录,减少IO损耗
server {
listen 80;
server_name cache.test.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 2. 启用缓存并绑定缓存空间
proxy_cache api_cache;
# 200/301/302状态码响应缓存10分钟
proxy_cache_valid 200 301 302 10m;
# 404错误缓存1分钟,避免频繁请求无效资源
proxy_cache_valid 404 1m;
# 自定义缓存键,区分不同用户、不同请求
proxy_cache_key "$host$request_uri";
# 忽略缓存,携带Cookie、POST请求不缓存
proxy_cache_bypass $cookie_nocache $arg_nocache $args_post;
# 禁止缓存动态敏感接口
proxy_no_cache $cookie_nocache $arg_nocache $args_post;
# 响应头返回缓存状态,方便调试(HIT命中/MISS未命中)
add_header X-Proxy-Cache $upstream_cache_status;
}
# 动态敏感接口关闭缓存(登录、支付、个人中心)
location /api/user/ {
proxy_pass http://127.0.0.1:8080;
proxy_cache off;
}
}
}
5.12 企业级防盗链方案
弥补基础Referer防盗链短板,新增时间戳+签名鉴权防盗链,彻底解决图片、视频、静态资源恶意盗刷、流量窃取问题,适用于图片服务器、视频点播、资源付费场景。
nginx
http {
# 开启防盗链核心模块
secure_link on;
# 校验规则:资源路径+时间戳+密钥签名,过期自动失效
# 格式:资源地址?ts=时间戳&sign=MD5签名
secure_link_md5 "$uri$arg_ts my_secret_key";
server {
listen 80;
server_name res.test.com;
root /home/nginx/static;
# 静态资源防盗链匹配
location ~* \.(jpg|png|gif|mp4|webm)$ {
# 校验签名合法性,签名错误直接403
if ($secure_link = "") {
return 403;
}
# 校验时间戳是否过期(过期返回403)
if ($secure_link = "0") {
return 403;
}
# 合法资源放行,缓存提速
expires 7d;
add_header Cache-Control "public";
}
# 后台内部访问直接放行,无需鉴权
location ~* /admin/ {
allow 192.168.1.0/24;
deny all;
}
}
}
5.13 无BUG跨域优化配置
修复原通用跨域配置三大生产BUG:多域名跨域失效、重复Header报错、HTTPS跨域拦截,支持指定可信域名、兼容前后端分离全场景,企业生产标准通用。
nginx
server {
listen 80;
server_name api.test.com;
# 定义可信跨域域名(按需新增,拒绝*通配符不安全场景)
set $cors_origin "";
if ($http_origin ~* ^https?://(www\.test\.com|web\.test\.com)$) {
set $cors_origin $http_origin;
}
location / {
# 仅对可信域名返回跨域头,规避安全风险
add_header Access-Control-Allow-Origin $cors_origin always;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS always;
add_header Access-Control-Allow-Headers Content-Type,Authorization,X-Requested-With always;
add_header Access-Control-Allow-Credentials true always; # 允许携带Cookie
# 预检请求直接响应,不转发后端,解决跨域拦截问题
if ($request_method = OPTIONS) {
add_header Access-Control-Allow-Origin $cors_origin;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
add_header Access-Control-Allow-Headers Content-Type,Authorization,X-Requested-With;
add_header Access-Control-Allow-Credentials true;
return 204;
}
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
5.14 进程自启与崩溃守护
补齐Supervisor守护、开机自启、异常崩溃自动重启方案,解决Nginx意外宕机、进程退出无人恢复的生产问题,实现7*24小时稳定运行。
1、Systemd 开机自启
bash
# 新建systemd服务文件
vim /etc/systemd/system/nginx.service
# 写入以下配置
[Unit]
Description=Nginx High Performance Web Server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
Restart=always # 进程异常退出自动重启
RestartSec=3 # 重启间隔3秒
[Install]
WantedBy=multi-user.target
bash
# 生效配置、设置开机自启、启动服务
systemctl daemon-reload
systemctl enable nginx
systemctl start nginx
2、Supervisor 进程守护
bash
# 安装守护工具
yum install -y supervisor
systemctl enable supervisord
# 新建Nginx守护配置
vim /etc/supervisord.d/nginx.ini
ini
[program:nginx]
command=/usr/local/nginx/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true # 异常自动重启
startretries=10
user=root
stdout_logfile=/var/log/nginx/supervisor.log
bash
# 重启守护进程、生效配置
systemctl restart supervisord
5.15 Docker 容器化部署
补齐企业90%在用的Docker部署方案,包含镜像构建、目录挂载、配置持久化、容器自启、生产最优参数,替代传统虚拟机部署,适配云原生场景。
1、标准化Dockerfile
dockerfile
# 基于官方稳定版镜像
FROM nginx:1.24.0-alpine
# 维护者信息
MAINTAINER nginx-dev
# 删除默认配置,准备自定义挂载
RUN rm -rf /etc/nginx/conf.d/default.conf
# 拷贝全局自定义配置
COPY nginx.conf /etc/nginx/nginx.conf
# 暴露80/443端口
EXPOSE 80 443
# 容器前台运行,防止自动退出
CMD ["nginx","-g","daemon off;"]
2、Docker Compose 一键部署
yaml
version: '3.8'
services:
nginx:
image: nginx:1.24.0-alpine
container_name: nginx-prod
restart: always # 容器异常自动重启
ports:
- "80:80"
- "443:443"
# 目录挂载:配置、静态资源、日志持久化
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./conf.d:/etc/nginx/conf.d
- ./html:/usr/share/nginx/html
- ./logs:/var/log/nginx
# 时区同步
environment:
- TZ=Asia/Shanghai
# 内核优化
sysctls:
net.core.somaxconn: 65535
net.ipv4.tcp_syncookies: 1
3、一键启动命令
bash
# 后台启动容器
docker-compose up -d
# 重载Nginx配置(容器内执行)
docker exec -it nginx-prod nginx -s reload
# 校验配置语法
docker exec -it nginx-prod nginx -t
第六章 日志运维与故障排查
6.1 日志定时切割脚本
bash
#!/bin/bash
# Nginx日志按天自动切割脚本,配合crontab定时执行,避免单日志文件过大、占用磁盘
LOG_PATH=/var/log/nginx # Nginx日志默认存放路径
DATE=$(date -d "yesterday" +%Y%m%d) # 获取昨日日期,用于日志命名
# 重命名昨日访问日志、错误日志,按日期归档
mv $LOG_PATH/access.log $LOG_PATH/access_$DATE.log
mv $LOG_PATH/error.log $LOG_PATH/error_$DATE.log
# 通知Nginx重新创建空日志文件,无需重启服务
nginx -s reopen
6.2 慢请求日志配置
nginx
http {
slowlog_enable on; # 开启慢请求日志记录功能
slowlog_threshold 1000; # 阈值1000ms=1秒,超过1秒的请求判定为慢请求并记录
}
6.3 日志分析常用命令
bash
# 统计访问量TOP10客户端IP,排查恶意爬虫、高频访问IP
awk '{print $1}' access.log |sort |uniq -c |sort -nr |head -10
# 筛选所有4xx、5xx异常请求,快速定位业务报错
grep -E " 4[0-9]{2}|5[0-9]{2}" access.log
# 筛选所有慢请求日志,排查超时接口
grep "slow" error.log
6.4 高频报错解决方案
-
413 上传过大 :请求体超出限制,调大全局
client_max_body_size参数 -
429 请求过多:触发限流规则,调低限流频率、增大burst突发阈值
-
502 网关错误:后端服务未启动、代理IP/端口配置错误、端口未放行
-
504 超时 :后端接口响应慢,调大
proxy_connect_timeout、proxy_read_timeout超时时间 -
刷新404 :SPA单页项目缺失
try_files路由兜底配置
第七章 生产调优与工程规范
7.1 核心性能调优配置
nginx
http {
worker_rlimit_nofile 65535; # 提升单进程最大文件打开数,适配高并发场景
keepalive_timeout 30; # 长连接超时30秒,闲置连接自动释放
keepalive_requests 1000; # 单长连接最大复用1000次请求,避免连接老化
tcp_syncookies on; # 开启TCP防SYN洪水攻击
tcp_tw_reuse on; # 复用TIME_WAIT连接,提升端口利用率
}
7.2 生产落地规范
-
多站点配置统一放入 conf.d 目录拆分,不堆砌主配置文件,结构清晰易维护
-
所有配置修改后先
nginx -t校验语法,无误再 reload,避免服务报错 -
生产禁止 stop 强制停止,统一使用热重载更新,保证业务零停机
-
所有对外站点默认开启日志切割、版本隐藏、基础安全拦截配置
7.3 面试考点与避坑总结
核心考点:epoll 高并发原理、热重载无感知机制、负载均衡策略、限流原理、多层代理IP解析、HTTPS 加固
避坑清单:禁止if嵌套、禁止中文路径、超时参数必须配置、文件上传限制必须配置、上线必校验配置语法
附录:Nginx 配置速查表
一、核心运维命令
bash
# 校验配置文件语法(修改配置后必执行,提前排查错误)
nginx -t
# 热重载配置(生产零停机更新配置,优先使用)
nginx -s reload
# 优雅停止服务(等待已接入请求处理完毕再关闭)
nginx -s quit
# 强制停止服务(生产禁止使用,会中断正在处理的请求)
nginx -s stop
# 查看Nginx简易版本号
nginx -v
# 查看详细版本+编译模块(排查模块缺失问题)
nginx -V
# 设置开机自启,服务器重启自动恢复Nginx服务
systemctl enable nginx
# 启停重启服务
systemctl start/stop/restart nginx
二、全局通用基础配置
nginx
http {
server_tokens off; # 隐藏版本号,安全加固防漏洞扫描
client_max_body_size 50M; # 全局限制文件上传最大50M
keepalive_timeout 30s; # 长连接超时时间
keepalive_requests 1000; # 单连接最大请求复用次数
worker_rlimit_nofile 65535; # 提升高并发文件句柄上限
# 通用Gzip资源压缩,全站文本资源提速
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/javascript application/json;
}
三、静态网站通用配置
nginx
server {
listen 80;
server_name web.test.com;
root /home/nginx/web;
index index.html;
# 解决SPA单页项目刷新404、路由跳转404问题
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源长期缓存,减少重复加载
location ~* \.(jpg|png|gif|js|css|ico|svg)$ {
expires 7d;
add_header Cache-Control "public";
}
# 禁止访问隐藏配置文件,防止信息泄露
location ~ /\. {
deny all;
}
}
四、后端接口反向代理配置
nginx
server {
listen 80;
server_name api.test.com;
location / {
proxy_pass http://127.0.0.1:8080; # 后端服务地址
# 透传客户端真实信息至后端
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 生产超时、缓冲优化参数,适配业务场景
proxy_redirect off;
proxy_connect_timeout 60s;
proxy_read_timeout 120s;
proxy_buffer_size 128k;
}
}
五、WebSocket 长连接配置
nginx
# 适配聊天、实时推送、在线协同长连接场景
location /ws {
proxy_pass http://127.0.0.1:8080/ws;
proxy_http_version 1.1; # 启用HTTP1.1支持协议升级
proxy_set_header Upgrade $http_upgrade; # 声明WebSocket协议升级
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 300s; # 长连接超时5分钟
proxy_send_timeout 300s;
}
六、基础限流配置
nginx
http {
# 单IP限流:每秒10次请求,内存缓存10M
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
# 单IP并发连接限流内存区域
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
location / {
limit_req zone=req_limit burst=20 nodelay; # 突发20次缓冲
limit_conn conn_limit 10; # 最大10并发连接
limit_conn_status 429; # 超限返回429状态码
}
}
}
七、通用跨域配置
nginx
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
add_header Access-Control-Allow-Headers *;
if ($request_method = OPTIONS) {
return 204;
}
}