企业出海降本:如何将应用从 AWS EC2 快速无缝迁移至DigitalOcean Droplet

企业出海已经成为目前最热门的趋势。然而不论你是做跨境电商,还是短剧出海,或处于最热门的AI 赛道,你都需要使用海外的云主机或GPU云服务。海外一线的云服务平台尽管覆盖区域广泛,但是往往费用成本较高。所以降本始终是企业出海关注的重点。

DigitalOcean作为海外上市云服务平台,已服务60万企业用户。DigitalOcean以简单易用、价格实惠、性能稳定,以及一键部署与配置、托管数据库和内置监控等强大功能而受到青睐。这些特点使其成为初创公司、独立开发者和希望将更多精力放在构建而非管理基础设施的成长型团队的理想选择。

所以有许多用户都从一线云服务平台迁移至DigitalOcean,或将DigitalOcean作为多云部署的一部分。甚至有的客户从AWS 迁移至DigitalOcean之后,成功节省了60%的成本。

那么在 AWS EC2 上运行项目如何迁移到 DigitalOcean?

无论你是想降低基础设施成本、简化服务器管理,还是获得对环境的更多控制,本教程都会一步步教会你把一个正在运行中的应用,从 EC2 迁移到 DigitalOcean Droplet 。

本教程确保你能够复刻环境、以安全方式移动文件和数据,并在最小化停机时间的情况下完成迁移。

本教程特别适用于希望优化云基础设施的开发者、创业者和企业。通过从 AWS EC2 迁移到 DigitalOcean Droplet(DigitalOcean的云主机产品),用户可以获得这些好处:

  • 高性价比:与 AWS 相比,DigitalOcean 提供可预测且更低的定价,可显著降低基础设施成本。
  • 简洁易用:DigitalOcean 的用户友好的 UI 和简明的设置流程,让开发者无需具备丰富的云知识即可管理环境。
  • 对开发者友好的功能:一键部署与配置、托管数据库和内置监控等功能,简化了开发和部署流程。
  • 可扩展性:DigitalOcean 的基础设施可随需求扩展,让你能在应用流量激增时轻松调整资源。
  • 社区和支持:庞大的开发者社区和完善的文档,可以帮助你排查问题并优化设置。
  • 专注开发:减少基础设施管理的复杂性,让你有更多时间专注于构建和改进应用。

前期准备

在开始之前,请确保你具备以下条件:

  • 可访问你的 AWS EC2 实例(SSH 密钥或凭证)
  • 一个已完成注册的 DigitalOcean 账户(绑定信用卡或支付宝均可)
  • 了解基本的 Linux 服务器管理知识(命令行、SSH 等)
  • 熟悉你的应用技术栈(如 LAMP、Node.js、Docker)
  • 域名管理门户登录信息(如果需要更新 DNS 记录)

可选但推荐具备以下条件:

  • 用于测试迁移的预发布环境
  • 两台服务器上都已安装 rsync(大多数系统已预装)

另外,如果你需要了解自己的产品应该使用什么配置的DigitalOcean Droplet,可以阅读 DigitalOcean 中国区独家战略合作伙伴卓普云AI Droplet的官方博客《如何选择适合自己的 DigitalOcean Droplet 云服务器配置》。

如何从 AWS EC2 迁移到 Droplet

我们会将迁移过程分为10步,为你提供清晰、可重复的流程,将正在运行中的应用从 AWS 搬到 DigitalOcean。

在此之前,开发者和企业通常使用自定义脚本、供应商特定工具或手动备份来管理迁移,每种方式在复杂度、停机时间和风险上各有利弊。本方法聚焦简洁和可靠,使用 SSH、rsync 和 mysqldump 等广泛支持的工具来优化流程。

由于迁移目标是 DigitalOcean,你将受益于干净、现代的基础设施体验,让你更快、更少阻碍地从部署到扩展。

步骤 1:评估你的 AWS EC2 环境

在进行其他操作之前,先确认你的运行情况:

  • 检查已安装操作系统:通过 SSH 连接 EC2 实例,运行

cat /etc/os-release

  • 以显示操作系统详情。
  • 验证活动服务:运行

