nginx:详解与速查表 / Nginx = 反向代理 + 负载均衡 + 静态服务器 + HTTP 缓存 / 请求分发、静态加速、上线不中断

一句话定位:Nginx = 反向代理 + 负载均衡 + 静态服务器 + HTTP 缓存,解决"请求怎么分发、静态怎么加速、上线怎么不中断"三个核心问题。

一、Nginx 是什么

维度 内容
本质 事件驱动、异步非阻塞的高性能 Web 服务器 / 反向代理
并发能力 官方数据支持 50,000+ 并发连接
内存消耗 每个 worker 进程约 10-12MB,远低于 Apache
核心优势 热部署(reload 不断连)、低资源、高稳定
典型用户 百度、淘宝、京东、腾讯、新浪、网易
Nginx vs Apache Nginx Apache
架构 事件驱动、异步 进程/线程驱动、同步
并发 极高(万级) 一般(千级)
内存 低(~10MB/进程) 高(~20MB/进程)
动态模块 需编译安装 动态加载
适用场景 反向代理、静态服务、高并发 动态内容、.htaccess 灵活配置

二、配置文件结构

主配置文件:/etc/nginx/nginx.conf(Linux 默认)

复制代码
main(全局块)
 ├── events(事件块)
 └── http(HTTP 块)
      ├── upstream(后端服务器组)
      ├── server(虚拟主机)
      │    ├── location(URL 匹配规则)
      │    └── location
      └── server
配置块 作用域 核心指令
main 全局生效 userworker_processeserror_logpidworker_rlimit_nofile
events 影响连接处理 worker_connectionsuse(epoll/kqueue)
http 所有 HTTP 功能 includegziplog_formatupstreamserver
server 单个虚拟主机 listenserver_namerootlocation
location URL 匹配后的处理 proxy_passrewriteexpiresdeny/allow
upstream 后端服务器组 serverweightip_hashleast_conn

就近原则:同一指令在不同层级出现,以最低层级(最具体)为准。

三、核心功能详解

3.1 反向代理

对比 正向代理 反向代理
代理对象 客户端 服务器
保护谁 客户端 源服务器
客户端感知 知道代理存在 无感知
典型用途 VPN、翻墙 负载均衡、安全防护
复制代码
nginx

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
指令 说明
proxy_pass 转发目标地址,末尾 / 非常关键
proxy_set_header Host $host 传递原始域名,否则后端拿到的是 proxy_pass 的地址
proxy_set_header X-Real-IP $remote_addr 传递真实客户端 IP
proxy_connect_timeout 连接后端超时
proxy_read_timeout 读取后端响应超时
proxy_send_timeout 发送请求到后端超时

⚠️ proxy_pass http://127.0.0.1:3000;(无斜杠)和 proxy_pass http://127.0.0.1:3000/;(有斜杠)行为不同,前者保留原始 URI,后者替换为 /

3.2 负载均衡

策略 指令 说明 适用场景
轮询(默认) 依次分配 后端性能相近
权重 weight=N 权重越高,请求越多 后端性能不等
ip_hash ip_hash 同一 IP 固定到同一台 解决 session 共享问题
least_conn least_conn 分配给连接数最少的 请求处理时间差异大
fair(第三方) fair 按响应时间分配 nginx-upstream-fair 模块
url_hash hash $request_uri 按 URL hash 分配 缓存命中率优化
复制代码
nginx

upstream backend {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=1;
    server 192.168.1.12:8080 backup;     # 备用,主节点挂了才用
    server 192.168.1.13:8080 down;      # 标记下线
    keepalive 32;                       # 保持长连接
}
server 参数 说明
weight=N 权重,默认 1
max_fails=N N 次失败后标记为不可用
fail_timeout=N 失败窗口时间(秒)
down 永久下线
backup 备胎,主节点全挂才顶上
backup + weight 备胎也能参与权重分配

3.3 动静分离

方式 做法 优缺点
独立域名 static.example.com 放独立服务器/CDN ✅ 推荐,彻底分离
location 区分 按后缀名匹配,静态走 root,动态走 proxy_pass ✅ 简单,主流方案
复制代码
nginx

