LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

Nginx终极配置指南:负载均衡、限流、反向代理、IP白名单、SSL、云原生、DNS解析、缓存加速一网打尽

admin
2025年12月10日 0:45 本文热度 12

今天我们来聊聊Nginx配置这个让无数程序员又爱又恨的话题。

你是否也遇到过这些场景:

  • 配置负载均衡时502、504错误频发?
  • 限流配置不当导致正常用户被误杀?
  • 反向代理配置后静态资源加载缓慢?
  • 想做IP白名单却发现动态IP无从下手?
  • SSL证书配置总是各种坑?
  • 云原生环境下DNS解析不及时?
  • 缓存配置不当反而影响用户体验?

别慌!今天我就把这套Nginx终极配置指南全掏出来,手把手教你用最实用的配置技巧,让你的Web服务稳如老狗,性能飞起来!

一、反向代理:连接前后端的桥梁

反向代理是Nginx最基本也是最重要的功能,它就像一个中间人,把用户请求转发给后端服务器。

# 后端服务器组
upstream backend_api {
    server 127.0.0.1:8080 weight=3;  # 权重3
    server 127.0.0.1:8081 weight=2;  # 权重2
    server 127.0.0.1:8082 weight=1 backup;  # 备用服务器

    # 健康检查
    keepalive 32;
    keepalive_requests 100;
    keepalive_timeout 60s;
}

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

    # API请求代理
    location /api/ {
        proxy_pass http://backend_api;

        # 传递真实客户端信息
        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_send_timeout 30s;
        proxy_read_timeout 30s;

        # 缓冲配置
        proxy_buffering on;
        proxy_buffer_size 8k;
        proxy_buffers 8 8k;

        # 错误处理
        proxy_next_upstream error timeout http_500 http_502 http_503;
    }

    # WebSocket代理
    location /ws/ {
        proxy_pass http://backend_api;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_read_timeout 86400;  # 24小时
    }
}

配置要点:

  1. upstream配置:定义后端服务器组,支持权重、备份等策略
  2. proxy_pass:指定转发目标,注意末尾斜杠的差异
  3. 头信息传递:确保后端能获取真实客户端信息
  4. 超时配置:合理设置避免连接堆积

二、负载均衡:流量分发的艺术

不同的负载均衡策略适用于不同场景,选对策略性能提升立竿见影:

