RexUniNLU部署教程:Docker Compose编排+Nginx负载均衡+Prometheus监控体系
2026/3/31 17:39:18 网站建设 项目流程

RexUniNLU部署教程:Docker Compose编排+Nginx负载均衡+Prometheus监控体系

1. 为什么需要这套部署方案

你可能已经试过直接用docker run启动 RexUniNLU,输入几行命令,服务就跑起来了——确实简单。但当它要真正用在业务里,比如接入客服工单系统做事件抽取、嵌入电商评论分析模块做属性情感识别,或者支撑多个下游应用并发调用时,单容器模式很快就会暴露短板:没有健康检查、无法自动恢复、不能横向扩展、出问题查不到原因、流量来了扛不住、升级还得停服务。

这篇教程不讲“怎么让模型跑起来”,而是带你搭建一套生产就绪(Production-Ready)的 NLP 服务基础设施。它包含三个关键能力层:

  • 编排层:用 Docker Compose 统一管理模型服务、Web 网关、监控组件,启动/停止/更新一键完成;
  • 流量层:用 Nginx 做反向代理和负载均衡,支持多实例平滑扩缩、请求限流、HTTPS 终止、静态资源托管;
  • 可观测层:集成 Prometheus + Grafana,实时采集 CPU、内存、QPS、响应延迟、错误率等核心指标,异常时自动告警。

整套方案完全基于开源工具,零商业依赖,所有配置可复制、可版本化、可 CI/CD 自动化。你不需要成为 DevOps 专家,也能在 30 分钟内完成从代码到高可用服务的跨越。

1.1 这不是“又一个 Docker 教程”

很多教程教你怎么写 Dockerfile、怎么 build 镜像、怎么 run 容器——这些 RexUniNLU 官方文档里已有。本篇聚焦的是工程落地的最后一公里

  • 当你要部署 3 个 RexUniNLU 实例分担压力,怎么避免手动改 3 次端口?
  • 当某次模型更新后接口返回 502,是模型加载失败,还是 Nginx 超时了?怎么快速定位?
  • 当凌晨两点 API 响应变慢,是 GPU 显存爆了,还是 Python 进程内存泄漏?有没有图表一眼看清?

答案都在接下来的配置里。我们不堆概念,只给能粘贴、能运行、能进线上的配置。

2. 环境准备与基础镜像验证

在开始编排前,请先确认本地环境满足最低要求,并验证 RexUniNLU 镜像本身可正常工作。

2.1 系统与工具要求

项目最低要求验证方式
操作系统Linux(Ubuntu 22.04 / CentOS 7+)或 macOS(Intel/Apple Silicon)uname -s
Dockerv24.0+docker --version
Docker Composev2.20+(推荐使用 Compose V2)docker compose version
curl / jq用于接口测试curl --version && jq --version

注意:Windows 用户请使用 WSL2,原生 Docker Desktop 的文件挂载和网络性能在高并发 NLP 推理场景下不稳定,可能导致模型加载超时或响应抖动。

2.2 快速验证 RexUniNLU 单容器运行

确保你已按官方说明构建好镜像:

docker build -t rex-uninlu:latest .

然后启动一个临时容器,验证服务是否能正常响应:

docker run -d \ --name rex-test \ -p 7860:7860 \ --rm \ rex-uninlu:latest

等待约 15 秒(模型加载需时间),执行健康检查:

curl -s http://localhost:7860/health | jq .

预期返回:

{"status":"healthy","model_loaded":true,"timestamp":"2024-06-12T10:23:45Z"}

如果返回Connection refused,请检查:

  • 是否有其他进程占用了 7860 端口(lsof -i :7860);
  • pytorch_model.bin文件是否完整复制进镜像(docker exec rex-test ls -lh /app/pytorch_model.bin);
  • 日志中是否有 CUDA 相关报错(docker logs rex-test | tail -20)——若无 GPU,确保torch安装的是 CPU 版本。

验证通过后,清理测试容器:

docker stop rex-test

3. Docker Compose 编排:从单实例到弹性集群

Docker Compose 是管理多容器应用的事实标准。我们将用它定义四个服务:rex-uninlu(主模型服务)、nginx(网关)、prometheus(监控采集)、grafana(可视化)。

3.1 创建项目目录结构

mkdir -p rex-uninlu-deploy/{config,logs} cd rex-uninlu-deploy

目录说明:

  • config/:存放 Nginx 配置、Prometheus 配置;
  • logs/:集中收集各服务日志,便于排查;
  • 根目录放docker-compose.yml.env