server {
    listen 80;
    server_name example.com;

    # 静态资源:直接由 Nginx 返回
    location ~* \.(css|js|png|jpg|ico|woff2)$ {
        root /var/www/html;
        expires 30d;           # 浏览器缓存 30 天
        access_log off;        # 静态资源不记访问日志
    }

    # 动态请求:转发给后端
    location / {
        proxy_pass http://backend;
    }
}
缓存指令 说明
expires 30d 浏览器缓存 30 天,期间不发请求到服务端
expires epoch 禁止缓存
expires -1 同上
add_header Cache-Control "no-cache" 强制每次验证
add_header Cache-Control "public, max-age=31536000" 强制缓存 1 年

3.4 HTTPS 配置

复制代码
nginx

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate     /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # HTTP 强制跳转 HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

四、全局变量速查表

变量 含义 示例值
$remote_addr 客户端 IP 192.168.1.100
$http_x_forwarded_for 代理链中的真实 IP 10.0.0.1, 192.168.1.100
$request_method 请求方法 GET / POST
$request_uri 含参数的原始 URI /foo/bar.php?arg=baz
$uri 不含参数的 URI /foo/bar.php
$args 请求参数 arg=baz
$host 请求头中的 Host example.com
$scheme 协议 http / https
$server_addr 服务器地址 192.168.1.10
$server_port 服务器端口 80 / 443
$server_name 服务器名称 example.com
$time_local 本地时间 09/Jun/2026:16:20:09
$status 响应状态码 200 / 404 / 502
$body_bytes_sent 发送给客户端的字节数 1024
$http_user_agent 客户端浏览器信息 Mozilla/5.0...
$http_referer 来源页面 https://google.com
$http_cookie Cookie session=abc123
$nginx_version Nginx 版本 1.24.0

五、常用命令速查表

操作 命令 说明
启动 nginx 使用默认配置文件启动
指定配置启动 nginx -c /path/to/nginx.conf
测试配置语法 nginx -t ✅ 上线前必跑
测试并输出完整配置 nginx -T 含所有 include 文件
热重载(不中断服务) nginx -s reload ⭐ 最常用
优雅停止 nginx -s quit 处理完当前请求再退出
快速停止 nginx -s stop 立即终止
重新打开日志(日志切割) nginx -s reopen 配合 logrotate 使用
查看版本(简) nginx -v
查看版本(详) nginx -V 含编译参数、模块
查看帮助 nginx -h
查看主进程 PID cat /var/run/nginx.pid
优雅停止(kill) kill -QUIT <主进程PID> 等同 nginx -s quit
重载配置(kill) kill -HUP <主进程PID> 等同 nginx -s reload
重新打开日志(kill) kill -USR1 <主进程PID> 等同 nginx -s reopen
systemctl 重载 systemctl reload nginx 注册为服务后使用
systemctl 重启 systemctl restart nginx ⚠️ 会中断连接
场景 推荐命令 原因
修改配置后生效 nginx -s reload 热重载,不断连
日志切割后 nginx -s reopen 重新打开日志文件
完整停止服务 nginx -s quit 优雅,不丢请求
紧急停止 nginx -s stop 立即终止
排查问题 nginx -t && nginx -s reload 先检查再重载

六、日志分析速查表

