一句话定位: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 |
全局生效 |
user、worker_processes、error_log、pid、worker_rlimit_nofile |
| events |
影响连接处理 |
worker_connections、use(epoll/kqueue) |
| http |
所有 HTTP 功能 |
include、gzip、log_format、upstream、server |
| server |
单个虚拟主机 |
listen、server_name、root、location |
| location |
URL 匹配后的处理 |
proxy_pass、rewrite、expires、deny/allow |
| upstream |
后端服务器组 |
server、weight、ip_hash、least_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 日志分析 |