Skip to content
第 209 / 250 章运维⏱ 12 分钟阅读

第 209 章:Nginx 入门与反向代理

学习目标

  • 理解 Nginx 核心概念
  • 掌握反向代理与负载均衡
  • 学会静态资源服务
  • 配置 HTTPS 与性能调优

一、Nginx 简介

Nginx 是高性能的 HTTP / 反向代理服务器,以高并发、低内存著称。

特点:

  • 异步非阻塞
  • 单机 5w+ 并发
  • 配置简单
  • 模块化

二、安装

bash
# Ubuntu
sudo apt install nginx

# CentOS
sudo yum install nginx

# Docker
docker run -d -p 80:80 -v /myconf:/etc/nginx/conf.d nginx:alpine

# 服务管理
sudo systemctl start nginx
sudo systemctl enable nginx

三、配置文件结构

nginx
# /etc/nginx/nginx.conf

# 全局块
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# events 块
events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

# http 块(全局)
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    sendfile on;
    keepalive_timeout 65;

    # 引入子配置
    include /etc/nginx/conf.d/*.conf;
}

# server 块(虚拟主机)
server {
    listen 80;
    server_name example.com;

    # location 块(URL 匹配)
    location / {
        root /var/www/html;
        index index.html;
    }
}

四、常用命令

bash
nginx                  # 启动
nginx -t               # 测试配置
nginx -s reload        # 重载配置(热更新)
nginx -s stop          # 停止
nginx -s quit          # 优雅停止

五、静态资源服务

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

    # 静态文件
    location / {
        root /data/static;
        index index.html;
        autoindex on;             # 列出文件
        autoindex_exact_size off; # 友好大小
    }

    # 缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        root /data/static;
        expires 7d;
        add_header Cache-Control "public";
    }

    # gzip 压缩
    gzip on;
    gzip_types text/plain application/javascript text/css application/json;
    gzip_min_length 1k;
}

六、反向代理

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

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;

        # 传 header
        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_send_timeout 10s;
        proxy_read_timeout 10s;

        # 缓冲
        proxy_buffering on;
        proxy_buffer_size 8k;
        proxy_buffers 8 8k;
    }
}

七、负载均衡

nginx
upstream backend {
    # 负载均衡策略
    least_conn;                  # 最少连接
    # ip_hash;                  # 同一 IP 到同一后端
    # random;                   # 随机
    # weight 权重

    server 192.168.1.1:3000 weight=3;
    server 192.168.1.2:3000 weight=2;
    server 192.168.1.3:3000 weight=1;

    # 健康检查(被动)
    keepalive 32;                 # 长连接池
    keepalive_timeout 60s;
}

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

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

7.1 负载均衡算法

算法说明场景
round-robin (默认)轮询服务器性能一致
weight加权轮询性能不同
least_conn最少连接长连接
ip_hash按 IP hashSession 保持
least_time响应最快性能差异大
random随机大规模

7.2 健康检查(主动)

需要 nginx-plus 或第三方模块如 nginx_upstream_check_module

nginx
upstream backend {
    server 192.168.1.1:3000;
    server 192.168.1.2:3000;

    check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    check_http_send "GET /health HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

八、HTTPS

8.1 自签证书(测试)

bash
mkdir ~/certs && cd ~/certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout privkey.pem -out fullchain.pem \
  -subj "/CN=example.com"

8.2 配置 HTTPS

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

    ssl_certificate /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;

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

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

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

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

8.3 Let's Encrypt 免费证书

bash
# 安装 certbot
sudo apt install certbot python3-certbot-nginx

# 自动配置
sudo certbot --nginx -d example.com -d www.example.com

# 自动续期
sudo certbot renew --dry-run

九、限流

nginx
http {
    # 定义 zone
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

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

        location /api/ {
            limit_req zone=api_limit burst=20 nodelay;
            proxy_pass http://backend;
        }
    }
}

参数:

  • rate=10r/s:每秒 10 个请求
  • burst=20:允许突发 20 个
  • nodelay:超出立即拒绝(默认排队延迟)

十、WebSocket 代理

nginx
location /ws/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_read_timeout 600s;   # 长连接
}

十一、缓存配置

nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;

server {
    location / {
        proxy_pass http://backend;
        proxy_cache my_cache;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_cache_valid 200 5m;
        proxy_cache_valid 404 1m;

        add_header X-Cache-Status $upstream_cache_status;
    }
}

$upstream_cache_status:HIT / MISS / EXPIRED / BYPASS

十二、日志

nginx
log_format main '$remote_addr - $remote_user [$time_local] '
                '"$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent" '
                'rt=$request_time uct=$upstream_connect_time '
                'urt=$upstream_response_time';

access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;

十三、性能调优

nginx
# worker 数量(一般 = CPU 核心数)
worker_processes auto;

# 每个 worker 最大连接
events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}

http {
    # 文件传输
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    # 长连接
    keepalive_timeout 30;
    keepalive_requests 100;

    # 压缩
    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 6;
    gzip_types text/plain application/javascript application/json text/css;

    # 客户端 body 上限
    client_max_body_size 50M;

    # 缓冲区
    proxy_buffer_size 16k;
    proxy_buffers 4 32k;
}

十四、本章小结

模块用途
http全局配置
server虚拟主机
locationURL 匹配
upstream负载均衡
proxy_pass反向代理

动手练习

  1. 配置 Nginx 反向代理 Node 应用
  2. 实现 3 节点负载均衡
  3. 配置 HTTPS(自签证书)
  4. 启用 gzip + 限流

推荐阅读


下一章:第 210 章:Nginx 进阶配置

本站基于 VitePress 构建 · 由 Codebook 团队维护