一句话定位: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 日志分析 |