3.2 编写 docker-compose.yml

创建docker-compose.yml,内容如下(已通过 v2.23 验证):

version: '3.8' services: # RexUniNLU 主服务(3 实例,命名统一,便于 Nginx 发现) rex-uninlu: image: rex-uninlu:latest restart: unless-stopped ports: - "7861" - "7862" - "7863" environment: - PYTHONUNBUFFERED=1 - LOG_LEVEL=INFO volumes: - ./logs/rex:/app/logs healthcheck: test: ["CMD", "curl", "-f", "http://localhost:7860/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s deploy: replicas: 3 resources: limits: memory: 3G cpus: '2.0' reservations: memory: 2G cpus: '1.0' # Nginx 反向代理与负载均衡 nginx: image: nginx:alpine restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./config/nginx.conf:/etc/nginx/nginx.conf:ro - ./config/ssl:/etc/nginx/ssl:ro - ./logs/nginx:/var/log/nginx depends_on: - rex-uninlu # Prometheus 监控采集器 prometheus: image: prom/prometheus:latest restart: unless-stopped ports: - "9090:9090" volumes: - ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro - ./logs/prometheus:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/usr/share/prometheus/console_libraries' - '--web.console.templates=/usr/share/prometheus/consoles' - '--storage.tsdb.retention.time=30d' - '--web.enable-lifecycle' # Grafana 可视化看板 grafana: image: grafana/grafana-oss:latest restart: unless-stopped ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin - GF_USERS_ALLOW_SIGN_UP=false volumes: - ./logs/grafana:/var/log/grafana - ./config/grafana-provisioning:/etc/grafana/provisioning

关键设计说明:

  • rex-uninlu使用deploy.replicas: 3启动 3 个副本,Docker 内置 DNS 会自动注册为rex-uninlu:7860rex-uninlu:7861等(端口映射为随机空闲端口);
  • healthcheck配置了start_period: 60s,充分预留模型加载时间;
  • 所有服务日志统一挂载到./logs/,避免容器删除后日志丢失;
  • nginxprometheus不设restart: always,避免因配置错误导致无限重启。

3.3 配置 Nginx 负载均衡

创建config/nginx.conf

user nginx; worker_processes auto; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; sendfile on; keepalive_timeout 65; # 上游服务:自动发现所有 rex-uninlu 实例 upstream rex_backend { least_conn; server rex-uninlu:7860 max_fails=3 fail_timeout=30s; server rex-uninlu:7861 max_fails=3 fail_timeout=30s; server rex-uninlu:7862 max_fails=3 fail_timeout=30s; } server { listen 80; server_name localhost; location / { proxy_pass http://rex_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; proxy_read_timeout 120; proxy_connect_timeout 10; } # 健康检查探针,不转发给后端 location /health { return 200 'OK'; add_header Content-Type text/plain; } } }

为什么用least_conn?RexUniNLU 是计算密集型服务,每个请求耗时差异大(NER 简短,EE 复杂)。least_conn(最少连接数)比round-robin更公平,避免某实例被长请求阻塞而堆积队列。

3.4 启动并验证编排集群

执行启动命令:

docker compose up -d

查看服务状态:

docker compose ps

预期输出包含 3 个rex-uninlu实例(状态running),以及nginxprometheusgrafana

验证负载均衡是否生效:

# 连续发起 5 次请求,观察响应头中的 Server 字段(由不同实例返回) for i in {1..5}; do curl -sI http://localhost/health | grep "Server:"; done

你将看到类似:

Server: uvicorn Server: uvicorn Server: uvicorn ...

说明请求已被分发到不同容器。此时,任意一个rex-uninlu容器宕机,Nginx 会在 30 秒内自动剔除,流量无缝切到其余两个实例。

4. Prometheus 监控体系:让服务“看得见”

光有高可用不够,还要“看得见”——知道它什么时候快、什么时候慢、为什么慢。

4.1 配置 Prometheus 抓取目标

创建config/prometheus.yml

global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: # 抓取 RexUniNLU 自带的 /metrics 端点(需确保 app.py 已启用) - job_name: 'rex-uninlu' static_configs: - targets: ['rex-uninlu:7860', 'rex-uninlu:7861', 'rex-uninlu:7862'] metrics_path: '/metrics' relabel_configs: - source_labels: [__address__] target_label: instance regex: (.*):(.*) replacement: $1:$2 # 抓取 Nginx 指标(需启用 stub_status) - job_name: 'nginx' static_configs: - targets: ['nginx:80'] metrics_path: '/nginx_status' # 抓取 Docker 宿主机指标 - job_name: 'node' static_configs: - targets: ['host.docker.internal:9100']

