【Nginx配置】常规功能具体配置

通过具体实例展示Nginx作为网关、负载均衡和限流的功能实现,每个功能完整的配置示例和说明:


一、Nginx作为API网关

场景:统一管理多个微服务的入口,实现路由转发和请求改写

# /etc/nginx/nginx.conf

http {
    # 定义上游微服务
    upstream user_service {
        server 192.168.1.101:8001;
        server 192.168.1.102:8001;
    }

    upstream order_service {
        server 192.168.1.103:8002;
    }

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

        # 统一添加响应头
        add_header X-API-Gateway nginx;

        # 用户服务路由
        location /api/users {
            # 请求改写:去掉api前缀
            rewrite ^/api/(.*) /$1 break;
            
            proxy_pass http://user_service;
            proxy_set_header X-Real-IP $remote_addr;
        }

        # 订单服务路由
        location /api/orders {
            rewrite ^/api/(.*) /$1 break;
            
            proxy_pass http://order_service;
            proxy_set_header X-Real-IP $remote_addr;
            
            # 接口级限流
            limit_req zone=api_limit burst=5;
        }

        # 健康检查端点
        location /health {
            access_log off;
            return 200 "OK";
        }

        # 全局404处理
        error_page 404 /404.json;
        location = /404.json {
            internal;
            return 404 '{"code": 404, "message": "Not Found"}';
        }
    }
}

网关功能说明

  1. 统一入口:所有请求通过api.mycompany.com访问
  2. 路由分发:根据路径/api/users/api/orders转发到不同服务
  3. 请求改写:去掉URL中的/api前缀
  4. 统一响应头:添加X-API-Gateway标识
  5. 统一错误处理:自定义404响应格式

二、Nginx作为负载均衡

场景:对3台应用服务器进行流量分发

# /etc/nginx/conf.d/loadbalance.conf

upstream backend {
    # 加权轮询(默认策略)
    server 192.168.1.201 weight=3;  # 该服务器处理3份流量
    server 192.168.1.202;           # 默认weight=1
    server 192.168.1.203 backup;    # 备用服务器

    # 健康检查(Nginx Plus功能)
    # health_check interval=5s fails=3 passes=2 uri=/health;
}

server {
    listen 80;
    server_name app.mycompany.com;

    location / {
        proxy_pass http://backend;
        
        # 高级负载均衡配置
        proxy_next_upstream error timeout http_500; # 自动切换到下一台服务器
        proxy_connect_timeout 2s;     # 连接超时
        proxy_read_timeout 5s;        # 读取响应超时
        
        # 会话保持(基于cookie)
        proxy_set_header Host $host;
        proxy_cookie_path / "/; Secure; HttpOnly; SameSite=Strict";
    }

    # 负载均衡状态监控(需要nginx-module)
    location /upstream_status {
        upstream_status;
        allow 192.168.1.0/24;
        deny all;
    }
}

负载均衡策略

  1. 加权轮询:201服务器获得更多流量
  2. 故障转移:当主服务器不可用时,自动切换到备用服务器
  3. 会话保持:通过cookie保持用户会话
  4. 状态监控:通过/upstream_status查看服务器状态

三、Nginx实现限流

场景:防止接口被刷,保护系统稳定性

# /etc/nginx/conf.d/rate_limit.conf

# 定义限流区域(内存区)
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;  # 每秒10个请求
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;           # 并发连接数限制

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

    # 全局限流(所有接口)
    limit_req zone=api_limit burst=20 nodelay;
    limit_conn conn_limit 20;

    # 登录接口特殊限流(更严格)
    location /api/login {
        limit_req zone=api_limit burst=5;
        limit_conn conn_limit 5;
        
        proxy_pass http://auth_service;
    }

    # 静态资源不限流
    location ~* \.(jpg|css|js)$ {
        limit_req off;
        limit_conn off;
        
        expires 30d;
        access_log off;
    }

    # 限流后的自定义响应
    error_page 429 /too_many_requests;
    location = /too_many_requests {
        internal;
        return 429 '{
            "code": 429,
            "message": "请求过于频繁,请稍后再试",
            "retry_after": 60
        }';
    }
}

限流效果

  1. 普通接口:每秒最多10个请求,突发允许20个
  2. 登录接口:更严格的限制(防暴力破解)
  3. 静态资源:完全不限流
  4. 优雅响应:返回JSON格式的429错误

四、完整联动示例:电商系统架构

# /etc/nginx/nginx.conf

# 全局限流定义
limit_req_zone $binary_remote_addr zone=global_limit:10m rate=100r/s;

http {
    # 上游服务定义
    upstream product_service {
        least_conn;  # 最少连接算法
        server 10.0.1.10:8001;
        server 10.0.1.11:8001;
    }

    upstream cart_service {
        server 10.0.2.10:8002;
    }

    upstream payment_service {
        server 10.0.3.10:8003 backup;  # 平时不启用
    }

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

        # SSL配置
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;

        # 全局设置
        limit_req zone=global_limit burst=50;
        add_header X-Frame-Options DENY;

        # 商品服务(缓存+负载均衡)
        location /api/products {
            proxy_cache product_cache;
            proxy_cache_valid 200 5m;
            proxy_pass http://product_service;
            
            # 接口级限流
            limit_req zone=api_limit burst=10;
        }

        # 购物车服务(会话保持)
        location /api/cart {
            # 基于IP的会话保持
            ip_hash;
            proxy_pass http://cart_service;
            
            # 重要接口需要登录
            auth_request /auth/verify;
        }

        # 支付服务(严格限流)
        location /api/payment {
            limit_req zone=payment_limit burst=2;
            proxy_pass http://payment_service;
        }

        # 静态资源
        location /static/ {
            alias /var/www/static/;
            expires max;
            access_log off;
        }

        # 内部认证端点
        location = /auth/verify {
            internal;
            proxy_pass http://auth_service/verify;
        }
    }
}

该电商架构实现了

  1. 网关功能:统一入口、路由分发、SSL终止
  2. 负载均衡:商品服务使用最少连接算法,购物车保持会话
  3. 分级限流:支付接口最严格,静态资源不限流
  4. 安全防护:HTTPS、防点击劫窃头、认证检查

测试方法

  1. 负载均衡测试
# 连续发送100个请求观察分发情况
for i in {1..100}; do curl http://app.mycompany.com; done
  1. 限流测试
# 使用ab工具测试限流
ab -n 100 -c 20 http://api.mycompany.com/api/login
  1. 网关路由测试
# 测试不同接口路由
curl http://api.mycompany.com/api/users
curl http://api.mycompany.com/api/orders

通过这些实例配置,可以清晰看到Nginx如何在实际生产中同时扮演网关、负载均衡器和流量警察的角色,三者配合构建出高可用、高性能的系统架构。

posted @ 2025-06-12 14:10  佛祖让我来巡山  阅读(68)  评论(0)    收藏  举报

佛祖让我来巡山博客站 - 创建于 2018-08-15

开发工程师个人站,内容主要是网站开发方面的技术文章,大部分来自学习或工作,部分来源于网络,希望对大家有所帮助。

Bootstrap中文网