部署 Django 应用程序:使用外部 Celery 的 ECs 应用程序运行器

王林
发布: 2024-08-08 22:54:12
原创
1006 人浏览过

稍等一下...

Deploying A Django App: ECs App Runner with External Celery

我们都遇到过这种情况,我们正忙着尝试投入生产,但选择部署平台有很多因素。 Emmmm 是的,我们将选择 AWS。通常在坚持使用一个平台之后,我们现在可以依赖一些因素,例如:架构、成本、可靠性、可扩展性、可用性和可行性。你猜怎么了!!!这不会涉及可靠性、可扩展性、可用性和可行性,因为 AWS 在所有这些方面都受到信任。在本教程中,我们将确定 Django 应用程序的某些架构的优缺点。

在我们继续之前,让我们了解一些先决条件,以便完全理解正在发生的事情。

:) 本教程中涉及的所有代码都将作为开源提供。欢迎留下你的足迹

先决条件

在继续之前,您需要:

  • 拥有AWS账户
  • 有一些 Django 知识
  • 了解什么是队列、任务、代理

什么是缓存以及为什么我们要缓存

缓存是一种用于将经常访问的数据临时存储在快速访问位置的技术,从而减少检索该数据所需的时间。在 AWS 中,缓存通过最大限度地减少主数据库和 API 上的负载来提高应用程序性能和可扩展性,从而加快最终用户的响应时间。

我们缓存是为了提高效率、减少延迟并降低成本。通过将数据存储在更靠近应用程序的位置,缓存可以降低数据库查询的频率、网络流量和计算负载。这可以提高数据检索速度、改善用户体验并优化资源使用,这对于高流量应用程序至关重要。

让我们热身一下

Deploying A Django App: ECs App Runner with External Celery

  1. EC2:
    从其完整含义来看,EC2 是“弹性计算引擎”,是 AWS 数据中心中的 Web 服务器。换句话说,EC2 是虚拟的,您可以从 AWS 获得。凭借所有可用功能,您可以通过“即用即付计划”以非常便宜的月费获得一个。

  2. AWS 应用程序运行器:
    这是一项完全托管的服务,可简化 Web 应用程序和 API 的运行和扩展,使开发人员能够从代码存储库或容器映像快速部署,而无需基础设施管理。

  3. 芹菜和姜戈芹菜
    Celery是一个开源的分布式任务队列,用于Python中的实时处理。 Django Celery 将 Celery 与 Django 框架集成,支持 Django 应用程序内的异步任务执行、周期性任务和后台作业管理。该技术的用例各不相同。它可以是通信服务(短信、电子邮件)、计划作业(Cron)和后台数据处理任务,例如数据聚合、机器学习模型训练或文件处理。

  4. Amazon RDS(关系数据库服务)
    它是一种托管数据库服务,可简化云中关系数据库的设置、操作和扩展。它支持MySQL、PostgreSQL、Oracle、SQL Server等多种数据库引擎,提供自动化备份、补丁和高可用性,将用户从数据库管理任务中解放出来。

在此背景下比较 EC2 和 App Runner

架构

让我们研究一下应用程序的结构以及部署设置的行为方式。

  1. 使用 AWS App Runner (ECR) 进行部署设置
    Deploying A Django App: ECs App Runner with External Celery
    我们将代码推送到 GitHub,触发 CodePipeline 工作流程。 CodePipeline 使用 CodeBuild 创建存储在弹性容器注册表 (ECR) 中的 Docker 映像,以进行版本控制。本教程跳过虚拟私有云 (VPC) 配置。我们通过使用 CloudWatch 持续监控日志来确保应用程序运行状况。另一个好处是可以快速配置项目以使用 AWS RDS 和 S3 提供的 Postgres 来处理静态文件。

  2. 使用AWS EC2实例部署
    Deploying A Django App: ECs App Runner with External Celery
    使用类似的过程,省略版本控制和 ECR,我们将代码推送到 GitHub,触发 CodePipeline,后者使用 CodeBuild 创建存储在 ECR 中的 Docker 映像以进行版本控制。 EC2 实例提取这些映像以在 VPC 内部署应用程序,从而使最终用户可以访问该应用程序。该应用程序与 RDS 交互以存储数据,并与 S3 交互以存储静态文件,并由 CloudWatch 监控。我们可以选择使用 certbot 等选项将 SSL 配置添加到此实例中。

价格比较表

以下是基于典型使用场景的 EC2 和 App Runner 之间的假设价格比较:

服务 组件 成本明细 每月费用示例(估算)
EC2 实例使用 t2.micro(1 个 vCPU,1 GB RAM) $8.50
存储 30 GB 通用 SSD $3.00
数据传输 100 GB 数据传输 9.00 美元
总计 $20.50
应用程序运行器 请求 100 万个请求 $5.00
计算 1 个 vCPU,2 GB RAM,每月 30 小时 $15.00
数据传输 100 GB 数据传输 9.00 美元
总计 $29.00

易于管理

让我们快速总结一下这两种资源的管理方式。