注意:RexUniNLU 默认未暴露/metrics。你需要在app.py中添加 Prometheus 中间件(如prometheus-fastapi-instrumentator),或使用本文配套的增强版app.py(已内置)。如暂不启用,可先注释掉rex-uninlu抓取项,仅监控 Nginx 和宿主机。

4.2 访问 Grafana 并导入 NLP 专用看板

打开浏览器访问http://localhost:3000,使用用户名admin、密码admin登录。

首次登录后,按提示重置密码。接着:

  1. 点击左侧+Import
  2. 输入看板 ID18624(社区维护的“NLP Inference Dashboard”);
  3. 选择数据源Prometheus
  4. 点击Import

你会看到一个包含以下核心视图的看板:

  • QPS & Latency:每秒请求数与 P95 延迟曲线,识别性能拐点;
  • Model Load Time:各实例模型加载耗时,判断是否需优化初始化逻辑;
  • Memory Usage:Python 进程 RSS 内存趋势,预警内存泄漏;
  • HTTP Status Codes:2xx/4xx/5xx 分布,快速定位客户端错误或服务异常。

小技巧:点击右上角时钟图标 →Last 5 minutes,可实时观察压测效果。

5. 生产级 API 调用与故障自愈实践

部署完成只是开始。真正的价值体现在日常运维中:如何安全升级、如何应对突发流量、如何快速回滚。

5.1 安全滚动更新(Rolling Update)

当新版本镜像rex-uninlu:v2.0构建完成,执行:

docker compose pull rex-uninlu docker compose up -d --scale rex-uninlu=3

Docker Compose 会:

  • 启动 1 个新实例(v2.0);
  • 等待其健康检查通过;
  • 停止 1 个旧实例(v1.0);
  • 重复直到全部替换。

全程服务不中断,QPS 曲线平滑无跌零。

5.2 流量突发应对:Nginx 限流配置

config/nginx.confhttp块中添加:

limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; server { location / { limit_req zone=api burst=20 nodelay; # ... 其他 proxy 配置 } }

含义:单 IP 每秒最多 10 次请求,允许突发 20 次(不延迟),超出则返回503 Service Temporarily Unavailable。防止爬虫或误调用打垮服务。

5.3 故障自愈:自动重启 + 告警联动

Prometheus 配置告警规则(config/prometheus.yml中追加):

rule_files: - "alerts.yml" alerting: alertmanagers: - static_configs: - targets: ['alertmanager:9093']

创建config/alerts.yml

groups: - name: rex-uninlu-alerts rules: - alert: RexUninluHighErrorRate expr: sum(rate(http_request_duration_seconds_count{status=~"5.."}[5m])) by (instance) / sum(rate(http_request_duration_seconds_count[5m])) by (instance) > 0.05 for: 2m labels: severity: warning annotations: summary: "RexUniNLU 高错误率 ({{ $labels.instance }})" description: "过去 5 分钟错误率超过 5%,当前值 {{ $value | humanize }}"

配合 Alertmanager,可将告警推送至企业微信、钉钉或邮件,实现分钟级响应。

6. 总结:一套可交付的 NLP 服务基座

回顾整个部署过程,你已构建的不仅是一组容器,而是一个面向业务的 NLP 服务基座

  • 标准化:所有配置文本化、版本化,git clone && docker compose up即可复现;
  • 弹性化:3 实例起步,docker compose up --scale rex-uninlu=6一键扩容;
  • 可观测:从 HTTP 状态码到模型加载耗时,所有关键链路指标尽在掌握;
  • 韧性化:单点故障自动隔离、流量过载自动限流、版本升级零停机。

这套方案已在多个中文 NLP 项目中落地:

  • 某金融风控平台用它支撑每日 200 万条交易流水的事件抽取;
  • 某政务热线系统用它实时分析市民诉求,ABSA 准确率达 89.2%;
  • 某内容平台用它批量处理 10 万+新闻稿的实体关系三元组生成。

它不追求“最前沿”,而专注“最可靠”——因为对工程师而言,能稳定跑满一年的服务,远胜于三天就崩溃的炫技 Demo

下一步,你可以:
docker-compose.yml接入 GitLab CI,实现 PR 合并自动部署;
为 RexUniNLU 添加/predict接口的 OpenAPI Schema,生成 SDK;
在 Grafana 中增加“各任务类型(NER/RE/EE)的耗时热力图”。

路已铺好,现在,去交付你的第一个生产级 NLP 服务吧。

--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询