systemctl list-units --type=service --state=running

  • 列出所有活动服务,查找 Apache、MySQL 或 Node.js 等服务。
  • 定位应用文件和配置:检查常见目录(如 /var/www/html)来确定应用文件存放位置,或使用

find / -name 'your-app-name'

  • 定位特定文件或目录;在 /etc 或应用目录中检查配置文件。
  • 检查防火墙和安全组设置:在 AWS 管理控制台的 EC2 仪表板中,选中你的实例,在“安全”选项卡下查看关联的安全组,检查入站和出站规则;在实例内运行

sudo iptables -L

  • 查看本地防火墙规则。

此步骤有助于在 DigitalOcean 上准确复刻环境。

步骤 2:创建你的 DigitalOcean Droplet

在 DigitalOcean 控制面板中:

  1. 点击 Create > Droplets
  2. 选择所需的操作系统镜像。
  3. 选择与你的 EC2 实例规模相匹配的方案。
  4. 选择靠近用户的机房区域。
  5. 添加登录方式 —— 推荐使用 SSH 密钥,也可设置强密码。
  6. 设置 Droplet 主机名,添加标签(如需),并选择监控或卷等可选功能,然后创建 Droplet。

创建完成后,从控制面板记录你的 Droplet IP 地址。

步骤 3:配置 Droplet

通过以下任一方式访问新 Droplet:

  • 使用 SSH 密钥(推荐)

ssh root@your_droplet_ip

  • 如果密钥不在默认位置,指定路径:

ssh -i /path/to/private-key root@your_droplet_ip

  • 使用 root 密码:如果之前设置了密码认证,运行:

ssh root@your_droplet_ip

登录后,安装所需软件包,例如:

sudo apt update && sudo apt install nginx mysql-server php -y

(或根据你的栈安装 Node.js、Docker 等)

请确保复刻 EC2 上的所有系统配置。

步骤 4:传输应用文件

使用 rsync 从 EC2 拷贝文件到 Droplet:

rsync -avz -e "ssh -i /path/to/aws-key.pem" ubuntu@your_ec2_ip:/var/www/html/ root@your_droplet_ip:/var/www/html/

rsync 优势:速度快、安全,并保持文件权限。

步骤 5:导出并导入数据库(如适用)

如果应用使用数据库,需要将其从 EC2 实例迁移到 Droplet,以确保应用在新环境中正常运行。

选项 1:在 Droplet 上运行数据库

1、导出数据库

  • MySQL/MariaDB:使用 mysqldump
  • PostgreSQL:使用 pg_dump
  • MongoDB:使用 mongodump
  • Redis:使用 redis-cli 生成快照

2、传输导出文件

rsync -avz -e "ssh -i /path/to/aws-key.pem" ubuntu@your_ec2_ip:/path/to/backup.sql root@your_droplet_ip:/root/

3、在 Droplet 上导入:参照 DigitalOcean 上对应数据库的恢复教程。

选项2:使用DigitalOcean托管数据库(生产环境推荐)

作为替代方案,您无需在Droplet上自行托管数据库,而是可以通过DigitalOcean的托管数据库服务将这一责任移交给平台。这些数据库集群专为生产环境设计,完全托管且提供以下功能:

  • 免费每日备份与特定时间点恢复
  • 自动故障转移的高可用性
  • 端到端安全防护
  • 零停机时间扩展
  • 性能监控与指标分析

迁移至托管数据库的步骤:

  • 创建托管数据库:在DigitalOcean控制面板中,启动一个新的托管数据库实例。
  • 导出并导入数据:使用与上述相同的备份流程导出数据,然后通过提供的凭据将数据导入新的托管数据库。
  • 更新应用配置:将应用程序的数据库连接字符串更改为托管数据库集群提供的连接详情。

选择适合您的方案:

若您仅进行测试或运行小型项目,在Droplet上托管数据库可能已足够。但对于任何生产环境,托管数据库能带来长期且显著的优势。

专业建议:

托管数据库尤其适合以下场景:计划未来扩展规模、需要更高服务可用性保障,或希望省去备份、补丁更新及性能调优等运维工作。

步骤6 :更新配置文件

现在您的应用和数据库已托管在DigitalOcean上,需要更新配置文件以适配新环境。

1. Web服务器配置