因素 EC2 应用运行器
设置 需要手动设置 完全托管服务
管理开销 高 - 需要操作系统更新、安全补丁等 低 - 抽象基础设施管理
配置 对实例配置的广泛控制 有限控制,注重简单

可扩展性

因素 EC2 应用运行器
缩放设置 手动设置 Auto Scaling 组 根据流量自动缩放
规模化管理 需要配置和监控 由AWS管理,无缝扩展
灵活性 对扩展策略的高粒度控制 简化,灵活性较差

部署速度

因素 EC2 应用运行器
部署时间 较慢 - 实例配置和配置 更快 - 托管部署
更新流程 可能需要停机或滚动更新 无缝更新
自动化 需要设置部署管道 简化、集成部署

定制和控制

因素 EC2 应用运行器
定制 广泛 - 对环境的完全控制 有限 - 托管环境
控制 高 - 选择特定实例类型、存储等 较低 - 注重易用性
灵活性 高 - 适合特殊配置 针对标准 Web 应用程序进行了简化

安全

因素 EC2 应用运行器
安全控制 对安全配置的高细节控制 简化安全管理
管理 需要手动配置安全组、IAM 由AWS管理,控制粒度较小
合规 丰富的合规性配置选项 简化合规管理

项目设置

鉴于我们项目的比较不依赖于项目设置本身。我们将拥有一个基本的 Django 应用程序,其中包含来自 AWS 的 celery 配置。
我们将使用 Django 进行一个基本项目。

安装依赖项并创建项目:

命令应按以下顺序运行:

雷雷

此时我们可以通过以下方式检查我们的项目框架:

雷雷

我们现在应该有这个

雷雷

代码和逻辑

我们现在可以继续为应用程序的逻辑添加几行,并覆盖该项目的另一个里程碑。
1-准备芹菜

雷雷

2- 让我们覆盖 celery 变量来设置我们的代理

雷雷

3- 更新init.py 以确保 Django 启动时加载应用程序:

雷雷

4-我们创建任务

雷雷

5- 现在让我们添加我们的视图,只是一个带有简单 Json 响应的简单视图。

雷雷

6- 如果没有端点来访问它,我们就无法拥有视图

雷雷

7- 将我们的应用程序 url 添加到整个项目的通用 urls.py 中。

雷雷

添加环境变量:

雷雷

正确执行所有这些步骤后,我们得到以下输出:
Deploying A Django App: ECs App Runner with External Celery

AWS环境设置

由于我们要运送到 AWS,我们需要配置一些资源来

创建新的VPC(虚拟私有云)

Deploying A Django App: ECs App Runner with External Celery
我们创建一个隔离的环境和网络,以确保我们的资源之间的安全访问和通信。

创建安全组

Deploying A Django App: ECs App Runner with External Celery
我们在之前制作的VPC下创建一个安全组,并一起添加TCP端口6379(Redis端口)的入站和出站规则。

从ElasticCache创建RedisOSS

Deploying A Django App: ECs App Runner with External Celery

基本上,AWS Elastic Cache 为我们提供了两种缓存类型,即:RedisOSS 和 memCache。 RedisOSS 提供先进的数据结构和持久化功能,而 Memcached 更简单,专注于键值对的高速缓存。与 Memcached 不同,Redis 还支持复制和集群。回到正题,回到Redis。

弹性容器注册表 (ECR) 设置

Deploying A Django App: ECs App Runner with External Celery
ECR 图像的创建将非常简单直接。

一:更新以部署 App Runner

按照以下步骤让您的应用程序运行器运行。
Deploying A Django App: ECs App Runner with External Celery
Deploying A Django App: ECs App Runner with External Celery
Deploying A Django App: ECs App Runner with External Celery
在这里我们需要非常技术化。 VPC 是一个安全的网络,我们的大部分资源都位于其中,由于 VPC 中找不到应用程序运行程序,因此我们需要提供一种安全的方式来在这些资源之间进行通信。

凭证 用户凭证

对于本教程,我们需要授权才能将工作流程连接到 ECR。然后我们添加 AmazonEC2ContainerRegistryFullAccess 权限策略,以便它可以将映像推送到我们的 AWS ECR。
Deploying A Django App: ECs App Runner with External Celery

结果

当一切完成后,我们就有了这个树结构。
Deploying A Django App: ECs App Runner with External Celery

Deploying A Django App: ECs App Runner with External Celery

您可以在我的 GitHub 上获得本教程的完整代码库。

TWO: Deploying to an EC2

We will go with one the easiest EC2 to setup and the one having a free tier, an ubuntu EC2 instance. And The same code base that was used above is the same we are using here.

Creating an EC2

![EC2 1]https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rk8waijxkthu1ule91fn.png)
Deploying A Django App: ECs App Runner with External Celery
Alternatively, we can setup the security group separately.
Deploying A Django App: ECs App Runner with External Celery
Deploying A Django App: ECs App Runner with External Celery
Deploying A Django App: ECs App Runner with External Celery
Deploying A Django App: ECs App Runner with External Celery

Setting up the EC2

