伏羲模型Ubuntu服务器生产环境部署与运维指南

张开发
2026/4/10 7:44:00 15 分钟阅读

分享文章

伏羲模型Ubuntu服务器生产环境部署与运维指南
伏羲模型Ubuntu服务器生产环境部署与运维指南最近有不少朋友在问想把伏羲天气预报模型真正用起来部署到自己的服务器上该怎么操作特别是想用在生产环境既要稳定又要高效感觉有点无从下手。我花了一些时间把整个流程梳理了一遍从系统准备到服务上线再到后期的监控运维形成了一套比较完整的方案。今天这篇文章就和大家分享一下如何在Ubuntu服务器上为伏羲模型搭建一个既可靠又易于维护的生产环境。整个过程我会尽量讲得详细一些特别是那些容易踩坑的地方希望能帮你省点时间。1. 部署前的准备工作在开始安装模型之前我们需要先把服务器这个“地基”打好。生产环境和咱们自己随便玩玩可不一样安全、稳定是第一位的。1.1 系统环境检查与基础配置首先登录你的Ubuntu服务器。建议使用22.04 LTS或更高版本长期支持版更稳定。咱们先看看系统的基本情况。# 查看系统版本和内核信息 lsb_release -a uname -r # 检查磁盘空间模型和相关数据可能需要几十GB df -h / # 检查内存和CPU建议至少16GB内存4核以上CPU free -h lscpu | grep -E “(CPU\(s\):|Model name)”如果磁盘空间紧张可以考虑挂载一块新的数据盘。内存和CPU如果比较吃紧后面咱们做性能调优的时候需要特别注意。接下来更新系统并安装一些必备的工具。这些工具在后续的部署和运维中都会用到。# 更新软件包列表和已安装的包 sudo apt update sudo apt upgrade -y # 安装常用工具 sudo apt install -y curl wget git vim htop net-tools ufw1.2 安全加固第一步服务器暴露在公网上安全可不能马虎。咱们先做几件基础但重要的事。修改SSH端口并禁用root登录这是最基本的安全措施。用你喜欢的编辑器比如vim或nano打开SSH配置文件。sudo vim /etc/ssh/sshd_config找到以下几行按下面的建议修改Port 22改为Port 你的新端口号比如Port 2222。记住不要用1024以下的知名端口。PermitRootLogin yes改为PermitRootLogin no。以后都用普通用户登录再用sudo提权。PasswordAuthentication yes可以考虑改为PasswordAuthentication no并配合使用SSH密钥登录这样更安全。但如果你是新手可以先不改避免把自己锁在外面。修改完后重启SSH服务sudo systemctl restart sshd。重要在关闭当前连接之前先开一个新的终端窗口用新端口试试能不能连上确认无误再关。配置防火墙Ubuntu自带的ufw防火墙很简单易用。# 启用防火墙 sudo ufw enable # 放行你刚才改的SSH端口 sudo ufw allow 2222/tcp comment ‘SSH Access’ # 放行后续模型服务可能需要用到的端口比如HTTP的80、443或者自定义的API端口 # sudo ufw allow 80/tcp comment ‘HTTP’ # sudo ufw allow 443/tcp comment ‘HTTPS’ # sudo ufw allow 8000/tcp comment ‘Model API’ # 查看规则 sudo ufw status numbered创建专用的运行用户不建议直接用root或者你的个人用户来运行服务。创建一个隔离的专用用户更安全。sudo adduser --system --shell /bin/bash --group fuxi_runner这个fuxi_runner用户就是以后专门用来运行伏羲模型服务的。2. 核心依赖安装与Docker环境搭建伏羲模型依赖Python和一些科学计算库。在生产环境我强烈推荐使用Docker它能解决环境一致性的“魔咒”——“在我机器上好好的怎么到服务器就不行了”2.1 安装Python与基础依赖即便用Docker宿主机上安装一个Python管理工具如pyenv也方便你写一些运维脚本。# 安装编译Python需要的依赖 sudo apt install -y make build-essential libssl-dev zlib1g-dev \ libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \ libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev # 安装pyenv curl https://pyenv.run | bash # 将pyenv初始化命令添加到shell配置文件中~/.bashrc 或 ~/.zshrc echo ‘export PATH“$HOME/.pyenv/bin:$PATH”’ ~/.bashrc echo ‘eval “$(pyenv init -)”’ ~/.bashrc echo ‘eval “$(pyenv virtualenv-init -)”’ ~/.bashrc source ~/.bashrc # 安装一个Python版本例如3.10 pyenv install 3.10.12 pyenv global 3.10.122.2 安装与配置DockerDocker是容器化的标准而Docker Compose能帮你轻松管理多容器应用。# 卸载旧版本如果有 sudo apt remove docker docker-engine docker.io containerd runc # 安装依赖包 sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release # 添加Docker官方GPG密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置稳定版仓库 echo \ “deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 安装Docker引擎 sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 将当前用户加入docker组避免每次都要sudo sudo usermod -aG docker $USER # 注意需要退出终端重新登录这个改动才会生效 # 启动Docker并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 验证安装 docker --version docker compose version安装好后可以调整一下Docker的配置比如日志驱动和存储位置防止日志把磁盘撑爆。# 编辑Docker守护进程配置 sudo vim /etc/docker/daemon.json添加或修改如下内容如果文件不存在就新建{ “log-driver”: “json-file”, “log-opts”: { “max-size”: “10m”, “max-file”: “3” }, “data-root”: “/path/to/your/large/disk/docker” // 可选如果你想把Docker数据存到别的盘 }保存后重启Dockersudo systemctl restart docker。3. 伏羲模型服务部署实战环境准备好了现在进入正题把伏羲模型跑起来。咱们采用Docker Compose来定义整个服务栈清晰又易于管理。3.1 准备项目目录与配置文件首先创建一个清晰的项目目录结构。这能让你的运维工作井井有条。# 切换到之前创建的专用用户或者用sudo -u sudo mkdir -p /opt/fuxi_weather sudo chown -R fuxi_runner:fuxi_runner /opt/fuxi_weather sudo -u fuxi_runner bash # 切换到专用用户shell # 在专用用户的shell中操作 cd /opt/fuxi_weather mkdir -p {config,data,logs,scripts}接下来是重头戏编写docker-compose.yml文件。这个文件定义了模型服务、可能用到的数据库比如存历史预测结果、反向代理等容器。# /opt/fuxi_weather/docker-compose.yml version: ‘3.8’ services: # 伏羲模型推理服务 fuxi-model: image: registry.example.com/fuxi-weather:latest # 替换成你的实际镜像地址 container_name: fuxi-model-service restart: unless-stopped # 生产环境务必设置自动重启 ports: - “127.0.0.1:8000:8000” # 只绑定到本地通过Nginx对外暴露 volumes: - ./config/model_config.yaml:/app/config.yaml:ro # 挂载配置文件 - ./data/input:/app/data/input:ro # 输入数据目录 - ./data/output:/app/data/output # 输出预测结果 - ./logs:/app/logs # 应用日志 environment: - TZAsia/Shanghai - LOG_LEVELINFO - MODEL_PATH/app/models/fuxi_v1 # 可以在这里定义资源限制 # deploy: # resources: # limits: # cpus: ‘4.0’ # memory: 16G networks: - fuxi-network healthcheck: # 健康检查很重要 test: [“CMD”, “curl”, “-f”, “http://localhost:8000/health”] interval: 30s timeout: 10s retries: 3 start_period: 40s # 反向代理可选但推荐。用Nginx管理外部访问、SSL、负载均衡等。 nginx-proxy: image: nginx:alpine container_name: fuxi-nginx restart: unless-stopped ports: - “80:80” - “443:443” volumes: - ./config/nginx.conf:/etc/nginx/nginx.conf:ro - ./data/certbot/conf:/etc/letsencrypt:ro # SSL证书目录 - ./data/certbot/www:/var/www/certbot:ro depends_on: - fuxi-model networks: - fuxi-network networks: fuxi-network: driver: bridge几点说明image需要替换为你构建或获取的伏羲模型Docker镜像。如果是从私有仓库拉取可能还需要配置docker login。ports模型服务只暴露给本地127.0.0.1通过Nginx对外提供服务更安全。volumes把配置、数据、日志挂载到宿主机这样容器重建时数据不会丢失。healthcheck定义了健康检查Docker会据此判断容器是否正常。resources注释掉了但在生产环境建议根据服务器实际情况设置CPU和内存限制防止单个容器吃光资源。3.2 编写Nginx配置文件Nginx作为网关负责把外部的HTTP/HTTPS请求转发给内部的模型服务。# /opt/fuxi_weather/config/nginx.conf user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; 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; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # 上游模型服务 upstream fuxi_backend { server fuxi-model-service:8000; # 如果后续扩展多个实例可以在这里添加 # server fuxi-model-service-2:8000; } server { listen 80; server_name your-domain.com; # 替换成你的域名或IP location / { return 301 https://$server_name$request_uri; } # 用于SSL证书自动续期的验证路径如果你用Certbot location /.well-known/acme-challenge/ { root /var/www/certbot; } } server { listen 443 ssl http2; server_name your-domain.com; # 替换成你的域名 ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # 其他SSL优化配置可以后续添加... location / { proxy_pass http://fuxi_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_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; } location /health { proxy_pass http://fuxi_backend/health; access_log off; } } }3.3 启动服务与验证配置文件都齐了现在可以启动服务了。# 确保在 /opt/fuxi_weather 目录下 cd /opt/fuxi_weather # 使用Docker Compose启动所有服务-d 表示后台运行 docker compose up -d # 查看服务状态 docker compose ps # 查看模型服务的日志确认启动无误 docker compose logs -f fuxi-model如果看到日志显示模型加载成功、服务在指定端口如8000开始监听就说明启动成功了。接下来进行功能验证# 从宿主机本地测试健康检查接口 curl http://localhost:8000/health # 预期返回类似 {“status”: “healthy”} 的JSON # 测试通过Nginx转发的API接口假设你配置了域名或直接用了IP # curl -X POST https://your-domain.com/predict -H “Content-Type: application/json” -d ‘{…}’ # 根据模型实际的API文档传入参数4. 生产环境运维与监控服务跑起来只是第一步如何保证它长期稳定、高效地运行才是运维的核心。4.1 日志管理策略日志是排查问题的生命线。我们之前已经通过volumes把容器内的日志目录挂载出来了./logs。但还需要一个策略来管理这些日志防止它们无限膨胀。一个简单有效的方法是使用logrotate。为伏羲模型服务创建一个专用的日志轮转配置。# 创建logrotate配置文件 sudo vim /etc/logrotate.d/fuxi-model添加以下内容/opt/fuxi_weather/logs/*.log { daily # 每天轮转一次 missingok # 如果日志文件丢失不报错 rotate 30 # 保留最近30天的日志 compress # 压缩旧的日志文件 delaycompress # 延迟一天压缩方便查看最新的日志 notifempty # 如果日志文件为空不轮转 create 644 fuxi_runner fuxi_runner # 轮转后创建新文件并设置权限和属主 sharedscripts # 在所有日志轮转后执行一次postrotate脚本 postrotate # 向模型服务发送信号让其重新打开日志文件如果支持 docker compose -f /opt/fuxi_weather/docker-compose.yml kill -s USR1 fuxi-model-service 2/dev/null || true endscript }这样日志文件就会每天自动切割、压缩并保留30天。你随时可以去/opt/fuxi_weather/logs目录下查看。4.2 基础监控与告警对于生产服务我们需要知道它是不是“活着”以及资源使用是否健康。除了Docker自带的healthcheck我们还可以用一些更直观的工具。使用cAdvisor Prometheus Grafana可选但推荐这是一套经典的容器监控方案。cAdvisor收集容器指标Prometheus存储和查询Grafana展示漂亮的图表。部署它们也可以用Docker Compose这里不展开但思路是相通的。简易监控脚本我们可以先写一个简单的Shell脚本定期检查服务状态和资源并通过邮件或即时通讯工具发送告警。#!/bin/bash # /opt/fuxi_weather/scripts/health_check.sh SERVICE_NAME“fuxi-model-service” LOG_FILE“/opt/fuxi_weather/logs/health_check.log” ALERT_EMAIL“your-emailexample.com” # 替换成你的邮箱 # 1. 检查容器是否在运行 if ! docker ps --format “{{.Names}}” | grep -q “^${SERVICE_NAME}$”; then echo “$(date): 错误 - 容器 ${SERVICE_NAME} 未运行” $LOG_FILE # 这里可以添加发送告警邮件的命令例如使用mail或curl调用webhook # mail -s “伏羲模型服务宕机告警” $ALERT_EMAIL (echo “容器 ${SERVICE_NAME} 已停止。”) # 尝试自动重启 cd /opt/fuxi_weather docker compose up -d $SERVICE_NAME exit 1 fi # 2. 检查健康检查端点 HEALTH_STATUS$(curl -s -o /dev/null -w “%{http_code}” http://localhost:8000/health || echo “000”) if [ “$HEALTH_STATUS” ! “200” ]; then echo “$(date): 警告 - 健康检查失败状态码: ${HEALTH_STATUS}” $LOG_FILE # 可以发送警告通知而非错误通知 fi # 3. 检查容器资源使用简单示例 CONTAINER_ID$(docker ps -q --filter “name${SERVICE_NAME}”) if [ -n “$CONTAINER_ID” ]; then CPU_PERCENT$(docker stats --no-stream --format “{{.CPUPerc}}” $CONTAINER_ID | tr -d ‘%’) MEM_USAGE$(docker stats --no-stream --format “{{.MemUsage}}” $CONTAINER_ID | cut -d ‘/’ -f1 | tr -d ‘GiB’ | xargs) # 如果CPU持续超过90%或内存超过设定阈值可以记录警告 if (( $(echo “$CPU_PERCENT 90.0” | bc -l) )); then echo “$(date): 警告 - 容器CPU使用率过高: ${CPU_PERCENT}%” $LOG_FILE fi fi echo “$(date): 健康检查通过” $LOG_FILE然后用crontab让这个脚本定时运行比如每5分钟一次。# 编辑当前用户的crontab crontab -e添加一行*/5 * * * * /bin/bash /opt/fuxi_weather/scripts/health_check.sh /dev/null 214.3 性能调优与问题排查服务运行一段时间后可能会遇到性能瓶颈。这里有几个常见的调优方向。Docker容器资源限制在docker-compose.yml中取消deploy.resources.limits的注释并根据服务器实际情况和模型需求合理设置CPU和内存上限。这能防止单个容器耗尽资源导致系统不稳定。模型推理优化批处理如果预测请求密集看模型是否支持批处理batch prediction一次性处理多个请求能显著提升吞吐量。缓存对于相同的输入参数预测结果在一定时间内是固定的。可以考虑在应用层比如Nginx后面加一个Redis增加缓存直接返回历史结果减轻模型压力。GPU加速如果模型支持且服务器有GPU务必使用GPU进行推理速度会有数量级的提升。这需要在Docker镜像中包含CUDA驱动并在docker-compose.yml中配置runtime: nvidia和deploy.resources.reservations.devices。问题排查命令工具箱docker compose logs -f [服务名]实时查看某个服务的日志。docker exec -it [容器名] /bin/bash进入容器内部进行调试。docker stats实时查看所有容器的资源使用情况CPU、内存、网络IO。htop或nmon监控宿主机的整体资源状况。netstat -tulpn | grep :8000查看端口占用情况。5. 总结与后续建议走完这一整套流程一个具备基本生产可用性的伏羲天气预报模型服务就算部署完成了。从安全的系统配置到用Docker封装环境再到通过Nginx对外提供服务最后配上日志管理和监控告警每一步都是为了让它跑得更稳、更久。实际用下来我觉得最关键的有三点一是规划好目录和配置一开始就把数据、日志、配置的路径规划清楚后面运维会省心很多二是善用健康检查这是自动化运维的基础三是日志要管好出问题的时候才知道从哪里查起。这套方案算是一个比较扎实的起点。随着业务量增长你可能还需要考虑更多东西比如用Kubernetes来管理更复杂的容器编排、搭建完整的监控告警平台PrometheusGrafana、或者做跨可用区的部署来保证高可用。不过那都是后话了。如果你刚开始在生产环境用伏羲模型先把今天聊的这些做好应该就能覆盖大部分场景了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章