如果您使用Nginx、Apache或其他Web服务器,请确保服务器块(server block)或虚拟主机配置文件已正确设置。您需要更新路径、服务器名称,以及可能的SSL证书。例如,对于Nginx,可通过以下命令编辑配置文件:

sudo nano /etc/nginx/sites-available/default

进行必要的修改(如更新文档根目录或服务器名称)。修改完成后,务必重新加载或重启Nginx以应用更改:

sudo systemctl restart nginx

2. 数据库连接字符串

更新应用的数据库连接字符串,使其指向DigitalOcean Droplet或托管数据库中的正确主机地址和凭据。这可能需要修改存储数据库连接信息的环境变量或配置文件。

例如,如果之前连接字符串指向EC2实例,现在需将其更改为Droplet的本地地址(localhost)或托管数据库的IP地址。

3. 环境变量

如果您的应用依赖环境变量(如API密钥、数据库凭据或其他配置设置),请确保在DigitalOcean Droplet中已正确设置。您可以通过以下方式配置环境变量:

  • 直接在Shell配置文件中设置(如 ~/.bashrc~/.bash_profile/etc/environment
  • 或在应用使用的 .env 文件中设置

示例:设置MySQL根密码的环境变量

export MYSQL_ROOT_PASSWORD='your_password'

然后加载变量:

source ~/.bashrc

步骤7 :在Droplet上测试应用

在将Droplet正式上线前,务必彻底测试应用,确保其在新环境中正常运行。以下是测试步骤:

1、检查文件完整性

确认所有应用文件已成功传输到Droplet,并确保文件权限正确且传输过程中未损坏。

2、测试数据库连接

验证应用能否连接到新数据库。若使用Web框架,可通过检查应用日志或直接在命令行执行数据库查询来排查连接错误。

3、执行功能测试

测试应用的各个方面(前端、后端、API等)。您可以手动测试,或使用自动化测试工具(如 Selenium、Postman 或 cURL)验证功能是否正常。

4、查看日志

检查系统和应用日志以发现潜在错误:

sudo journalctl -xe

检查对应日志文件(如 Nginx 错误日志 /var/log/nginx/error.log、MySQL 日志 /var/log/mysql/error.log)或应用自定义的日志路径。

步骤 8:更新 DNS 设置

  1. 登录域名管理控制面板。
  2. 将 A 记录指向你的 Droplet IP,例如:

@    A    your_droplet_ip

  1. 将 TTL 设置为较低值(如 300 秒),以加快生效。
  2. 等待 DNS 传播,通常几分钟至 24 小时,大多数情况下一小时内即可看到流量切换。

步骤 9:切换生产流量

DNS 完全指向 Droplet 后,即可将生产流量切换到 DigitalOcean,期间密切监控:

  • 流量监控:尤其在变更后头几小时。
  • 性能检查:确认在实际负载下表现正常。
  • 性能优化:根据需要调整 Droplet 配置,添加备份等。

步骤 10:最终清理

  1. 终止 EC2 实例:若不再使用,关闭或删除以避免额外费用。
  2. 复核安全设置:确保只开放必要端口(如 22、80、443)。
  3. 备份数据:设置自动备份或手动快照,可使用 SnapShooter 等服务。
  4. 规划扩展:根据应用增长,考虑垂直或水平扩展,如调整 Droplet 大小或添加负载均衡器。

常见问题

  1. 为什么要从 AWS EC2 迁移到 DigitalOcean Droplet? DigitalOcean 以高性价比而受到众多创业公司欢迎,其透明且可预测的定价可显著降低云服务成本;其简洁的界面和开发者友好的工具可优化部署流程,让你专注开发而非管理基础设施或花费大量时间学习云平台的使用。
  2. 更新 DNS 后,DNS 传播需要多长时间? 传播时间通常为几分钟至 24 小时,取决于 DNS 记录的 TTL 设置和各 ISP 的缓存策略。大多数情况下,一小时内即可开始看到流量切换。
  3. 迁移过程中遇到问题该怎么办? 首先检查系统和应用日志以定位错误;若自行无法解决,可联系 DigitalOcean 支持或使用其免费迁移服务以确保平滑过渡。
  4. 如何确保应用在 DigitalOcean 上表现良好? 使用 DigitalOcean 内置监控工具跟踪资源使用情况,识别瓶颈;根据需求调整 Droplet 大小、添加备份或负载均衡器,以保持高性能。
  5. 在 DigitalOcean 上如何备份数据? 可设置自动每周或每日备份,也可手动快照 Droplet。对于更全面的解决方案,可使用 SnapShooter 等第三方服务。

写在最后

在本教程中,我们已经带着你一步步将运行中的应用从 AWS EC2 迁移到 DigitalOcean Droplet —— 从评估现有环境、创建和配置 Droplet,到传输文件和数据库、测试和更新 DNS,实现最小化停机时间的平滑切换。

此过程能帮助你降低云成本、简化基础设施管理,并获得更灵活的部署环境。无论是独立项目还是生产级应用,迁移到 DigitalOcean 都能让你享受面向开发者的简洁定价和现代化体验。

每个应用栈各有差异,可能需要根据具体情况添加额外步骤。如需帮助,DigitalOcean 为符合条件的项目提供免费迁移服务,帮助你更快、更自信地完成过渡,​ 具体详情可直接咨询 DigitalOcean中国区独家战略合作伙伴卓普云AI Droplet。 ​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Spring Boot多模块自动配置失效问题

前言 在Spring Boot多模块项目中,模块间配置不生效是一个复杂但可解决的问题,尤其涉及自动配置类、依赖冲突、条件注解以及IDE配置。 一、问题背景与场景 1.1 场景描述 假设存在两个模块: 模块A:提供通用配置(如跨…

WEBSTORM前端 —— 第2章:CSS —— 第4节:盒子模型

目录 1.画盒子 2.Pxcook软件 3.盒子模型——组成 4.盒子模型 ——边框线 5.盒子模型——内外边距 6.盒子模型——尺寸计算 7.清除默认样式 8.盒子模型——元素溢出 9.外边距问题 ①合并现象 ②塌陷问题 10.行内元素——内外边距问题 11.盒子模型——圆角 12.盒子…

Kafka和flume整合

需求1:利用flume监控某目录中新生成的文件,将监控到的变更数据发送给kafka,kafka将收到的数据打印到控制台: 在flume/conf下添加.conf文件, vi flume-kafka.conf # 定义 Agent 组件 a1.sourcesr1 a1.sinksk1 a1.c…

Idea 如何配合 grep console过滤并分析文件

这里写自定义目录标题 [grep console插件]()右击打开文件目录,选择 tail in console 同时可以添加自己的快捷键。 ![新的改变](https://i-blog.csdnimg.cn/direct/03423e27cf6c40c5abd2d53982547b61.png) 随后会在idea的菜单栏中出现tail菜单。这里,接下…

怎样学习Electron

学习 Electron 是一个很好的选择,特别是如果你想构建跨平台的桌面应用程序,并且已经有前端开发经验。以下是一个循序渐进的学习指南,帮助你从零开始掌握 Electron。 1. 基础知识 HTML/CSS/JavaScript 确保你对这些基础技术有扎实的理解&am…

MySQL 大数据量分页查询优化指南

问题分析 当对包含50万条记录的edu_test表进行分页查询时,发现随着分页越深入,查询时间越长: limit 0,10:0.05秒limit 200000,10:0.14秒limit 499000,10:0.21秒 通过EXPLAIN分析发现,limit o…

【仿真】Ubuntu 22.04 安装MuJoCo 3.3.2

官方GIthub下载: https://github.com/google-deepmind/mujoco/releases 官网:MuJoCo — Advanced Physics Simulation 文档:Overview - MuJoCo Documentation 主要参考:Ubuntu 22.04 安装Mujoco 3.22 - RobotStudent的文章 - 知乎 简…

最新字节跳动运维云原生面经分享

继续分享最新的go面经。 今天分享的是组织内部的朋友在字节的go运维工程师岗位的云原生方向的面经,涉及Prometheus、Kubernetes、CI/CD、网络代理、MySQL主从、Redis哨兵、系统调优及基础命令行工具等知识点,问题我都整理在下面了 面经详解 Prometheus …

PyQt6实例_pyqtgraph散点图显示工具_代码分享

目录 描述: 效果: 代码: 返回结果对象 字符型横坐标 通用散点图工具 工具主界面 使用举例 描述: 1 本例结合实际应用场景描述散点图的使用。在财报分析中,需要将数值放在同行业中进行比较,从而判…

纯C协程框架NtyCo

原文是由写的,写的真的很好,原文链接:纯c协程框架NtyCo实现与原理-CSDN博客 1.为什么会有协程,协程解决了什么问题? 网络IO优化 在CS,BS的开发模式下,服务器的吞吐量是一个受关注的参数&#x…

信息系统项目管理师——第10章 项目进度管理 笔记

10项目进度管理 1.规划进度管理:项目章程、项目管理计划(开发方法、范围管理计划)、事业环境因素、组织过程资产——专家判断、数据分析(备选方案分析)、会议——进度管理计划 2.定义活动:WBS进一步分解&am…

通过门店销售明细表用SQL得到每月每个门店的销冠和按月的同比环比数据

假设我在Snowflake里有销售表,包含ID主键、门店ID、日期、销售员姓名和销售额,需要统计出每个月所有门店和各门店销售额最高的人,不一定是一个人,以及他所在的门店ID和月总销售额。 统计每个月份下,各门店内销售额最高…

移远通信LG69T赋能零跑B10:高精度定位护航,共赴汽车智联未来

当前,汽车行业正以前所未有的速度迈向智能化时代,组合辅助驾驶技术已然成为车厂突出重围的关键所在。高精度定位技术作为实现车辆精准感知与高效协同的基石,其重要性日益凸显。 作为全球领先的物联网及车联网整体解决方案供应商,移…

jmeter-Beashell获取http请求体json

在JMeter中,使用BeanShell处理器或BeanShell Sampler来获取HTTP请求体中的JSON数据是很常见的需求。这通常用于在测试计划中处理和修改请求体,或者在响应后进行验证。以下是一些步骤和示例代码,帮助你使用BeanShell来获取HTTP请求体中的JSON数…

若干查找算法

一、顺序查找 1.原理 2.代码 #if 0 const int FindBySeq(const vector<int>& ListSeq, const int KeyData) {int retrIdx -1;int size ListSeq.size();for(int i 0; i < size; i) {if (ListSeq.at(i) KeyData){retrIdx i;break;}}return retrIdx; } #else c…

Uniapp(vue):生命周期

目录 一、Vue生命周期二、Uniapp中页面的生命周期三、执行顺序比较一、Vue生命周期 setup():是在beforeCreate和created之前运行的,所以可以用setup代替这两个钩子函数。onBeforeMount():已经完成了模板的编译,但是组件还未挂载到DOM上的函数。onMounted():组件挂载到DOM完…

Prometheus监控

1、docker - prometheusgrafana监控与集成到spring boot 服务_grafana spring boot-CSDN博客 2、【IT运维】普罗米修斯基本介绍及监控平台部署&#xff08;PrometheusGrafana&#xff09;-CSDN博客 3、Prometheus监控SpringBoot-CSDN博客 4、springboot集成普罗米修斯-CSDN博客…

C#进阶学习(十四)反射的概念以及关键类Type

目录 本文末尾有相关类中的总结&#xff0c;如有需要直接跳到最后即可 前置知识&#xff1a; 1、程序集&#xff08;Assembly&#xff09; 2、元数据&#xff08;Metadata&#xff09; 3、中间语言&#xff08;IL, Intermediate Language&#xff09; 中间语言&#xff08;…

Kotlin中的also、apply、invoke用法详解

以下是 Kotlin 中作用域函数(let、run、with、also、apply)和 invoke 操作符的完整总结,结合代码示例和对比说明,帮助您理解它们的用法和区别。 一、作用域函数:简化对象操作 作用域函数用于在对象的上下文中执行代码块,并根据函数的不同返回对象本身或 lambda 的结果。…

Ubuntu实现远程文件传输

目录 安装 FileZillaUbuntu 配套设置实现文件传输 在Ubuntu系统中&#xff0c;实现远程文件传输的方法有多种&#xff0c;常见的包括使用SSH&#xff08;Secure Shell&#xff09;的SCP&#xff08;Secure Copy Protocol&#xff09;命令、SFTP&#xff08;SSH File Transfer P…