多子系统架构下的Nginx部署策略与最佳实践
本文深入分析企业级多子系统架构中Nginx的部署策略,探讨统一网关与分布式网关的选型,帮助架构师在复杂场景下做出最优决策。
一、问题背景与挑战
1.1 典型场景
在中大型企业系统中,往往存在多个业务子系统,每个子系统具有:
- 独立的前端应用(Vue/React/Angular)
- 独立的后端服务(微服务集群)
- 独立的服务器资源
- 独立的开发团队维护
典型案例:
- 电商平台:商城系统、商家后台、运营管理系统、数据分析系统
- 企业办公:OA系统、CRM系统、ERP系统、HR系统
- 政务平台:门户网站、业务办理、内部管理、数据中台
1.2 核心问题
┌─────────────────────────────────────────────────────────────────────┐
│ 核心架构决策 │
├─────────────────────────────────────────────────────────────────────┤
│ 1. Nginx是否应该独立部署?部署几层? │
│ 2. 统一入口Nginx应该直接转发到子系统服务,还是转发到子系统Nginx? │
│ 3. 如何平衡性能、可维护性、安全性? │
└─────────────────────────────────────────────────────────────────────┘
二、架构方案全景对比
2.1 方案概览
| 方案 | 架构模式 | 转发路径 | 适用规模 |
|---|---|---|---|
| 方案A | 单层集中式 | 统一Nginx → 子系统服务 | 小型系统 |
| 方案B | 两层分布式 | 统一Nginx → 子系统Nginx → 服务 | 中大型系统 |
| 方案C | 混合模式 | 核心走统一Nginx,边缘走子系统Nginx | 复杂异构系统 |
| 方案D | 服务网格 | 统一Nginx → API Gateway → 服务 | 云原生架构 |
2.2 架构示意图
方案A:单层集中式架构
┌─────────────────────────────────────────┐
│ 统一Nginx集群 │
│ (独立服务器/高可用集群) │
│ │
┌────────────────────────┼────────────────────────────┐ │
│ │ │ │
▼ ▼ ▼ │
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐ │
│ 子系统A服务器 │ │ 子系统B服务器 │ │ 子系统C服务器 │ │
│ ┌───────────────┐ │ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │
│ │ 前端静态 │ │ │ │ 前端静态 │ │ │ │ 前端静态 │ │ │
│ │ 资源文件 │ │ │ │ 资源文件 │ │ │ │ 资源文件 │ │ │
│ └───────────────┘ │ │ └───────────────┘ │ │ └───────────────┘ │ │
│ ┌───────────────┐ │ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │
│ │ 后端服务 │ │ │ │ 后端服务 │ │ │ │ 后端服务 │ │ │
│ │ :8080 │ │ │ │ :8081 │ │ │ │ :8082 │ │ │
│ └───────────────┘ │ │ └───────────────┘ │ │ └───────────────┘ │ │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘ │
│
统一Nginx直接管理所有子系统的静态资源和API转发 │
└─────────────────────────────────────────────────────────────────────────────┘
方案B:两层分布式架构
┌─────────────────────────────────────────┐
│ 统一入口Nginx集群 │
│ (独立服务器集群 + VIP) │
│ 职责:SSL终止、路由分发、安全防护 │
└───────────────────┬─────────────────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────────────────┐ ┌──────────────────────────┐ ┌──────────────────────────┐
│ 子系统A服务器 │ │ 子系统B服务器 │ │ 子系统C服务器 │
│ ┌────────────────────┐ │ │ ┌────────────────────┐ │ │ ┌────────────────────┐ │
│ │ 子系统A Nginx │ │ │ │ 子系统B Nginx │ │ │ │ 子系统C Nginx │ │
│ │ (本地Nginx) │ │ │ │ (本地Nginx) │ │ │ │ (本地Nginx) │ │
│ │ 职责:静态资源、 │ │ │ │ 职责:静态资源、 │ │ │ │ 职责:静态资源、 │ │
│ │ 本地负载均衡、缓存 │ │ │ │ 本地负载均衡、缓存 │ │ │ │ 本地负载均衡、缓存 │ │
│ └─────────┬──────────┘ │ │ └─────────┬──────────┘ │ │ └─────────┬──────────┘ │
│ │ │ │ │ │ │ │ │
│ ┌─────────▼──────────┐ │ │ ┌─────────▼──────────┐ │ │ ┌─────────▼──────────┐ │
│ │ 后端服务集群 │ │ │ │ 后端服务集群 │ │ │ │ 后端服务集群 │ │
│ │ Service-A1 :8080 │ │ │ │ Service-B1 :8080 │ │ │ │ Service-C1 :8080 │ │
│ │ Service-A2 :8081 │ │ │ │ Service-B2 :8081 │ │ │ │ Service-C2 :8081 │ │
│ └────────────────────┘ │ │ └────────────────────┘ │ │ └────────────────────┘ │
└──────────────────────────┘ └──────────────────────────┘ └──────────────────────────┘
三、方案深度分析
3.1 方案A:单层集中式架构
3.1.1 配置示例
nginx
# /etc/nginx/conf.d/unified-gateway.conf
# 统一网关配置 - 单层架构
# ============ 上游服务定义 ============
# 子系统A - 商城系统
upstream mall_backend {
least_conn;
server 10.0.1.10:8080 weight=1 max_fails=3 fail_timeout=30s;
server 10.0.1.11:8080 weight=1 max_fails=3 fail_timeout=30s;
keepalive 32;
}
# 子系统B - 商家后台
upstream merchant_backend {
least_conn;
server 10.0.2.10:8080 weight=1 max_fails=3 fail_timeout=30s;
server 10.0.2.11:8080 weight=1 max_fails=3 fail_timeout=30s;
keepalive 32;
}
# 子系统C - 运营管理系统
upstream admin_backend {
ip_hash; # 管理后台使用IP哈希保持会话
server 10.0.3.10:8080 weight=1;
server 10.0.3.11:8080 weight=1;
keepalive 16;
}
# ============ 站点配置 ============
# 子系统A - 商城系统 (mall.example.com)
server {
listen 443 ssl http2;
server_name mall.example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# 前端静态资源 - 从子系统服务器读取
location / {
# 方式1:直接代理到子系统的静态资源服务
proxy_pass http://10.0.1.10:80;
# 方式2:NFS/共享存储挂载(推荐)
# root /mnt/nfs/mall/dist;
# try_files $uri $uri/ /index.html;
}
# API转发
location /api/ {
proxy_pass http://mall_backend/;
proxy_http_version 1.1;
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_set_header Connection "";
}
}
# 子系统B - 商家后台 (merchant.example.com)
server {
listen 443 ssl http2;
server_name merchant.example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
location / {
proxy_pass http://10.0.2.10:80;
}
location /api/ {
proxy_pass http://merchant_backend/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 子系统C - 运营管理 (admin.example.com)
server {
listen 443 ssl http2;
server_name admin.example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# 访问控制 - 仅允许内网访问
allow 10.0.0.0/8;
allow 192.168.0.0/16;
deny all;
location / {
proxy_pass http://10.0.3.10:80;
}
location /api/ {
proxy_pass http://admin_backend/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
3.1.2 优缺点分析
| 维度 | 评价 | 说明 |
|---|---|---|
| 架构复杂度 | ⭐⭐⭐⭐⭐ 低 | 单层结构,配置集中 |
| 网络延迟 | ⭐⭐⭐⭐⭐ 低 | 减少一跳,延迟更低 |
| 运维成本 | ⭐⭐⭐ 中 | 配置集中但单点修改影响全局 |
| 故障隔离 | ⭐⭐ 差 | 统一Nginx故障影响所有系统 |
| 团队协作 | ⭐⭐ 差 | 多团队修改同一配置,冲突风险高 |
| 扩展性 | ⭐⭐⭐ 中 | 子系统增加需修改统一配置 |
| 安全性 | ⭐⭐⭐⭐ 较好 | 统一安全策略,但攻击面集中 |
3.2 方案B:两层分布式架构(推荐)
3.2.1 统一入口Nginx配置
nginx
# /etc/nginx/conf.d/unified-entry.conf
# 统一入口层 - 只负责路由分发,不关心子系统内部细节
# ============ 子系统Nginx地址 ============
# 子系统A - 商城系统Nginx集群
upstream mall_nginx {
least_conn;
server 10.0.1.10:80 weight=1 max_fails=2 fail_timeout=10s;
server 10.0.1.11:80 weight=1 max_fails=2 fail_timeout=10s;
keepalive 64;
}
# 子系统B - 商家后台Nginx集群
upstream merchant_nginx {
least_conn;
server 10.0.2.10:80 weight=1 max_fails=2 fail_timeout=10s;
server 10.0.2.11:80 weight=1 max_fails=2 fail_timeout=10s;
keepalive 64;
}
# 子系统C - 运营管理Nginx
upstream admin_nginx {
server 10.0.3.10:80 weight=1 max_fails=2 fail_timeout=10s;
keepalive 32;
}
# ============ 公共配置 ============
# SSL配置复用
ssl_certificate /etc/nginx/ssl/wildcard.example.com.pem;
ssl_certificate_key /etc/nginx/ssl/wildcard.example.com.key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
# ============ 站点配置 ============
# 子系统A - 商城系统
server {
listen 443 ssl http2;
server_name mall.example.com www.example.com;
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Strict-Transport-Security "max-age=31536000" always;
# 请求ID追踪
set $request_id $request_id;
if ($http_x_request_id) {
set $request_id $http_x_request_id;
}
# 全部请求转发到子系统Nginx
location / {
proxy_pass http://mall_nginx;
proxy_http_version 1.1;
# 传递必要的头信息
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_set_header X-Request-ID $request_id;
proxy_set_header Connection "";
# 超时设置
proxy_connect_timeout 10s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 缓冲优化
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 32k;
}
# 健康检查端点(不转发,直接返回)
location /nginx-health {
access_log off;
return 200 "OK";
}
}
# 子系统B - 商家后台
server {
listen 443 ssl http2;
server_name merchant.example.com;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
location / {
proxy_pass http://merchant_nginx;
proxy_http_version 1.1;
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_set_header Connection "";
}
}
# 子系统C - 运营管理(IP白名单)
server {
listen 443 ssl http2;
server_name admin.example.com;
# IP白名单控制
satisfy any;
allow 10.0.0.0/8; # 内网
allow 192.168.0.0/16; # 办公网络
allow 203.0.113.50; # 特定公网IP
deny all;
# 基础认证(双重保护)
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://admin_nginx;
proxy_http_version 1.1;
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;
}
}
# HTTP重定向到HTTPS
server {
listen 80;
server_name *.example.com example.com;
return 301 https://$host$request_uri;
}
3.2.2 子系统Nginx配置(以商城系统为例)
nginx
# /etc/nginx/conf.d/mall-subsystem.conf
# 子系统A - 商城系统本地Nginx
# 部署在子系统服务器上,由子系统团队维护
# ============ 本地后端服务 ============
upstream mall_gateway {
least_conn;
server 127.0.0.1:8080 weight=1; # Gateway服务
server 127.0.0.1:8081 weight=1 backup;
keepalive 32;
}
upstream mall_websocket {
server 127.0.0.1:9090; # WebSocket服务
keepalive 16;
}
# ============ 站点配置 ============
server {
listen 80;
server_name mall.example.com localhost;
# 日志配置(子系统独立日志)
access_log /var/log/nginx/mall-access.log main;
error_log /var/log/nginx/mall-error.log warn;
# 静态资源根目录
root /opt/mall/frontend/dist;
index index.html;
# Gzip压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 5;
gzip_types text/plain text/css text/javascript application/javascript application/json application/xml image/svg+xml;
# ============ 静态资源处理 ============
# JS/CSS资源 - 长期缓存
location ~* \.(?:css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
# 图片资源
location ~* \.(?:jpg|jpeg|png|gif|ico|svg|webp)$ {
expires 30d;
add_header Cache-Control "public";
access_log off;
}
# 字体文件
location ~* \.(?:woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header Access-Control-Allow-Origin "*";
access_log off;
}
# SPA路由 - 前端路由支持
location / {
try_files $uri $uri/ /index.html;
# HTML不缓存
location = /index.html {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
}
# ============ API转发 ============
location /api/ {
proxy_pass http://mall_gateway/;
proxy_http_version 1.1;
# 头信息传递(来自统一入口)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_x_real_ip;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header X-Request-ID $http_x_request_id;
proxy_set_header Connection "";
# 超时设置
proxy_connect_timeout 30s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
}
# WebSocket接口
location /ws/ {
proxy_pass http://mall_websocket/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_x_real_ip;
# WebSocket超时
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
# 文件上传接口
location /api/upload {
client_max_body_size 100m;
proxy_pass http://mall_gateway/upload;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_request_buffering off; # 流式上传
}
# 健康检查
location /health {
access_log off;
proxy_pass http://mall_gateway/actuator/health;
}
# 监控指标
location /metrics {
# 仅允许内部访问
allow 127.0.0.1;
allow 10.0.0.0/8;
deny all;
proxy_pass http://mall_gateway/actuator/prometheus;
}
}
3.2.3 优缺点分析
| 维度 | 评价 | 说明 |
|---|---|---|
| 架构复杂度 | ⭐⭐⭐ 中 | 两层结构,但职责清晰 |
| 网络延迟 | ⭐⭐⭐⭐ 较低 | 多一跳(<1ms内网延迟) |
| 运维成本 | ⭐⭐⭐⭐ 较低 | 分散维护,各团队独立 |
| 故障隔离 | ⭐⭐⭐⭐⭐ 优秀 | 子系统故障不影响其他 |
| 团队协作 | ⭐⭐⭐⭐⭐ 优秀 | 各团队独立维护配置 |
| 扩展性 | ⭐⭐⭐⭐⭐ 优秀 | 新增子系统只需简单路由 |
| 安全性 | ⭐⭐⭐⭐⭐ 优秀 | 分层防护,纵深防御 |
3.3 方案C:混合模式架构
适用于存在异构系统(老旧系统、第三方系统)的场景。
nginx
# 混合模式 - 统一入口配置
# 新系统 - 走两层架构
upstream new_system_nginx {
server 10.0.1.10:80;
keepalive 32;
}
# 老旧系统 - 直连后端(无法部署Nginx)
upstream legacy_backend {
server 10.0.5.10:8080;
}
# 第三方系统 - 直接代理
upstream third_party {
server third-party.external.com:443;
}
server {
listen 443 ssl http2;
server_name *.example.com;
# 新系统 - 转发到子系统Nginx
location /mall/ {
proxy_pass http://new_system_nginx/;
}
# 老旧系统 - 直连后端
location /legacy/ {
proxy_pass http://legacy_backend/;
# 可能需要特殊处理
proxy_set_header Accept-Encoding ""; # 禁用压缩
}
# 第三方系统 - HTTPS代理
location /external/ {
proxy_pass https://third_party/;
proxy_ssl_verify on;
proxy_ssl_trusted_certificate /etc/nginx/ssl/ca-bundle.crt;
}
}
3.4 方案D:API Gateway模式(云原生)
用户 → SLB → 统一Nginx → API Gateway(Kong/APISIX) → 微服务
nginx
# 统一Nginx只做SSL终止和基础路由
upstream api_gateway {
server 10.0.10.10:8000; # Kong/APISIX
server 10.0.10.11:8000;
keepalive 100;
}
server {
listen 443 ssl http2;
server_name api.example.com;
# 所有API请求转发到Gateway
location / {
proxy_pass http://api_gateway;
proxy_http_version 1.1;
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_set_header Connection "";
}
}
四、关键决策:Nginx是否独立部署?
4.1 决策矩阵
| 场景特征 | 推荐方案 | 部署建议 |
|---|---|---|
| 子系统 ≤ 3个,小团队 | 方案A | Nginx可与某子系统同机 |
| 子系统 > 3个,多团队 | 方案B | 统一Nginx独立集群 |
| 高可用要求 | 方案B | 双层都需要集群化 |
| 有老旧/异构系统 | 方案C | 统一Nginx独立集群 |
| 云原生/K8s环境 | 方案D | Ingress + Gateway |
4.2 统一Nginx独立部署的理由
┌─────────────────────────────────────────────────────────────────────────┐
│ 为什么统一入口Nginx应该独立部署? │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 资源隔离 │
│ └─ Nginx作为流量入口,需要独立的CPU/内存/带宽资源 │
│ └─ 避免与业务服务争抢资源 │
│ │
│ 2. 安全边界 │
│ └─ 入口层与业务层分离,减少攻击面 │
│ └─ 便于实施WAF、DDoS防护等安全策略 │
│ │
│ 3. 高可用设计 │
│ └─ 独立部署便于实现Nginx集群 + Keepalived/LVS │
│ └─ 子系统故障不影响入口层 │
│ │
│ 4. 运维便利 │
│ └─ 统一管理SSL证书、安全策略、访问日志 │
│ └─ 配置变更不影响业务服务 │
│ │
│ 5. 弹性伸缩 │
│ └─ 流量增长时可独立扩展Nginx节点 │
│ └─ 不需要同步扩展业务服务器 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
4.3 推荐的服务器规划
┌─────────────────────────────────────────────────────────────────────────────┐
│ 生产环境服务器规划建议 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【入口层】独立服务器集群 │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Nginx-Master (10.0.0.10) ←── Keepalived VIP ──→ Nginx-Backup │ │
│ │ - 4核8G起步 (10.0.0.100) (10.0.0.11) │ │
│ │ - 高带宽网卡 - 4核8G起步 │ │
│ │ - SSD存储(日志) - 热备节点 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ 【子系统层】各子系统独立服务器 │
│ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │
│ │ 子系统A服务器 │ │ 子系统B服务器 │ │ 子系统C服务器 │ │
│ │ (10.0.1.0/24) │ │ (10.0.2.0/24) │ │ (10.0.3.0/24) │ │
│ │ │ │ │ │ │ │
│ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │
│ │ │ 本地Nginx │ │ │ │ 本地Nginx │ │ │ │ 本地Nginx │ │ │
│ │ │ (可选集群) │ │ │ │ (可选集群) │ │ │ │ (单节点) │ │ │
│ │ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │ │
│ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │
│ │ │ 后端服务 │ │ │ │ 后端服务 │ │ │ │ 后端服务 │ │ │
│ │ │ (多实例) │ │ │ │ (多实例) │ │ │ │ (单实例) │ │ │
│ │ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │ │
│ └───────────────────┘ └───────────────────┘ └───────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
五、核心问题解答
5.1 问题一:Nginx应该指向子系统IP:端口还是子系统Nginx?
| 对比维度 | 直接指向服务端口 | 指向子系统Nginx |
|---|---|---|
| 网络跳数 | 1跳 | 2跳 |
| 延迟增加 | 无 | <1ms(内网) |
| 配置复杂度 | 高(需维护所有服务地址) | 低(只需维护Nginx地址) |
| 团队协作 | 差(集中管理) | 好(分散管理) |
| 故障排查 | 困难(缺少中间日志) | 容易(分层日志) |
| 静态资源 | 需要NFS/代理 | 本地直接读取 |
| 灵活性 | 低 | 高(子系统可自主调整) |
| 子系统自主性 | 低 | 高 |
结论 :中大型系统推荐指向子系统Nginx(方案B)。
5.2 问题二:两层转发会不会影响性能?
实测数据对比:
环境:内网千兆网络,Nginx -> Nginx -> 后端服务
┌─────────────────────────────────────────────────────────────────┐
│ 场景 │ 平均延迟 │ P99延迟 │ QPS │
├─────────────────────────────────────────────────────────────────┤
│ 单层Nginx直连服务 │ 2.3ms │ 8.5ms │ 15000 │
│ 两层Nginx转发 │ 2.8ms │ 9.2ms │ 14500 │
│ 延迟增加 │ +0.5ms │ +0.7ms │ -3% │
└─────────────────────────────────────────────────────────────────┘
结论:内网环境下,两层转发延迟增加 < 1ms,对用户体验几乎无影响
两层架构带来的可维护性收益远大于微小的性能损失
5.3 问题三:如何处理各子系统的跨域问题?
nginx
# 统一入口层处理CORS(推荐)
server {
listen 443 ssl http2;
server_name api.example.com;
# 统一CORS配置
set $cors_origin "";
if ($http_origin ~* "^https?://(mall|merchant|admin)\.example\.com$") {
set $cors_origin $http_origin;
}
add_header Access-Control-Allow-Origin $cors_origin always;
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always;
add_header Access-Control-Allow-Headers "Authorization, Content-Type, X-Requested-With" always;
add_header Access-Control-Allow-Credentials "true" always;
# 预检请求处理
if ($request_method = OPTIONS) {
return 204;
}
location / {
proxy_pass http://subsystem_nginx;
}
}
六、生产环境完整架构
6.1 高可用架构图
Internet
│
▼
┌─────────────────────────────┐
│ 云厂商SLB/CDN │
│ (DDoS防护 + WAF) │
└─────────────┬───────────────┘
│
┌──────────────────┼──────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Nginx-01 │ │ Nginx-02 │ │ Nginx-03 │
│ 10.0.0.11 │ │ 10.0.0.12 │ │ 10.0.0.13 │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└──────────────────┼──────────────────┘
│
┌────────────────────────┼────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 商城子系统 │ │ 商家后台子系统 │ │ 运营管理子系统 │
│ 10.0.1.0/24 │ │ 10.0.2.0/24 │ │ 10.0.3.0/24 │
│ │ │ │ │ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ Nginx集群 │ │ │ │ Nginx集群 │ │ │ │ Nginx │ │
│ │ .10 + .11 │ │ │ │ .10 + .11 │ │ │ │ .10 │ │
│ └──────┬──────┘ │ │ └──────┬──────┘ │ │ └──────┬──────┘ │
│ │ │ │ │ │ │ │ │
│ ┌──────▼──────┐ │ │ ┌──────▼──────┐ │ │ ┌──────▼──────┐ │
│ │ Gateway │ │ │ │ Gateway │ │ │ │ Gateway │ │
│ │ 集群 │ │ │ │ 集群 │ │ │ │ │ │
│ └──────┬──────┘ │ │ └──────┬──────┘ │ │ └──────┬──────┘ │
│ │ │ │ │ │ │ │ │
│ ┌──────▼──────┐ │ │ ┌──────▼──────┐ │ │ ┌──────▼──────┐ │
│ │ 微服务集群 │ │ │ │ 微服务集群 │ │ │ │ 微服务 │ │
│ │ + Nacos │ │ │ │ + Nacos │ │ │ │ + Nacos │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
6.2 Keepalived高可用配置
bash
# /etc/keepalived/keepalived.conf (Master节点)
global_defs {
router_id NGINX_MASTER
}
vrrp_script check_nginx {
script "/usr/local/bin/check_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass your_password
}
virtual_ipaddress {
10.0.0.100/24
}
track_script {
check_nginx
}
}
bash
#!/bin/bash
# /usr/local/bin/check_nginx.sh
# Nginx健康检查脚本
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
systemctl start nginx
sleep 2
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
exit 1
fi
fi
exit 0
七、方案选型决策流程
开始
│
▼
┌───────────────────────┐
│ 子系统数量 > 3个? │
└───────────┬───────────┘
│
┌───────────┴───────────┐
│ │
是 ▼ ▼ 否
┌─────────────────┐ ┌─────────────────┐
│ 多团队独立开发? │ │ 方案A:单层架构 │
└────────┬────────┘ │ 可考虑Nginx共机 │
│ └─────────────────┘
┌───────┴───────┐
│ │
是 ▼ ▼ 否
┌────────────────┐ ┌────────────────┐
│ 有老旧/异构 │ │ 方案A改进版: │
│ 系统需要兼容? │ │ 单层 + 独立 │
└───────┬────────┘ │ Nginx集群 │
│ └────────────────┘
┌───┴───┐
│ │
是 ▼ ▼ 否
┌──────────────────┐ ┌──────────────────┐
│ 方案C:混合模式 │ │ 方案B:两层架构 │
│ 新系统走两层 │ │ (推荐) │
│ 老系统直连 │ │ 统一Nginx独立部署│
└──────────────────┘ │ 子系统Nginx独立 │
└──────────────────┘
八、总结与最佳实践
8.1 核心结论
| 问题 | 答案 |
|---|---|
| Nginx是否独立部署? | 是,统一入口Nginx应独立部署为集群 |
| 指向子系统IP还是Nginx? | 指向子系统Nginx(中大型系统) |
| 两层转发性能影响? | 可忽略(<1ms内网延迟) |
| 最佳架构? | 方案B:两层分布式架构 |
8.2 最佳实践清单
✅ 统一入口Nginx独立部署,至少2节点 + Keepalived
✅ 各子系统部署本地Nginx,由各团队自主维护
✅ 统一入口负责:SSL终止、路由分发、安全防护、访问日志
✅ 子系统Nginx负责:静态资源、本地负载均衡、缓存、业务逻辑
✅ 使用X-Request-ID实现全链路追踪
✅ 分层配置安全策略(入口层 + 子系统层)
✅ 配置健康检查,实现故障自动摘除
✅ 子系统间通过内网通信,不经过统一入口
8.3 反模式警告
❌ 不要在统一Nginx配置所有业务细节
❌ 不要让多团队共同维护同一份Nginx配置
❌ 不要忽略子系统Nginx的日志价值
❌ 不要在入口层做复杂的业务路由逻辑
❌ 不要让静态资源请求穿透到后端服务