跳到正文
阿里雲開發者社區 AI·· 2 小時前AI 評分52

AI 智能體由本地開發遷移至阿里雲 ECS 的部署實踐

从本地开发到云端运行:AI Agent的阿里云ECS部署实践

AI 導讀

作者將一套 AI 智能體應用由個人開發電腦遷移至阿里雲 ECS,使用 Nginx 提供統一入口,並由 systemd 管理 Python 與 Node.js 服務。

正文

简介: 本文记录AI Agent从本地开发迁移到阿里云ECS的完整部署实践,涵盖环境配置、systemd进程托管、Nginx统一入口、版本化发布、就绪验证与基础压测,强调可核查、可重复的工程化交付,助力服务脱离开发机、稳定对外提供访问。(239字)

从本地开发到云端运行:AI Agent的阿里云ECS部署实践

前言

最近,我将一套AI Agent应用从个人开发电脑迁移到了阿里云云服务器ECS。起初,我把部署理解为准备服务器、安装依赖和启动程序。实际操作后才发现,要让应用脱离开发电脑、在云端独立提供访问,还需要处理环境配置、进程托管、访问入口、版本发布和故障排查等工程问题。

这次实践围绕三个目标展开:让服务运行不再依赖开发电脑,让不同设备通过统一入口访问应用,以及让每次更新和异常排查都有可核对的依据。本文聚焦应用迁移过程中的基础设施配置、服务托管、统一访问入口、版本部署与基础性能验证,不展开应用的领域算法、业务决策机制及内部任务处理流程。

一、从开发电脑到独立运行环境

本地开发时,网页服务和多个后端进程可以分别在终端启动,方便调试。但电脑关机后服务就会停止,重新开机需要恢复环境,多设备访问也依赖本地服务持续在线。

迁移到ECS后,我希望把这些临时操作变成明确的运行与检查步骤。因此,上云验收不仅要确认页面能够打开,还要检查以下事项:

  • 服务由操作系统托管,能够统一启停并配置开机启动。
  • 静态页面与API通过统一入口访问。
  • 程序文件、环境配置和持久化数据分开存放。
  • 更新后能够核对实际运行的版本。
  • 出现异常时,能够结合日志和就绪检查定位问题。

这些目标决定了后续的部署方案,也为判断迁移是否完成提供了依据。

二、阿里云ECS选型与部署方案

2.1 实际使用的ECS实例

本次使用阿里云华东1(杭州)地域的ecs.u1-c1m2.large实例,具体配置如下。

配置项目 实际环境
计算资源 2 vCPU、4 GiB内存
操作系统 Ubuntu 26.04 64位
系统盘 40 GiB ESSD Entry
公网带宽 5 Mbps峰值
Python 3.11.17
Node.js 22.23.3
计费方式 实例按量付费,公网按使用流量计费

阿里云ECS实例配置,标识信息已遮挡

选择这一规格,是为了先在适中的计算资源下验证单机部署的可行性。当前实例已完成本文所述的服务运行与访问验证;复杂任务需要多少资源、能够承载多大负载,仍需结合实际工作负载另行测试。

2.2 单机部署与统一入口

本次由单台ECS承载应用,使用Nginx提供HTTP入口和前端静态资源,Python与Node.js进程运行在服务器内部,并交由systemd托管。下图展示的是这些通用组件的部署关系。

阿里云ECS基础设施部署示意,仅展示通用组件及访问入口

这套方案部署路径清晰,进程和日志便于集中检查,适合当前的小规模实践。同时,多个服务共享一台实例,实例故障可能影响整个应用,因此当前方案不具备高可用保障。

2.3 Nginx与公网访问

前端构建产物由Nginx提供,服务器上无须长期运行前端开发服务器。对于单页应用,使用入口回退处理前端路由:

location / {
   
    try_files $uri $uri/ /index.html;
}

API请求则通过独立规则转发到本机后端。下面仅示意常规反向代理形式,端口不对应实际部署值:

location /api/ {
   
    proxy_pass http://127.0.0.1:8000;
}

公网访问需要同时核对ECS安全组、Nginx监听端口和实际公网地址。浏览器通过统一入口访问,内部后端无须各自开放公网端口。本次完成的是HTTP访问验证,正式环境的HTTPS入口与相应Cookie安全配置仍需完善。

三、systemd服务托管与就绪验证