# 轮询(默认)
upstream round_robin {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

# 权重轮询
upstream weighted_round_robin {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=2;
    server 192.168.1.12:8080 weight=1;
}

# IP哈希(同一IP总是转发到同一台服务器)
upstream ip_hash {
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

# 最少连接数
upstream least_conn {
    least_conn;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

# 健康检查配置
upstream backend_with_health_check {
    server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 max_fails=3 fail_timeout=30s backup;
}

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

    location / {
        proxy_pass http://backend_with_health_check;

        # 负载均衡相关头信息
        add_header X-Upstream-Server $upstream_addr;
        add_header X-Upstream-Status $upstream_status;
        add_header X-Upstream-Response-Time $upstream_response_time;
    }
}

策略选择建议:

  • 轮询:服务器配置相近的场景
  • 权重轮询:服务器配置不同的场景
  • IP哈希:需要会话保持的场景
  • 最少连接:长连接较多的场景

三、限流防护:抵御恶意攻击

在高并发场景下,限流是必不可少的安全屏障:

# 定义限流规则
http {
    # 限制每个IP的请求频率
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

    # 限制每个IP的连接数
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

    # 限制总连接数
    limit_conn_zone $server_name zone=server_conn_limit:10m;
}

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

    # 应用限流规则
    location /api/ {
        # 限制请求频率(允许突发20个请求)
        limit_req zone=api_limit burst=20 nodelay;

        # 限制连接数
        limit_conn conn_limit 10;        # 每个IP最多10个连接
        limit_conn server_conn_limit 100; # 服务器总共100个连接

        # 限制请求体大小
        client_max_body_size 10m;

        proxy_pass http://backend_api;
    }

    # 特殊路径更严格限流
    location /api/login {
        limit_req zone=api_limit burst=5 nodelay;
        limit_conn conn_limit 1;  # 登录接口每个IP只允许1个连接

        proxy_pass http://backend_api;
    }

    # 静态资源相对宽松
    location ~* \.(jpg|jpeg|png|gif|css|js)$ {
        limit_req zone=api_limit burst=50 nodelay;
        # ... 静态资源配置
    }
}

限流配置要点:

  1. zone定义:合理分配内存大小
  2. burst参数:允许突发请求,避免误杀正常用户
  3. nodelay:立即处理突发请求
  4. 分路径配置:不同接口不同限流策略

四、IP白名单:精准控制访问权限

IP白名单是网络安全的重要一环,特别是对于管理后台等敏感接口:

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

    # 固定IP白名单
    location /admin/ {
        allow 192.168.1.100;  # 运维办公室IP
        allow 192.168.1.101;  # 开发办公室IP
        deny all;

        proxy_pass http://backend_admin;
    }

    # 动态DNS IP白名单(适用于动态IP场景)
    location /wp-login.php {
        include /etc/nginx/conf.d/dynamicips;
        deny all;

        # WordPress登录配置
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

动态IP白名单脚本示例:

#!/bin/bash
# 自动更新动态DNS IP白名单
DDNS[0]="admin1.example.com"
DDNS[1]="admin2.example.com"

# 清空旧文件
> /etc/nginx/conf.d/dynamicips

# 解析DNS并写入新IP
for DNS in "${DDNS[@]}"
do
    echo "allow $(dig +short $DNS);" >> /etc/nginx/conf.d/dynamicips
done

# 重载Nginx配置
nginx -s reload

五、SSL配置:安全传输的保障

现在HTTPS已经是标配,安全配置不容马虎:

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

    # SSL证书配置
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    # SSL安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # SSL优化
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;

    # HSTS(强制HTTPS)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # 其他安全头
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    location / {
        proxy_pass http://backend_api;
        # ... 其他代理配置
    }
}

# HTTP重定向到HTTPS
server {
    listen 80;
    server_name secure.example.com;
    return 301 https://$server_name$request_uri;
}

SSL配置要点:

  1. 证书文件:确保证书链完整
  2. 协议版本:禁用不安全的旧版本
  3. 加密套件:选择安全且性能好的算法
  4. 会话复用:提升HTTPS性能
  5. 安全头:防范常见攻击

六、云原生与DNS解析:动态环境下的配置

在云原生环境下,服务IP经常变化,需要动态DNS解析:

http {
    # DNS解析器配置(使用系统默认DNS)
    resolver 8.8.8.8 114.114.114.114 valid=300s;
    resolver_timeout 10s;

    # 动态上游服务器
    upstream backend {
        server backend1.example.com resolve;
        server backend2.example.com resolve;
        server backend3.example.com resolve;
    }

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

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

云原生配置要点:

  1. resolver配置:指定DNS服务器和缓存时间
  2. resolve参数:启用动态DNS解析
  3. 超时设置:避免DNS解析阻塞
  4. 健康检查:自动剔除故障节点

七、缓存优化:性能提升的利器

合理的缓存配置能大幅提升性能:

# 缓存路径配置
http {
    proxy_cache_path /var/cache/nginx/proxy 
                     levels=1:2 
                     keys_zone=proxy_cache:10m 
                     max_size=1g 
                     inactive=60m 
                     use_temp_path=off;

    # 缓存key定义
    proxy_cache_key "$scheme$request_method$host$request_uri";
}

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

    # API缓存
    location /api/data/ {
        proxy_cache proxy_cache;
        proxy_cache_valid 200 10m;      # 200状态码缓存10分钟
        proxy_cache_valid 404 1m;       # 404状态码缓存1分钟
        proxy_cache_valid any 5m;       # 其他状态码缓存5分钟

        # 缓存控制
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_background_update on;
        proxy_cache_lock on;

        # 缓存头信息
        add_header X-Cache-Status $upstream_cache_status;

        # 忽略某些请求头
        proxy_ignore_headers Cache-Control Expires;

        proxy_pass http://backend_api;
    }

    # 绕过缓存的接口
    location /api/user/ {
        proxy_cache off;
        proxy_no_cache 1;
        proxy_cache_bypass 1;

        proxy_pass http://backend_api;
    }

    # 缓存清理接口
    location /cache/purge {
        allow 127.0.0.1;
        deny all;

        proxy_cache_purge proxy_cache "$scheme$request_method$host$request_uri";
    }
}

缓存配置要点:

  1. 缓存路径:合理设置大小和清理策略
  2. 缓存有效期:根据数据变化频率设置
  3. 缓存穿透:对特定接口绕过缓存
  4. 缓存更新:支持后台更新避免用户等待

八、安全加固:系统稳定的屏障

安全配置是系统稳定运行的基础:

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

    # 隐藏Nginx版本信息
    server_tokens off;

    # 限制请求方法
    location / {
        limit_except GET POST HEAD {
            deny all;
        }
    }

    # 防止SQL注入和XSS攻击
    location /api/ {
        # 检查URL中的危险字符
        if ($args ~* "(\<|%3C).*script.*(\>|%3E)") {
            return 403;
        }
        if ($args ~* "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") {
            return 403;
        }
        if ($args ~* "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") {
            return 403;
        }

        proxy_pass http://backend_api;
    }

    # 防止目录遍历
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
}

安全配置要点:

  1. 隐藏版本:避免暴露服务器信息
  2. 请求方法限制:只允许必要的HTTP方法
  3. 输入校验:防范常见Web攻击
  4. 敏感文件保护:防止配置文件泄露

结语

掌握Nginx配置,核心不是记住所有参数,而是理解每个配置的作用和适用场景

  • 反向代理:连接前后端的桥梁
  • 负载均衡:流量分发的艺术
  • 限流防护:系统稳定的屏障
  • IP白名单:精准控制访问权限
  • SSL配置:安全传输的保障
  • 云原生适配:动态环境下的配置
  • DNS解析:服务发现的关键
  • 缓存优化:性能提升的利器
  • 安全加固:系统安全的基石

记住:好的Nginx配置不是一次到位的,而是在实践中不断优化的。从满足基本需求开始,根据实际情况逐步调优,最终你也能配出高性能、高可用的Nginx服务!


阅读原文:原文链接


该文章在 2025/12/10 18:44:10 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved