Nginx
Nginx 是高性能的反向代理 / 负载均衡 / 静态文件服务器,采用事件驱动 + 非阻塞 I/O 模型(Master-Worker 进程架构),以极低内存支撑高并发连接,是生产环境最常见的流量入口。
进程模型
Master 进程(1个)
├── 读取/验证配置
├── 管理 Worker 生命周期(热重载不中断流量)
└── Worker 进程(= CPU 核数)
├── 每个 Worker 单线程,epoll 驱动事件循环
└── 处理数千个并发连接,无线程切换开销
核心配置结构
# /etc/nginx/nginx.conf
worker_processes auto; # Worker 数量,auto = CPU 核数
worker_rlimit_nofile 65535; # 每个 Worker 最大文件描述符
events {
worker_connections 4096; # 每个 Worker 最大并发连接数
use epoll;
multi_accept on;
}
http {
include mime.types;
sendfile on;
gzip on;
gzip_types text/plain application/json application/javascript text/css;
# 各 server 块在独立文件中管理
include /etc/nginx/conf.d/*.conf;
}
反向代理
upstream backend {
least_conn; # 负载均衡策略:最少连接数
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
server 192.168.1.12:8080 backup; # 备用节点,主节点全挂才启用
keepalive 32; # 与后端保持长连接池
}
server {
listen 80;
server_name api.example.com;
location /api/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection ""; # 配合 keepalive
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_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
# 超时或后端报错自动切换到下一台
proxy_next_upstream error timeout http_500 http_502 http_503;
}
}
负载均衡策略
| 策略 | 配置 | 说明 |
|---|
| 轮询(默认) | 无需配置 | 按顺序分发,可设 weight |
| 最少连接 | least_conn | 分发给当前连接数最少的后端 |
| IP Hash | ip_hash | 同一 IP 固定路由到同一后端(会话保持) |
| 一致性 Hash | hash $request_uri consistent | 按 URI 哈希,适合缓存场景 |
| 随机 | random two least_conn | 随机选两个取连接最少的 |
HTTPS + HTTP/2
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
# HTTP 强制跳转 HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
静态文件服务
server {
listen 80;
server_name static.example.com;
root /var/www/html;
# 浏览器缓存
location ~* \.(js|css|png|jpg|svg|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# SPA 路由回退(Vue / React 单页应用)
location / {
try_files $uri $uri/ /index.html;
}
}
限流
http {
# 定义限流区(按 IP,10m 内存存约 16 万 IP)
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=100r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location /api/ {
limit_req zone=api_limit burst=200 nodelay; # 允许突发 200,超出立即拒绝
limit_conn conn_limit 20; # 每 IP 最多 20 个并发连接
limit_req_status 429;
limit_conn_status 429;
}
}
}
常用内置变量
| 变量 | 含义 |
|---|
$remote_addr | 客户端 IP(可能是代理 IP) |
$http_x_forwarded_for | 原始客户端 IP 链(经过多层代理) |
$request_time | 请求总处理时间(s),含响应传输 |
$upstream_response_time | 后端响应时间(s) |
$uri | 当前请求 URI(不含参数) |
$args | 查询字符串 |
$scheme | http 或 https |
访问日志格式
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time urt=$upstream_response_time';
access_log /var/log/nginx/access.log main buffer=16k flush=5s;
热重载
nginx -t # 校验配置语法
nginx -s reload # 不中断流量热重载配置
nginx -s quit # 优雅退出(处理完当前请求再退出)
Nginx vs OpenResty
| 特性 | Nginx | OpenResty |
|---|
| 基础 | Nginx 核心 | Nginx + LuaJIT |
| 业务逻辑 | 仅配置 | 可用 Lua 编写(访问 Redis/MySQL) |
| 动态路由 | 不支持 | 支持 |
| 适用场景 | 反向代理 / 静态文件 | API 网关 / WAF / 流量染色 |
相关链接