Appearance
Nginx 入门指南
Nginx 基础
常用命令
bash
# 启动
nginx
# 重新加载配置
nginx -s reload
# 停止
nginx -s stop
# 测试配置语法
nginx -t
# 指定配置文件
nginx -c /path/to/nginx.conf反向代理
基本配置
nginx
server {
listen 80;
server_name example.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_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}┌─────────────────────────────────────────────────────────────────┐
│ 反向代理原理 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Client ──▶ Nginx ──▶ Backend Server │
│ (代理) │
│ │
│ Client 不知道真实服务器地址 │
│ 真实服务器不知道 Client IP(除非通过 header 传递) │
│ │
└─────────────────────────────────────────────────────────────────┘💡 实战场景:
- 隐藏真实服务器 IP,防止攻击
- 统一入口,方便统一认证和日志
- 可以在 Nginx 层做 HTTPS 卸载
面试点:⭐⭐⭐⭐ 实战重要性:⭐⭐⭐⭐⭐
负载均衡
负载均衡策略
nginx
upstream backend {
# 轮询(默认)
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
upstream backend_weighted {
# 加权轮询
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 weight=1;
}
upstream backend_iphash {
# IP Hash(同一 IP 访问同一服务器)
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
upstream backend_least_conn {
# 最少连接数
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}负载均衡对比
| 策略 | 说明 | 适用场景 |
|---|---|---|
| 轮询 | 依次分配 | 无状态服务 |
| 加权轮询 | 按权重分配 | 服务器性能不同 |
| IP Hash | 同一 IP 访问同一服务器 | 有状态服务 |
| 最少连接 | 分配给连接最少的 | 长连接服务 |
💡 实战场景:
- 加权轮询:服务器性能不同,按比例分配
- IP Hash:Session 保持,同一用户访问同一服务器
面试点:⭐⭐⭐⭐ 实战重要性:⭐⭐⭐⭐⭐
动静分离
配置示例
nginx
server {
listen 80;
server_name example.com;
# 动态请求
location /api/ {
proxy_pass http://backend;
}
# 静态资源
location /static/ {
alias /usr/share/nginx/html/;
expires 30d; # 缓存30天
add_header Cache-Control "public";
}
# HTML 文件(不缓存)
location ~ \.(html|htm)$ {
alias /usr/share/nginx/html/;
expires -1;
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
}💡 实战场景:
- Nginx 处理静态资源(CSS/JS/图片)
- Tomcat/Node.js 处理动态请求
- 减少应用服务器压力
限流
限流配置
nginx
# 限流规则
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
location /api/ {
# 简单限流
limit_req zone=mylimit;
# 突发限流
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://backend;
}
}
# 连接数限流
limit_conn_zone $binary_remote_addr zone=connlimit:10m;
server {
location / {
limit_conn connlimit 10;
proxy_pass http://backend;
}
}限流算法
┌─────────────────────────────────────────────────────────────────┐
│ 限流算法 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 漏桶算法 (Leaky Bucket) │
│ - 固定速率处理请求 │
│ - 超出桶容量的请求丢弃 │
│ │
│ 2. 令牌桶算法 (Token Bucket) │
│ - 按固定速率生成令牌 │
│ - 请求需要获取令牌才能处理 │
│ - 允许突发流量 │
│ │
│ Nginx 使用的是令牌桶算法 │
│ │
└─────────────────────────────────────────────────────────────────┘面试点:⭐⭐⭐ 实战重要性:⭐⭐⭐
常用配置
HTTPS 配置
nginx
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://backend;
}
}
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}缓存配置
nginx
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m;
server {
location / {
proxy_cache my_cache;
proxy_cache_valid 200 1h;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
}
}总结
Nginx 核心知识点:
| 知识点 | 面试频率 | 实战重要性 |
|---|---|---|
| 反向代理原理 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 负载均衡策略 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 限流算法 | ⭐⭐⭐ | ⭐⭐⭐ |
| 动静分离 | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| HTTPS 配置 | ⭐⭐⭐ | ⭐⭐⭐ |
⚠️ 易错点提醒:
- proxy_pass 后面有 URI 时,会替换 location 匹配的路径
- upstream 默认是轮询,不保证同一 IP 访问同一服务器
- limit_req 默认是阻塞的,影响性能可用 burst
- 静态资源要设置缓存,动态请求不要缓存
- reload 会使用新配置,restart 会断开现有连接