如何在AWS部署Docker化Ktor后端与Svelte SPA并关联自定义域名
将Docker化Ktor后端与Svelte SPA部署到AWS并关联自定义域名
前置准备
- 已托管在AWS Route53的自定义域名(若域名在其他服务商,可转入Route53简化解析配置)
- 在AWS证书管理器(ACM)中申请该域名的SSL证书(需覆盖主域名,如
example.com,证书需部署在us-east-1区域以支持CloudFront)
一、后端部署(Elastic Beanstalk + Docker + RDS)
- 打包并推送Ktor镜像到ECR
- 构建Ktor后端的Docker镜像:
docker build -t ktor-backend . - 创建AWS ECR仓库,按照控制台提供的指令将镜像推送到仓库
- 构建Ktor后端的Docker镜像:
- 创建Elastic Beanstalk环境
- 选择「Docker」平台,配置环境为「Web server environment」
- 在「应用版本」中选择「从ECR拉取镜像」,填入ECR镜像地址
- 添加环境变量(如
DB_URL、数据库用户名密码等)供Ktor读取
- 关联RDS数据库
- 在Beanstalk环境的「配置」>「数据库」中添加RDS实例,或单独创建RDS后通过安全组开放Beanstalk环境的访问权限
- 测试后端:访问Beanstalk生成的默认域名(如
xxx.elasticbeanstalk.com)的/api接口,确认正常响应
二、前端部署(S3 + CloudFront)
- 配置S3桶
- 创建与域名同名的S3桶(如
example.com),禁用静态网站托管,设置桶为私有 - 上传Svelte打包产物:执行
npm run build后,将build目录下的所有文件上传到S3桶
- 创建与域名同名的S3桶(如
- 配置CloudFront分发
- 源选择刚创建的S3桶,启用「Origin Access Control(OAC)」确保仅CloudFront能访问S3
- 设置默认根对象为
index.html,添加自定义错误页面:将404、403状态码指向/index.html(解决SPA路由刷新404问题) - 测试前端:访问CloudFront生成的默认域名,确认页面加载及前端路由正常
三、自定义域名关联与路由分流(核心:替代本地Nginx反向代理)
方案1:CloudFront多源路径匹配(推荐,无额外组件)
这是最简洁的方式,直接在CloudFront中实现/api路由转发到后端,其余路由指向前端:
- 添加后端源到CloudFront
- 编辑CloudFront分发,添加新源:源类型选「自定义源」,域名填入Beanstalk的默认域名
- 源协议策略设置为「HTTPS only」
- 配置/api路由行为
- 添加新行为:路径模式设为
/api/*,源选择刚添加的Beanstalk源 - 缓存策略选择「CachingDisabled」(API请求无需缓存),确保转发所有必要请求头(如
Authorization)
- 添加新行为:路径模式设为
- 绑定自定义域名与SSL
- 在CloudFront分发的「设置」>「备用域名」中添加自定义域名(如
example.com) - 选择ACM中提前申请的SSL证书
- 在CloudFront分发的「设置」>「备用域名」中添加自定义域名(如
- Route53解析配置
- 在Route53中创建A类型的别名记录,将自定义域名指向CloudFront分发的域名
方案2:API Gateway中转(适合需API管理场景)
若需要对后端API做限流、认证等管理,可将Beanstalk后端接入API Gateway,再将CloudFront的/api行为指向API Gateway,步骤略复杂,按需选择。
四、本地Nginx逻辑的对应映射
| 本地Nginx配置 | AWS云环境实现方式 |
|---|---|
location /api { proxy_pass http://ktor-backend; } | CloudFront的/api/*行为转发到Beanstalk源 |
location / { try_files $uri $uri/ /index.html; } | CloudFront默认行为指向S3 + 自定义错误页面配置 |
额外优化建议
- 给Beanstalk环境配置自动缩放规则,根据CPU/内存使用率自动扩容缩容
- 开启S3桶版本控制,便于前端版本回滚
- 给前端静态资源(JS/CSS/图片)添加哈希后缀,配合CloudFront长缓存策略优化加载速度
- 配置Beanstalk安全组,仅允许CloudFront的IP段访问,禁止公网直接访问后端
内容的提问来源于stack exchange,提问作者Lime
相关产品推荐
相关产品推荐

