← 返回技术札记
运维实践

Nginx 进阶实战:从架构原理到高可用运维

深入 Nginx 核心架构、掌握生产级配置优化、负载均衡、动静分离、限流防护及高可用方案

nginxlinux运维负载均衡高可用

Nginx 进阶实战:从架构原理到高可用运维

一、引言:为什么 Nginx 是现代 Web 架构的基石

在互联网高并发浪潮下,静态资源分发、反向代理、负载均衡早已成为核心基础设施。Nginx 凭借其超高并发处理能力(单机可轻松应对数万并发连接)、极低的内存占用(每个连接仅占用几 KB),以及强大的扩展性,成为构建高性能架构的事实标准。

本文将从架构原理出发,逐步深入到生产一线的配置优化与高级应用场景。


二、核心架构:Nginx 高性能的秘密

2.1 Master-Worker 进程模型

Nginx 启动后包含两种进程:

  • Master 进程:负责读取并验证配置文件、管理 Worker 进程的生命周期,不直接处理网络请求。
  • Worker 进程:真正处理网络请求的进程。通常将 Worker 数设为等于 CPU 核心数(worker_processes auto;),避免上下文切换开销。
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;

Worker 之间平等独立,每个 Worker 通过争抢机制从共享监听 socket 获取新连接,互不干扰。

2.2 异步非阻塞事件模型(epoll)

Nginx 采用 Linux 的 epoll 模型(BSD 上为 kqueue)。与 Apache 的 prefork 模式——每个请求独占一个进程——不同,Nginx 的单个 Worker 通过异步非阻塞 I/O 可同时处理数万个连接。

特性 Apache (prefork) Nginx (epoll)
并发模型 多进程/多线程 单线程事件驱动
内存消耗 极低
C10K 能力 困难 原生支持
长连接性能 优秀

关键理解:Nginx Worker 内部是单线程事件循环,通过 epoll_wait 等待就绪事件并分发给 handler。无线程切换、无锁竞争,这就是极致性能的根源。


三、反向代理与正向代理

  • 正向代理(Forward Proxy):代理客户端。如 VPN、公司网关,服务端感知不到真实客户端。
  • 反向代理(Reverse Proxy):代理服务端。客户端访问反向代理,由代理转发给后端(Upstream),客户端不知道后端的存在。

在实际部署中,Nginx 还承担 SSL 终结、缓存、压缩、安全过滤等职责,是后端服务的统一入口。


四、生产级核心配置优化

# nginx.conf 核心优化示例

worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;

events {
    use epoll;
    worker_connections 10240;
    multi_accept on;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    keepalive_timeout  65;
    client_body_buffer_size 128k;

    gzip              on;
    gzip_min_length   1k;
    gzip_comp_level   5;
    gzip_types text/plain text/css application/json application/javascript text/xml;

    server_tokens     off;
    client_max_body_size 20m;

    include /etc/nginx/conf.d/*.conf;
}

关键点:

  • sendfile on:利用 sendfile() 系统调用,数据从磁盘到网卡零拷贝传输。
  • tcp_nopush on:攒够一个 MSS 大小的包再发送,减少网络包数量。
  • tcp_nodelay on:小包立即发送,降低 latency。与 tcp_nopush 作用于不同场景,不矛盾。

五、负载均衡策略

5.1 轮询 + 权重(默认)

upstream backend_servers {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=1;
    server 192.168.1.12:8080 backup;
}

5.2 IP Hash(解决 Session 保持)

upstream backend_servers {
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

注意:临时下线应用 down 标记,不要直接删除,避免哈希环变化。

5.3 最小连接数(least_conn)

upstream backend_servers {
    least_conn;
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=1;
}

5.4 健康检查

upstream backend_servers {
    server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
}

5.5 完整反向代理配置

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

    location / {
        proxy_pass http://backend_servers;
        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 30s;
        proxy_send_timeout    60s;
        proxy_read_timeout    60s;

        proxy_buffering       on;
        proxy_buffer_size     4k;
        proxy_buffers         8 64k;
    }
}

六、动静分离

静态资源由 Nginx 直接分发,动态请求转发后端:

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

    location /api/ {
        proxy_pass http://backend_servers;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf)$ {
        root /data/www/static;
        expires      30d;
        add_header   Cache-Control "public, immutable";
        access_log   off;
    }

    location / {
        root   /data/www/dist;
        index  index.html;
        try_files $uri $uri/ /index.html;
    }
}

七、运维防线:限流与安全

7.1 请求频率限制

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

server {
    listen 80;
    location /login/ {
        limit_req zone=mylimit burst=5 nodelay;
        proxy_pass http://backend_servers;
    }
}
  • rate=10r/s:每 IP 每秒最多 10 个请求。
  • burst=5:允许突发排队 5 个,超额直接拒绝。
  • nodelay:排队请求不被延迟。

7.2 并发连接数限制

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server {
    location /download/ {
        limit_conn perip 1;
        limit_conn perserver 100;
    }
}

7.3 安全加固

  • server_tokens off; — 隐藏版本号
  • 只允许 GET / POST / HEAD
  • add_header X-Frame-Options "SAMEORIGIN"; — 防点击劫持
  • 禁用危险方法:
if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 405;
}

八、SSL/TLS 配置

server {
    listen       443 ssl http2;
    server_name  www.example.com;

    ssl_certificate     /etc/nginx/ssl/example.com.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;

    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  10m;
    ssl_session_tickets  off;

    ssl_stapling         on;
    ssl_stapling_verify  on;
    resolver             8.8.8.8 8.8.4.4 valid=300s;

    add_header Strict-Transport-Security "max-age=63072000" always;

    location / {
        proxy_pass http://backend_servers;
    }
}

server {
    listen 80;
    server_name www.example.com;
    return 301 https://$server_name$request_uri;
}

九、日志管理

便于对接 ELK / Promtail:

http {
    log_format json_combined escape=json '{'
        '"time_local":"$time_local",'
        '"remote_addr":"$remote_addr",'
        '"request":"$request",'
        '"status":$status,'
        '"request_time":$request_time,'
        '"upstream_response_time":"$upstream_response_time"'
    '}';

    access_log /var/log/nginx/access.log json_combined;
    error_log  /var/log/nginx/error.log  warn;
}

request_time 是总耗时,upstream_response_time 是等待上游的耗时,差值即 Nginx 本身开销。


十、高可用:Keepalived + Nginx

单台 Nginx 是单点故障。用 Keepalived 实现双机 VIP 漂移:

         虚拟 IP (VIP)
              |
     +--------+--------+
     |                  |
   Nginx-A  <-------> Nginx-B
  (Master)   VRRP协议  (Backup)
     |                  |
   Backend Cluster

Keepalived 通过 VRRP 心跳检测存活,Master 宕机时 Backup 秒级接管。

vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    virtual_ipaddress {
        192.168.1.200/24
    }

    track_script {
        chk_nginx
    }
}

十一、总结

  1. Master-Worker + epoll 是 Nginx 高性能的底层支柱。
  2. 反向代理 统一流量入口,隔离后端细节。
  3. 负载均衡 配合健康检查保障高可用。
  4. 动静分离、Gzip、SSL 优化 是必须掌握的配置要领。
  5. 限流机制 是抵御恶意流量的第一道防线。
  6. Keepalived 补上高可用的最后一块拼图。