07-多域名多站点配置:管理后台、用户端、设备接口分域名隔离

发布时间:2026/8/24 9:14:30
07-多域名多站点配置:管理后台、用户端、设备接口分域名隔离 07-多域名多站点配置管理后台、用户端、设备接口分域名隔离大家好我是黒漂技术佬。前面我们把 HTTPS 证书搞定了但现在面临一个新问题随着业务增长咱们的无人售货柜系统不再是单打独斗——运营在后台管理商品用户在小程序下单售货柜的工控屏在实时上报数据。如果所有流量都挤在一个域名上哪天后台做个大查询把带宽占满用户的开门请求就得排队——这可不是闹着玩的。多域名多站点部署就是解决这个问题的标准答案。今天这篇咱们把 Nginx 的多域名配置掰开揉碎讲清楚。一、为什么要做多域名拆分——架构设计视角先看咱们售货柜系统的流量模型域名用途用户流量特征admin.smartkaba.comSaaS 管理后台运营商大查询、文件导出、偶尔突发高负载user.smartkaba.comC 端用户 Web 小程序接口消费者高并发小请求、对响应速度敏感device.smartkaba.com工控屏数据上报与指令下发售货柜持续心跳、MQTT 长连接、低延迟要求把这三者拆到不同域名上至少有三个好处故障隔离后台的慢查询不会拖垮用户的支付接口独立扩缩容用户端的 QPS 高峰期可以独立加服务器不影响设备接口安全策略差异化后台可以限制 IP 白名单用户端则需要 WAF 防护更重要的是设备接口走专用域名后工控屏的网络请求不需要加载前端的 Vue 路由——减少了不必要的请求处理嵌入式设备性能也会更好。二、server_name 匹配规则——精确、通配符、正则Nginx 在多域名场景下的核心指令是server_name。当一个请求到达 Nginx它按照以下优先级匹配 server 块精确匹配server_name admin.smartkaba.com;—— 完全等于请求 Host 头通配符开头server_name *.smartkaba.com;—— 匹配所有 smartkaba.com 的子域名通配符结尾server_name www.smartkaba.*;—— 匹配所有顶级域极少用正则匹配server_name ~^(?subdomain.)\.smartkaba\.com$;—— 最灵活但性能最低优先级记住一句话精确 通配符开头 通配符结尾 正则。坑点提醒很多同学写server_name smartkaba.com *.smartkaba.com以为这样能把主域名和所有子域名都覆盖但单独写smartkaba.com不带点前缀的其实是精确匹配不存在通配情况。主域名和子域名必须分别处理。如果没有匹配到任何 server 块Nginx 会用默认 server——如果没有显式定义就用第一个 server 块作为默认。这也是为什么在生产环境建议专门写一个 default_server 来兜底server { listen 80 default_server; server_name _; return 444; # Nginx 特殊状态码直接关闭连接不返回任何内容 }三、多 server 块完整配置——三端落地下面是咱们售货柜系统三端的完整 Nginx 配置直接上干货# 默认兜底 Server server { listen 80 default_server; server_name _; return 444; } server { listen 443 ssl http2 default_server; server_name _; ssl_certificate /etc/nginx/ssl/default.crt; # 自签证书 ssl_certificate_key /etc/nginx/ssl/default.key; return 444; } # SaaS 管理后台 server { listen 80; server_name admin.smartkaba.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name admin.smartkaba.com; ssl_certificate /etc/letsencrypt/live/admin.smartkaba.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/admin.smartkaba.com/privkey.pem; # 管理后台 IP 白名单仅运维/运营人员办公网段可访问 allow 192.168.0.0/16; allow 10.0.0.0/8; deny all; # 大文件上传限制商品图片、库存导入Excel client_max_body_size 50m; location / { root /var/www/admin-web/dist; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://gateway:8080/api/; proxy_read_timeout 120s; # 报表导出等长时间查询 } } # C 端用户 Web 小程序接口 server { listen 80; server_name user.smartkaba.com api.smartkaba.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name user.smartkaba.com api.smartkaba.com; ssl_certificate /etc/letsencrypt/live/api.smartkaba.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/api.smartkaba.com/privkey.pem; # 限流单 IP 每秒最多 50 请求防刷 limit_req_zone $binary_remote_addr zoneuser_req:10m rate50r/s; limit_req zoneuser_req burst20 nodelay; # 用户端 Web location / { root /var/www/user-web/dist; try_files $uri $uri/ /index.html; } # 小程序 API带 CORS location /api/ { if ($request_method OPTIONS) { add_header Access-Control-Allow-Origin $http_origin; add_header Access-Control-Allow-Methods GET, POST, PUT, DELETE, OPTIONS; add_header Access-Control-Allow-Headers Content-Type, Authorization, X-Mini-Token; add_header Access-Control-Max-Age 86400; return 204; } add_header Access-Control-Allow-Origin $http_origin always; add_header Access-Control-Allow-Credentials true always; proxy_pass http://gateway:8080/api/; proxy_read_timeout 10s; # 用户请求必须快速响应 } } # 工控屏设备接口 server { listen 80; server_name device.smartkaba.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name device.smartkaba.com; ssl_certificate /etc/letsencrypt/live/device.smartkaba.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/device.smartkaba.com/privkey.pem; # 设备心跳超时设长一点 proxy_read_timeout 300s; proxy_send_timeout 300s; location / { root /var/www/device-web/dist; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://gateway:8080/api/; proxy_set_header X-Device-ID $http_x_device_id; # 传递设备ID } # WebSocket 端点工控屏双向通信 location /ws/ { proxy_pass http://device-service:9000/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_read_timeout 3600s; # 长连接保持1小时 } }四、关键配置要点解读为什么管理后台和用户端要独立 Server 块管理后台配了 IP 白名单allow/deny只让内部办公网段访问——要是和用户端共用用户就访问不了了。同时管理后台需要上传大文件client_max_body_size 50m用户端不需要这么大。独立 Server 块让每条策略各司其职。工控屏的 WebSocket 为啥要单独 endpoint工控屏需要与服务器保持双向通信——开门指令下发、云端锁柜、库存同步这些不能等轮询。WebSocket 是最优方案。proxy_read_timeout设为 1 小时避免长连接被 Nginx 主动断开。限流配置的用户端如何选择rate50r/s意味着每秒最多 50 个请求burst20允许突发 20 个nodelay表示突发请求也立即处理。在咱们这种高频低请求的售卖场景下足够用了。五、单域名多 location 路由方案对比如果你的业务规模还比较小暂时不需要多域名也可以在一个域名下用不同的 location 来做路由server { server_name smartkaba.com; location /admin/ { ... } # 管理后台 location /app/ { ... } # 用户端 location /device/ { ... } # 工控屏 }方案对比如下维度多域名多 Server单域名多 Location故障隔离高独立域名互不影响低一个 NGINX 实例挂了全挂安全策略可独立配置 IP 白名单、WAF同域名策略混在一起维护复杂度中等配置项更多低一处配置扩展性可独立迁移子项目到其它服务器迁移需改造路由适用阶段生产环境、多团队协作快速原型、内部测试建议项目初期用单域名多 location 快速上线业务跑起来后逐步拆分为多域名多 Server。我们售货柜系统现在就是三域名独立部署后面全球化扩张时每个区域的设备接口还能进一步拆分。总结多域名多站点不是过度设计而是业务发展的自然需求。Nginx 的 server_name 匹配规则精确 通配符 正则是配置的关键理解了这个优先级就不会写出互相覆盖的配置。三端拆开后管理后台有白名单保护用户端有限流保护工控屏有长连接支持——各司其职互不干扰。