Skip to content

Nginx 使用指南

Nginx(读作 "Engine-X")是一个高性能的 Web 服务器 / 反向代理 / 负载均衡器,基于异步事件驱动架构,擅长处理高并发场景。


一、常用命令速查

bash
nginx -t                  # 检查配置文件语法
nginx -s reload           # 热重载配置(不中断服务)
nginx -s stop             # 快速停止
nginx -s quit             # 优雅停止(处理完当前请求再退出)
nginx -V                  # 查看编译参数和版本

systemctl start nginx     # 启动(systemd)
systemctl reload nginx    # 热重载(systemd)

二、使用场景速览

场景核心能力典型用途
Web 服务器静态资源托管、虚拟主机博客、企业官网、CDN 边缘节点
反向代理请求转发、隐藏后端应用服务器前置代理
负载均衡多种算法、故障转移电商、微服务集群
SSL/TLS 终端加解密卸载、证书管理HTTPS 网站、API 接入
API 网关路由、限流、鉴权微服务统一入口
内容缓存静态/动态内容缓存高流量 API、图片站
WebSocket 代理长连接转发实时聊天、在线游戏
流媒体服务RTMP / HLS 分发视频直播、点播

三、核心场景详解

Web 服务器

Nginx 异步事件驱动架构使其在静态资源服务上性能极强,单机可轻松支撑数万并发。

nginx
server {
    listen 80;
    server_name example.com;

    root /var/www/html;
    index index.html;

    # 静态资源直接返回,匹配不到时返回 index.html(适合 SPA)
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 静态资源缓存 30 天
    location ~* \.(jpg|jpeg|png|gif|css|js|ico|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

反向代理

客户端只与 Nginx 通信,后端服务对外不可见,常用于隐藏内网服务、统一入口。

nginx
server {
    listen 80;
    server_name api.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_set_header   X-Forwarded-Proto $scheme;

        # 超时配置
        proxy_connect_timeout 10s;
        proxy_read_timeout    60s;
    }
}

负载均衡

将请求分发到多个后端节点,支持多种算法。

nginx
upstream backend {
    # 负载均衡算法(选其一,默认轮询)
    # least_conn;    # 最少连接数
    # ip_hash;       # 同一 IP 固定分配到同一节点(解决 Session 问题)

    server backend1.example.com weight=3;  # weight 越大,分配比例越高
    server backend2.example.com weight=2;
    server backend3.example.com weight=1;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
    }
}

三种负载均衡算法对比:

算法配置特点适用场景
轮询(默认)无需配置依次分发,可加权重无状态服务
最少连接least_conn分配给当前连接数最少的节点处理时间差异较大的请求
IP 哈希ip_hash同 IP 固定路由到同一节点有状态服务(如 Session)

SSL/TLS 终端代理

Nginx 统一处理加解密,后端服务只需监听 HTTP,减轻后端加密负担

nginx
server {
    listen 443 ssl;
    server_name example.com;

    # 证书路径(Let's Encrypt 免费证书或商业证书)
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # 推荐的安全配置
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ssl_session_cache   shared:SSL:10m;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

# HTTP 强制跳转 HTTPS
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

API 网关 & 限流

nginx
# 定义限流区域:每个 IP 每秒最多 10 个请求
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

server {
    listen 80;
    server_name api.example.com;

    # IP 黑白名单
    # allow 192.168.1.0/24;
    # deny all;

    location /api/ {
        limit_req zone=api_limit burst=20 nodelay;  # 允许突发 20 个请求

        proxy_pass http://backend;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

内容缓存

nginx
# 定义缓存区域
proxy_cache_path /var/cache/nginx levels=1:2
                 keys_zone=my_cache:10m
                 max_size=1g
                 inactive=60m;

server {
    listen 80;
    location /api/ {
        proxy_cache            my_cache;
        proxy_cache_valid      200 10m;   # 200 响应缓存 10 分钟
        proxy_cache_valid      404 1m;
        proxy_cache_use_stale  error timeout updating;

        add_header X-Cache-Status $upstream_cache_status;  # 便于调试:HIT/MISS

        proxy_pass http://backend;
    }
}

WebSocket 代理

WebSocket 需要 HTTP Upgrade,Nginx 需要特别配置。

nginx
server {
    listen 80;
    server_name ws.example.com;

    location /ws/ {
        proxy_pass          http://127.0.0.1:9000;

        # WebSocket 必须的升级头
        proxy_http_version  1.1;
        proxy_set_header    Upgrade    $http_upgrade;
        proxy_set_header    Connection "upgrade";

        proxy_set_header    Host       $host;
        proxy_read_timeout  3600s;   # 长连接保持时间
    }
}

四、节点宕机处理

默认行为(无健康检查)

Nginx 检测到某节点连接失败时,会自动跳过该节点,将请求转发到其他可用节点。
若所有节点均不可用,返回 502 Bad Gateway504 Gateway Timeout

配置故障容忍

通过 max_fails + fail_timeout 控制节点摘除策略:

nginx
upstream backend {
    # 30 秒内失败 3 次 → 标记宕机,暂停 30 秒后重试
    server backend1.example.com max_fails=3 fail_timeout=30s;
    server backend2.example.com max_fails=3 fail_timeout=30s;

    # 热备节点:仅在所有主节点不可用时启用
    server backup.example.com   backup;
}
参数说明
max_fails时间窗口内允许的最大失败次数,超过则标记宕机
fail_timeout时间窗口长度,同时也是标记宕机后的等待恢复时间
backup备用节点,主节点全部宕机时才启用

主动健康检查

WARNING

Nginx 开源版不内置主动健康检查,有以下两个选项:

  • Nginx Plus(商业版):内置 health_check 指令
  • 开源方案:使用 nginx_upstream_check_module 第三方模块
nginx
# nginx_upstream_check_module 示例
upstream backend {
    server backend1.example.com;
    server backend2.example.com;

    # 每 3 秒检查一次,连续失败 3 次标记下线,成功 2 次恢复上线
    check interval=3000 rise=2 fall=3 timeout=1000 type=http;
    check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx;
}

宕机处理完整流程

客户端请求


Nginx 负载均衡
    ├─ 节点 A(正常)→ 转发请求 ✅
    ├─ 节点 B(失败次数 < max_fails)→ 仍尝试转发
    └─ 节点 C(失败次数 ≥ max_fails)→ 跳过,等待 fail_timeout

fail_timeout 到期后
    └─ 节点 C 重新加入候选池,发一个探测请求
        ├─ 成功 → 恢复正常 ✅
        └─ 失败 → 继续标记宕机,重新计时