Run this script to install necessary dependencies

#!/bin/bash # Update the package list and upgrade existing packages sudo apt-get update sudo apt-get upgrade -y # Install Python3, pip, and other essentials sudo apt-get install -y python3-pip python3-dev libpq-dev nginx curl # Install Redis sudo apt-get install -y redis-server # Start and enable Redis sudo systemctl start redis.service sudo systemctl enable redis.service # Install Supervisor sudo apt-get install -y supervisor # Install virtualenv sudo pip3 install virtualenv # Setup your Django project directory (adjust the path as needed) cd ~/aws-django-redis # Create a virtual environment virtualenv venv # Activate the virtual environment source venv/bin/activate # Install Gunicorn and other requirements pip install gunicorn pip install -r requirements.txt # Create directories for logs if they don't already exist sudo mkdir -p /var/log/aws-django-redis sudo chown -R ubuntu:ubuntu /var/log/aws-django-redis # Supervisor Configuration for Gunicorn echo "[program:aws-django-redis] command=$(pwd)/venv/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 my_schedular.wsgi:application directory=$(pwd) autostart=true autorestart=true stderr_logfile=/var/log/aws-django-redis/gunicorn.err.log stdout_logfile=/var/log/aws-django-redis/gunicorn.out.log user=ubuntu " | sudo tee /etc/supervisor/conf.d/aws-django-redis.conf # Supervisor Configuration for Celery echo "[program:celery] command=$(pwd)/venv/bin/celery -A my_schedular worker --loglevel=info directory=$(pwd) autostart=true autorestart=true stderr_logfile=/var/log/aws-django-redis/celery.err.log stdout_logfile=/var/log/aws-django-redis/celery.out.log user=ubuntu " | sudo tee /etc/supervisor/conf.d/celery.conf # Reread and update Supervisor sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl restart all # Set up Nginx to proxy to Gunicorn echo "server { listen 80; server_name ; location / { proxy_pass http://127.0.01:8000; 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; } error_log /var/log/nginx/aws-django-redis_error.log; access_log /var/log/nginx/aws-django-redis_access.log; }" | sudo tee /etc/nginx/sites-available/aws-django-redis # Enable the Nginx site configuration sudo ln -s /etc/nginx/sites-available/aws-django-redis /etc/nginx/sites-enabled/ sudo rm /etc/nginx/sites-enabled/default # Test Nginx configuration and restart Nginx sudo nginx -t sudo systemctl restart nginx
登录后复制

Results

This setup is available on GitHub on the dev branch, have a look and open a PR.
Deploying A Django App: ECs App Runner with External Celery
Deploying A Django App: ECs App Runner with External Celery

Pricing and Setup Comparison Table

Feature / Service Self-Managed on EC2 (Free Tier) Fully Managed AWS Services
EC2 Instance t2.micro - Free for 750 hrs/mo Not applicable
Application Hosting Self-managed Django & Gunicorn AWS App Runner (automatic scaling)
Database Self-managed PostgreSQL Amazon RDS (managed relational DB)
In-Memory Cache Redis on the same EC2 Amazon ElastiCache (Redis)
Task Queue Celery with Redis AWS managed queues (e.g., SQS)
Load Balancer Nginx (self-setup) AWS Load Balancer (integrated)
Static Files Storage Serve via Nginx Amazon S3 (highly scalable storage)
Log Management Manual setup (Supervisor, Nginx, Redis) AWS CloudWatch (logs and monitoring)
Security Manual configurations AWS Security Groups, IAM roles
Scaling Manual scaling Automatic scaling
Maintenance Manual updates and patches Managed by AWS
Pricing Minimal (mostly within free tier) Higher due to managed services

成本汇总

  • 使用 AWS 免费套餐进行设置:如果保持在免费套餐限制内,则主要免费。如果使用量超过免费套餐限额,可能会产生潜在费用。
  • 使用所有付费 AWS 服务进行设置:估计每月约为 41.34 美元,假设 EC2、Elasticache 和 RDS 持续运行一个 t2.micro 实例,并产生额外的数据传输和存储成本。

注意:价格为近似值,可能会根据区域和特定 AWS 定价变化而有所不同。请务必检查当前的 AWS 定价页面,以获得适合您的特定要求的最准确的成本估算。

分析

  • 在 EC2 上进行自我管理:这种方法具有成本效益,特别是在使用 AWS 免费套餐的情况下。它需要更多的设置和手动维护,但可以提供对环境的完全控制。非常适合规模较小或预算较低的项目。
  • 完全托管的 AWS 服务:虽然这会增加运营成本,但会减少与基础设施管理、扩展和维护相关的工作负载。它适用于较大的应用程序或当操作简单性和扩展性优先时。

概括

呐啊啊啊啊!!!不幸的是,没有这方面的总结。是的,回去以便更好地理解。

结论

学习之路漫长且看似困难,但是一次一种资源,不断补充知识可以让我们实现我们的目的和目标。

以上是部署 Django 应用程序:使用外部 Celery 的 ECs 应用程序运行器的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!