如何在AWS上实现应用分区 将应用与数据库分离至不同EC2实例
AWS EC2应用与数据库分层部署操作流程(基于Amazon Linux 2 AMI)
流程基于你已在单台Amazon Linux 2实例上完成LAMP环境、AJAX业务逻辑、初始数据库搭建的现状,拆分独立应用实例、专用数据库实例的操作按以下顺序执行即可。
1. 前置数据备份(必做,避免操作失误丢数据)
- 备份应用代码:登录现有单实例,执行命令打包web根目录(默认路径为
/var/www/html,有自定义路径替换成实际路径即可):sudo tar -zcf app_code_backup.tar.gz /var/www/html
打包完成后将压缩包下载到本地,或上传到临时存储位置留存。 - 备份数据库数据:执行mysqldump命令全量导出业务库:
mysqldump -u 你的数据库管理员账号 -p 你的业务库名 > db_full_backup.sql
按提示输入密码完成导出,同样将sql备份文件留存到安全位置。 - 记录现有环境配置:把当前实例的PHP版本、Apache自定义配置、应用内的数据库连接参数、已安装的PHP扩展列表全部记到本地,后续新实例配置要保持版本一致,避免兼容问题。
2. 配置专用数据库EC2实例
- 新建EC2实例,镜像选择和现有环境一致的Amazon Linux 2 AMI,实例规格按数据库负载选择,建议数据盘单独挂载gp3类型EBS,不要和系统盘混用,避免IO抢占。实例和后续要建的应用实例必须放在同一个VPC下,建议同可用区降低网络延迟。数据库实例可以不分配公网IP,所有访问走VPC私有网络即可。
- 配置数据库实例的安全组入站规则,仅放开必要端口:
- 22端口(SSH运维):仅允许你的固定运维IP访问
- 3306端口(MySQL/MariaDB默认端口):源直接选择后续应用实例要绑定的安全组,不要写0.0.0.0/0公网放行,也尽量不要写死固定IP,后续应用扩容更灵活
- SSH登录到新的数据库实例,仅安装数据库服务,不需要部署Apache/PHP等应用层组件:
# 更新系统源 sudo yum update -y # 安装和原实例版本一致的数据库(原实例用MySQL就换对应源安装,保持大版本一致) sudo amazon-linux-extras install mariadb10.5 -y # 启动服务并设置开机自启 sudo systemctl start mariadb sudo systemctl enable mariadb - 执行数据库安全初始化:运行
sudo mysql_secure_installation,按交互提示设置root强密码、删除匿名用户、禁用root远程登录、删除默认测试库、刷新权限表。 - 修改数据库监听配置:编辑配置文件
sudo vi /etc/my.cnf.d/mariadb-server.cnf,把bind-address参数从默认的127.0.0.1改为0.0.0.0,保存退出后重启数据库服务sudo systemctl restart mariadb。 - 创建业务专用数据库账号,禁止直接用root账号给业务连接使用:登录数据库执行以下SQL,把占位符替换成实际值:
-- 允许应用安全组内的服务器用app_user账号连接 CREATE USER 'app_user'@'%' IDENTIFIED BY '你的业务账号强密码'; GRANT ALL PRIVILEGES ON 你的业务库名.* TO 'app_user'@'%'; FLUSH PRIVILEGES; exit; - 把之前备份的
db_full_backup.sql上传到数据库实例,执行导入命令:mysql -u root -p 你的业务库名 < db_full_backup.sql
导入完成后登录数据库,抽查核心表数据确认导入完整。
3. 配置独立应用EC2实例
- 新建EC2实例,同样选择Amazon Linux 2 AMI,规格按应用访问量选择,给实例绑定弹性IP(避免重启后公网IP变动),安全组入站规则配置:
- 22端口:仅允许你的固定运维IP访问
- 80/443端口:允许公网0.0.0.0/0访问,用于对外提供web服务
- 注意:应用实例不需要对外放开3306端口
- SSH登录到新的应用实例,安装应用层运行环境,不需要安装本地数据库服务:
# 更新系统源 sudo yum update -y # 安装和原实例版本一致的PHP、Apache、必要PHP扩展 sudo amazon-linux-extras install php7.4 -y # 替换成你原环境的PHP版本 sudo yum install httpd php-mysqlnd php-gd php-mbstring php-xml -y # 扩展按你原环境实际安装的补全 # 启动Apache并设置开机自启 sudo systemctl start httpd sudo systemctl enable httpd - 把之前备份的
app_code_backup.tar.gz上传到应用实例,解压到web根目录:sudo tar -zxf app_code_backup.tar.gz -C /var/www/html/
执行权限修正,确保Apache进程有目录读写权限:sudo chown -R apache:apache /var/www/html - 同步原实例的Apache虚拟主机配置、伪静态规则、PHP.ini自定义配置到新实例,配置完成后重启Apache服务。
- 修改应用代码里的数据库连接配置:把原来的数据库地址
localhost/127.0.0.1替换为数据库实例的私有IP,数据库账号密码替换为之前创建的app_user对应的账号密码,保存配置。
4. 连通性验证与流量切换
- 先在应用实例上测试数据库连通性:执行
mysql -h 数据库实例私有IP -u app_user -p,输入密码后能正常登录,说明网络、权限配置正常。 - 本地通过修改hosts文件,把业务域名指向新应用实例的公网IP,逐页测试业务功能:静态资源加载、AJAX接口请求、数据提交查询、文件上传等核心流程全部跑通,确认无5xx/4xx报错、无数据库连接异常。
- 测试无误后,到域名解析后台把业务域名的A记录正式指向新应用实例绑定的弹性IP,等待解析生效。
- 持续观察24小时应用访问日志、数据库慢查询日志、服务器负载指标,确认业务运行无异常后,可将原单实例停机做快照备份,确认无回滚需求后即可终止原实例。
5. 后续运维注意事项
- 数据库实例不要开通公网访问,所有数据交互走VPC私有网络,降低攻击风险
- 给两个实例配置定期快照策略,数据库快照频率建议高于应用实例,避免数据丢失
- 后续如果要扩容应用层,新增的应用实例只要绑定同一个应用安全组,就自动具备数据库访问权限,不需要修改数据库侧配置
内容的提问来源于stack exchange,提问作者Nir
相关产品推荐
相关产品推荐