3.1 让进程脱离SSH终端

云端服务需要在SSH断开后继续运行。我将相关进程交由systemd托管,使服务具备统一启停和配置开机启动的操作入口。

判断服务是否可用时,我结合系统服务状态与应用就绪检查,而不只看启动命令是否报错。以下命令展示检查方式,服务名称、端口和就绪路径均为示例,使用时需替换:

systemctl is-active nginx example-python.service example-node.service
curl --fail http://127.0.0.1:8000/ready
curl --fail http://127.0.0.1:8001/ready

实际部署中,相关服务状态正常,Python和Node.js的就绪接口均返回可用状态。这些结果确认了检查时刻的基本就绪情况,长期稳定性仍需持续观察。

3.2 修改配置后,核对运行状态

部署中容易忽略的一点是,文件已经修改,并不意味着运行中的进程已经读取新配置。

systemd单元或drop-in配置发生变化后,需要重新加载服务定义;Nginx配置变动后,应先检查语法,再执行相应重载。下面两条命令分别用于加载服务定义和检查Nginx配置:

systemctl daemon-reload
nginx -t

完成相应服务的重启或重载后,还要再次检查状态和就绪接口。遇到异常时,我会通过systemctl和journalctl核对运行状态与错误日志,再决定后续操作。

四、版本化发布与配置隔离

4.1 区分源码版本与运行版本

如果直接在源码目录中运行程序,代码同步、构建产物和线上版本容易混在一起。为便于核对,我将源码、发布版本、环境配置和运行数据分开存放。以下为通用化后的目录示意:

/opt/application/
├── source/
├── releases/
└── current -> releases/<release>

/etc/application/       # 环境配置
/var/lib/application/   # 持久化运行数据

一次更新中,源码仓库已经同步,服务却仍从current指向的旧目录运行。此后,我会单独核对当前发布目录:

readlink -f /opt/application/current

由此,更新流程被拆分为准备构建产物、检查配置、切换发布目录、重启服务和验证运行状态几个步骤。每一步都需要检查,源码更新也就不再被直接等同于线上更新。

4.2 版本切换与回退的适用边界

版本切换与回退需要考虑运行环境的一致性。切换发布目录并不意味着所有依赖和运行状态都能自动恢复,因此,实际使用前仍需验证不同版本之间的兼容性,并通过部署后的状态检查确认服务是否正常。

例如,如果不同版本共享Python依赖环境,旧代码未必能够适配更新后的依赖;数据格式的变化也可能影响旧版本运行。因此,目录切换只能作为版本恢复的一项操作,完整的回滚能力仍需通过实际验证确认。

五、部署过程中遇到的实际问题

5.1 类型检查通过,进程仍可能启动失败

一次发布前,Node.js程序已通过TypeScript类型检查,正式启动时却出现模块路径解析错误。对比开发环境与服务器启动配置后,我发现运行时未按预期加载所需配置。修正systemd中的运行环境配置并重启后,服务恢复启动,也通过了就绪检查。

这次排障让我把类型检查与实际启动验证分开:前者通过后,仍需在部署环境中确认进程能够启动并提供服务。

5.2 检查过早,导致误判发布失败

另一次更新中,发布脚本在Python进程监听端口前就发送了就绪检查请求。连接失败后,脚本尝试恢复旧发布目录,而日志显示,新进程大约在启动两秒后才开始监听。

我此前误以为curl --max-time 10会在连接失败时自动等待十秒。实际上,这个参数限制的是单次请求的最长执行时间,连接被立即拒绝时不会因此自动重试。

后续应在限定的总等待时间内重复检查服务就绪状态,并在超时后结合进程状态和日志判断发布是否失败。这项重试改进尚未完成验证,仍需通过故障注入和重复发布测试确认其有效性。

5.3 HTTP 200不代表返回了目标页面

安装Nginx后,浏览器一度显示默认欢迎页。服务状态正常,HTTP响应也是200,但内容并非目标应用。

排查时,我检查了Nginx配置和监听端口,并比较指定Host的本机响应与浏览器访问结果,最终发现访问地址与当时确认的公网地址不一致。修正后,页面恢复正常访问。

这说明页面验收需要同时核对状态码、响应内容和访问地址。仅凭HTTP 200,无法确认目标应用已经正确对外提供服务。

