Skip to content

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 配置⭐⭐⭐⭐⭐⭐

⚠️ 易错点提醒

  1. proxy_pass 后面有 URI 时,会替换 location 匹配的路径
  2. upstream 默认是轮询,不保证同一 IP 访问同一服务器
  3. limit_req 默认是阻塞的,影响性能可用 burst
  4. 静态资源要设置缓存,动态请求不要缓存
  5. reload 会使用新配置,restart 会断开现有连接