【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"}';
}
}
}
网关功能说明:
- 统一入口:所有请求通过
api.mycompany.com
访问 - 路由分发:根据路径
/api/users
和/api/orders
转发到不同服务 - 请求改写:去掉URL中的
/api
前缀 - 统一响应头:添加
X-API-Gateway
标识 - 统一错误处理:自定义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;
}
}
负载均衡策略:
- 加权轮询:201服务器获得更多流量
- 故障转移:当主服务器不可用时,自动切换到备用服务器
- 会话保持:通过cookie保持用户会话
- 状态监控:通过
/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
}';
}
}
限流效果:
- 普通接口:每秒最多10个请求,突发允许20个
- 登录接口:更严格的限制(防暴力破解)
- 静态资源:完全不限流
- 优雅响应:返回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;
}
}
}
该电商架构实现了:
- 网关功能:统一入口、路由分发、SSL终止
- 负载均衡:商品服务使用最少连接算法,购物车保持会话
- 分级限流:支付接口最严格,静态资源不限流
- 安全防护:HTTPS、防点击劫窃头、认证检查
测试方法
- 负载均衡测试:
# 连续发送100个请求观察分发情况
for i in {1..100}; do curl http://app.mycompany.com; done
- 限流测试:
# 使用ab工具测试限流
ab -n 100 -c 20 http://api.mycompany.com/api/login
- 网关路由测试:
# 测试不同接口路由
curl http://api.mycompany.com/api/users
curl http://api.mycompany.com/api/orders
通过这些实例配置,可以清晰看到Nginx如何在实际生产中同时扮演网关、负载均衡器和流量警察的角色,三者配合构建出高可用、高性能的系统架构。
❤️ 如果你喜欢这篇文章,请点赞支持! 👍 同时欢迎关注我的博客,获取更多精彩内容!
本文来自博客园,作者:佛祖让我来巡山,转载请注明原文链接:https://www.cnblogs.com/sun-10387834/p/18925390