5.4 访问协议与Cookie配置需要一致

临时HTTP预览期间,曾出现登录接口成功、刷新后却无法维持会话的情况。排查后发现,Cookie安全属性与当时的访问协议不匹配。调整预览环境配置后,验证恢复正常。

这次调整用于临时HTTP验证。正式公网访问仍需配置HTTPS,并核对与访问协议相匹配的Cookie安全属性。

六、可验证的上云效果与基础压测

6.1 多设备访问验证

完成上述排查后,Nginx能够返回应用页面,Python和Node.js服务通过相应就绪检查。我分别使用PC、手机和iPad访问同一套ECS服务,三类终端均能通过浏览器使用统一入口。

这一结果验证了服务能够脱离开发电脑提供访问。多用户并发和长期稳定性尚不在本次验收结论之内。

6.2 ECS本机轻量HTTP接口测试

为观察当前环境下的基础HTTP请求处理情况,我对Python后端的一个轻量接口进行了本机压测。每个并发档位执行三轮,累计发送1500个请求,结果如下。平均RPS表示每秒处理的请求数,P95、P99分别表示第95、99百分位延迟。

并发数 总请求数 成功率 平均RPS 平均延迟(ms) P95(ms) P99(ms)
1 1500 100% 2362.07 0.422 0.454 0.523
5 1500 100% 3406.83 1.319 2.298 2.476
10 1500 100% 3443.03 2.574 5.032 5.386
20 1500 100% 3416.63 4.971 9.302 22.483

in-out.png

图3|不同并发档位下的轻量HTTP接口平均吞吐量。测试客户端与服务端运行于同一台ECS。

四档请求成功率均为100%。吞吐量从单并发时约2362 RPS增至10并发时约3443 RPS,20并发时未继续增加,P95延迟则升至9.302 ms。这里仅描述观测差异,不据此判断档位间是否存在统计显著性。

资源采样显示,1、5、10、20并发时平均CPU使用率分别约为59.3%、93.5%、94.3%、95.4%,峰值达到100%;整机平均内存从约750.1 MiB变化至757.4 MiB。Python与Node.js进程的RSS(常驻内存)峰值分别约为154 MiB和176 MiB。

本次客户端与服务端运行在同一台ECS上,请求直接到达轻量接口,未经过Nginx公网入口,也未覆盖应用的完整任务。因此,这组数据只反映所述测试条件下的基础接口表现,不能直接换算为Agent吞吐量、实际并发用户数或ECS理论上限;CPU使用率也不能单独归因于服务端。

6.3 上云前后的运行方式变化

项目 本地开发阶段 ECS部署后
运行位置 个人开发电脑 阿里云ECS
关闭开发电脑 本地服务停止 云端服务可独立运行
进程管理 终端手动启动 systemd托管
访问入口 本地服务端口 Nginx统一入口
多设备访问 依赖本地环境 PC、手机、iPad已验证
状态验证 观察进程和终端输出 系统状态与就绪接口结合
更新版本 源码与运行版本容易混淆 独立发布目录与版本指向

迁移的直接变化是服务运行、访问和检查方式更明确。目前尚未完成同等条件下的成本与更新耗时对照,因此不报告降本幅度或效率提升百分比。

七、后续需要完善的工作

当前实践完成了基础的云端运行和访问验证。要进一步用于正式环境,还需完善HTTPS入口、持续监控、依赖与数据回退、完整任务验收,以及备份恢复演练。其中,监控和完整任务验收用于判断持续运行表现,回退与恢复演练用于检验异常情况下的恢复能力。

此前也进行过阿里云OSS的环境配置,但实际上传与下载链路尚未完整验收,因此本文不将其计入已验证成果。是否引入更多云服务,应由后续需求和验证结果决定。

八、总结

这次迁移使应用从依赖开发电脑,转向由ECS独立承载、Nginx提供统一入口、systemd托管进程的运行方式。配置生效、版本切换和异常排查,也逐步有了可以重复执行的检查步骤。

对我而言,上云带来的直接收获,是能够更明确地回答几个问题:服务是否启动、入口是否正确、运行的是哪个版本,以及异常应从哪里查起。当前单机方案已满足本次基础部署与访问验证的目标,持续运行表现、实际负载与故障恢复能力仍需进一步检验。

來源:阿里雲開發者社區 AI · developer.aliyun.com