Nginx 常见的部署架构有哪些?如何选择合适的架构?
Nginx 可以根据不同的业务需求和规模采用多种部署架构,从单机部署到分布式集群都有相应的解决方案。
单机部署架构:
shell客户端 → Nginx → 应用服务器 → 数据库
适用场景:
- 小型网站或应用
- 开发测试环境
- 低流量业务
配置示例:
nginxserver { listen 80; server_name example.com; root /var/www/html; index index.php index.html; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location / { try_files $uri $uri/ =404; } }
反向代理架构:
shell客户端 → Nginx (反向代理) → 后端服务器集群
适用场景:
- 多个应用服务器需要统一入口
- 需要负载均衡
- 需要隐藏后端服务器
配置示例:
nginxupstream backend { server 192.168.1.100:8080 weight=3; server 192.168.1.101:8080 weight=2; server 192.168.1.102:8080 weight=1; keepalive 32; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; 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; } }
负载均衡架构:
shell客户端 → Nginx (负载均衡器) → 后端服务器池
适用场景:
- 高并发访问
- 需要水平扩展
- 需要高可用性
负载均衡策略:
nginx# 轮询(默认) upstream backend { server 192.168.1.100:8080; server 192.168.1.101:8080; } # 最少连接 upstream backend { least_conn; server 192.168.1.100:8080; server 192.168.1.101:8080; } # IP 哈希 upstream backend { ip_hash; server 192.168.1.100:8080; server 192.168.1.101:8080; } # 加权轮询 upstream backend { server 192.168.1.100:8080 weight=3; server 192.168.1.101:8080 weight=2; server 192.168.1.102:8080 weight=1; }
多层代理架构:
shell客户端 → 边缘 Nginx → 中间 Nginx → 应用服务器
适用场景:
- 大规模分布式系统
- 需要多层缓存
- 需要安全隔离
配置示例:
nginx# 边缘 Nginx upstream middle_layer { server 192.168.1.200:80; server 192.168.1.201:80; } server { listen 80; server_name example.com; location / { proxy_pass http://middle_layer; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } # 中间层 Nginx upstream backend { server 192.168.1.100:8080; server 192.168.1.101:8080; } server { listen 80; server_name middle.example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; } }
CDN 集成架构:
shell客户端 → CDN → 源站 Nginx → 后端服务器
适用场景:
- 全球用户访问
- 需要加速静态资源
- 需要减轻源站压力
配置示例:
nginxserver { listen 80; server_name example.com; # 静态资源重定向到 CDN location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2)$ { return 301 https://cdn.example.com$request_uri; } # 动态内容 location / { proxy_pass http://backend; proxy_set_header Host $host; } }
高可用架构(Keepalived + Nginx):
shell客户端 → VIP (虚拟IP) ↓ Nginx 主节点 ← Keepalived ↓ Nginx 备节点 ← Keepalived ↓ 后端服务器
适用场景:
- 需要高可用性
- 不能接受单点故障
- 关键业务系统
配置示例:
nginx# 主节点 Nginx 配置 upstream backend { server 192.168.1.100:8080; server 192.168.1.101:8080; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; } } # Keepalived 配置 vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1234 } virtual_ipaddress { 192.168.1.50 } }
微服务架构:
shell客户端 → Nginx (API 网关) → 微服务集群
适用场景:
- 微服务架构
- 需要统一 API 入口
- 需要服务发现
配置示例:
nginx# 用户服务 upstream user_service { server 192.168.1.100:8080; server 192.168.1.101:8080; } # 订单服务 upstream order_service { server 192.168.1.200:8080; server 192.168.1.201:8080; } # 支付服务 upstream payment_service { server 192.168.1.300:8080; server 192.168.1.301:8080; } server { listen 80; server_name api.example.com; # 路由到用户服务 location /api/users/ { proxy_pass http://user_service; proxy_set_header Host $host; } # 路由到订单服务 location /api/orders/ { proxy_pass http://order_service; proxy_set_header Host $host; } # 路由到支付服务 location /api/payments/ { proxy_pass http://payment_service; proxy_set_header Host $host; } }
缓存架构:
shell客户端 → Nginx (缓存层) → 后端服务器
适用场景:
- 读多写少的应用
- 需要减轻后端压力
- 需要提升响应速度
配置示例:
nginx# 定义缓存路径 proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=proxy_cache:10m max_size=1g inactive=60m; upstream backend { server 192.168.1.100:8080; server 192.168.1.101:8080; } server { listen 80; server_name example.com; location / { # 启用缓存 proxy_cache proxy_cache; proxy_cache_valid 200 10m; proxy_cache_valid 404 1m; proxy_cache_key "$scheme$request_method$host$request_uri"; # 缓存跳过条件 proxy_cache_bypass $http_cache_control; proxy_no_cache $http_cache_control; proxy_pass http://backend; proxy_set_header Host $host; # 添加缓存状态头 add_header X-Cache-Status $upstream_cache_status; } }
混合架构:
shell客户端 → Nginx (静态资源) → CDN ↓ Nginx (动态内容) → 应用服务器
适用场景:
- 复杂业务系统
- 需要分离静态和动态内容
- 需要多种优化策略
配置示例:
nginx# 静态资源服务器 server { listen 80; server_name static.example.com; root /var/www/static; location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2)$ { expires 1y; add_header Cache-Control "public, immutable"; access_log off; } } # 动态内容服务器 upstream backend { server 192.168.1.100:8080; server 192.168.1.101:8080; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; } }
架构选择指南:
| 业务需求 | 推荐架构 | 说明 |
|---|---|---|
| 小型网站 | 单机部署 | 简单易维护 |
| 中型应用 | 反向代理 | 统一入口,负载均衡 |
| 高并发 | 负载均衡架构 | 水平扩展,高可用 |
| 全球业务 | CDN 集成架构 | 加速访问,减轻源站压力 |
| 关键业务 | 高可用架构 | 避免单点故障 |
| 微服务 | 微服务架构 | 统一 API 网关 |
| 读多写少 | 缓存架构 | 提升性能,减轻后端压力 |
部署架构最佳实践:
- 渐进式扩展:从简单架构开始,根据需求逐步扩展
- 监控告警:实时监控架构状态,及时发现问题
- 容灾备份:配置备份和容灾方案
- 安全防护:在架构各层添加安全措施
- 性能优化:根据业务特点选择合适的优化策略
- 文档记录:详细记录架构设计和配置
- 定期演练:定期进行故障演练,验证架构可靠性
- 成本控制:在满足需求的前提下控制成本