操作 命令
实时查看访问日志 tail -f /var/log/nginx/access.log
实时查看错误日志 tail -f /var/log/nginx/error.log
查看最后 100 行 tail -n 100 /var/log/nginx/access.log
搜索 404 grep " 404 " /var/log/nginx/access.log
统计访问 IP TOP 10 `awk '{print $1}' /var/log/nginx/access.log
统计 URL TOP 10 `awk '{print $7}' /var/log/nginx/access.log
统计状态码分布 `awk '{print $9}' /var/log/nginx/access.log
实时监控(推荐) ngxtop(类似 top 的实时监控工具)

七、配置文件路径速查表

路径 说明
/etc/nginx/nginx.conf 主配置文件(Linux 默认)
/etc/nginx/conf.d/ 额外配置文件目录(推荐放 server 块)
/etc/nginx/sites-available/ 可用站点(Debian/Ubuntu)
/etc/nginx/sites-enabled/ 已启用站点(Debian/Ubuntu,软链接)
/usr/local/nginx/conf/nginx.conf 源码编译默认路径
/usr/local/etc/nginx/nginx.conf macOS Homebrew 默认路径
/var/log/nginx/access.log 访问日志
/var/log/nginx/error.log 错误日志
/var/run/nginx.pid 主进程 PID 文件

八、实用配置片段速查表

场景 配置
禁止访问某 IP deny 192.168.1.100;
只允许某 IP allow 192.168.1.0/24; deny all;
防盗链(图片) valid_referers none blocked server_names *.google.com *.baidu.com; if ($invalid_referer) { return 403; }
强制 HTTPS return 301 https://$host$request_uri;
Gzip 压缩 gzip on; gzip_types text/css application/json; gzip_min_length 1k;
限流(按 IP) limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; limit_req zone=one burst=20;
跨域代理 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
WebSocket 代理 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
禁止搜索引擎收录 add_header X-Robots-Tag "noindex, nofollow";
自定义错误页 error_page 404 /404.html; error_page 502 /502.html;
隐藏 Nginx 版本 server_tokens off;(main 块)

九、性能调优关键参数

参数 推荐值 说明
worker_processes CPU 核心数(auto 每个进程独立处理连接
worker_connections 65535(或 1024~65535) 每个进程最大连接数,总并发 = 进程数 × 连接数
worker_rlimit_nofile 65535 进程最大文件描述符,需 ≥ worker_connections
keepalive_timeout 65 长连接超时,太短浪费连接,太长占资源
client_max_body_size 8m 上传文件大小限制
sendfile on on 零拷贝发送静态文件,必须开
tcp_nopush on on 减少网络报文数量
tcp_nodelay on on 降低延迟
gzip on on 压缩传输,节省带宽
gzip_min_length 1k 1k 小于 1k 不压缩(压缩反而变大)

十、一张图总结

你要解决的问题 Nginx 的角色 核心配置
静态文件太慢 静态服务器 root + expires + sendfile + gzip
动态请求不知道发给谁 反向代理 proxy_pass + upstream
一台后端扛不住 负载均衡 upstream + 权重/ip_hash/least_conn
上线怕断连 热部署 nginx -s reload(不是 restart)
HTTP 不安全 HTTPS 终端 ssl_certificate + 301 跳转
有人盗你的图 防盗链 valid_referers
有人刷你接口 限流 limit_req_zone
想看实时请求 监控 ngxtop / awk 日志分析
相关推荐
小则又沐风a2 小时前
进程最终篇---进程控制(模拟实现xshell)
java·linux·服务器·前端
云服务器代理商2 小时前
阿里云国内版迁移到国际版完整操作教程
服务器·阿里云·云计算·阿里云服务器·阿里云国际·阿里云海外
_codemonster2 小时前
K8s / K3s 通用 Kubectl 命令大全(表格版)
linux·docker·kubernetes
阿旭超级学得完2 小时前
Linux基础指令 四(apt,vim,git,cgdb)
linux·服务器·开发语言·数据结构·c++·git·vim
半夜修仙2 小时前
4.RabbitMQ运维
linux·运维·服务器·分布式·rabbitmq·java-rabbitmq
酉鬼女又兒2 小时前
零基础入门计算机网络:集线器与交换机区别、以太网交换机自学习转发流程及生成树协议STP全解析
服务器·网络·网络协议·tcp/ip·计算机网络·考研·职场和发展
ALINX技术博客2 小时前
【黑金云课堂】FPGA技术教程Linux开发:摄像头GPU渲染显示/Qt OpenGLES使用
linux·qt·fpga开发·gpu
无足鸟ICT2 小时前
【RHCA+】移动光标快捷键
linux·编辑器·vim
石小千2 小时前
DELL安装PERCCLI工具(ESXI)
服务器