本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将 Django 应用程序部署到 Elastic Beanstalk
本教程演练如何将默认的自动生成的 Django
在本教程中,您将执行以下操作:
先决条件
要完成此教程,您应当安装所有面向 Python 的常见先决条件软件,包括以下程序包:
-
Python 3.7 或更高版本
-
pip
-
virtualenv
-
awsebcli
Django
注意
使用 EB CLI 创建环境需要服务角色。您可以通过在 Elastic Beanstalk 控制台中创建环境来创建服务角色。如果您没有服务角色,EB CLI 会尝试在您运行 eb create
时创建一个。
设置 Python 虚拟环境和安装 Django
使用 virtualenv
创建虚拟环境,并用它来安装 Django 及其依赖项。通过使用虚拟环境,您可以确切地了解哪些程序包是您的应用程序所必需的,以便在运行应用程序的 Amazon EC2 实例上安装所需的数据包。
以下步骤演示必须为基于 Unix 的系统和 Windows 输入的命令,这些命令显示在单独的选项卡上。
设置虚拟环境
-
创建名为
eb-virt
的虚拟环境。 -
激活虚拟环境。
您将看到您的命令提示符前面带有
(eb-virt)
,表明您在虚拟环境中。注意
这些指令的剩余部分在您的主目录
~$
中显示 Linux 命令提示符。在 Windows 上,这是C:\Users\
,其中USERNAME
>USERNAME
是 Windows 登录名称。 -
使用
pip
安装 Django。(eb-virt)~$
pip install django==2.2
注意
您安装的 Django 版本必须与您在 Elastic Beanstalk Python 配置中选择用于部署应用程序的 Python 版本兼容。有关部署的更多信息,请参阅本主题中的使用 EB CLI 部署您的网站。
有关当前 Python 平台版本的更多信息,请参阅《AWS Elastic Beanstalk 平台》文档中的 Python。
有关 Django 与 Python 的版本兼容性问题,请参阅我可以将哪个 Python 版本与 Django 一起使用?
-
要验证已安装 Django,请输入以下命令。
(eb-virt)~$
pip freeze
Django==2.2 ...此命令列出虚拟环境中已安装的所有程序包。稍后,您使用此命令的输出来配置项目,以便配合 Elastic Beanstalk 使用。
创建 Django 项目
现在您已准备好使用虚拟环境来创建 Django 项目并在计算机上运行。
注意
本教程使用 SQLite,这是包含在 Python 中的一个数据库引擎。使用您的项目文件部署数据库。对于生产环境,我们建议您使用 Amazon Relational Database Service (Amazon RDS),并且将它与您的环境分隔开。有关更多信息,请参阅 将 Amazon RDS DB 实例添加到 Python Elastic Beanstalk 环境。
生成 Django 应用程序
-
激活虚拟环境。
您将看到您的命令提示符带有
(eb-virt)
前缀,表明您在虚拟环境中。注意
这些指令的剩余部分显示在您的主目录和 Linux 主目录
~/
中的 Linux 命令提示符~$
。在 Windows 上,这是C:\Users\
,其中USERNAME
>USERNAME
是您的 Windows 登录名称。 -
使用
django-admin startproject
命令创建名为ebdjango
的 Django 项目。(eb-virt)~$
django-admin startproject ebdjango
该命令创建名为 ebdjango 的标准 Django 站点,包含以下目录结构。
~/ebdjango |-- ebdjango | |-- __init__.py | |-- settings.py | |-- urls.py | `-- wsgi.py `-- manage.py
-
使用
manage.py runserver
在本地运行 Django 站点。(eb-virt) ~$
cd ebdjango
(eb-virt) ~/ebdjango$
python manage.py runserver
-
在 Web 浏览器中,打开
http://127.0.0.1:8000/
以查看站点。 -
检查服务器日志,查看请求的输出。要停止 Web 服务器并返回到虚拟环境,请按 Ctrl+C。
Django version 2.2, using settings 'ebdjango.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. [07/Sep/2018 20:14:09] "GET / HTTP/1.1" 200 16348
Ctrl+C
为 Elastic Beanstalk 配置您的 Django 应用程序
本地计算机已有一个 Django 支持的网站,因此,您可将其配置为配合 Elastic Beanstalk 部署。
默认情况下,Elastic Beanstalk 会查找名为 application.py
的文件来启动您的应用程序。由于这不在您创建的 Django 项目中,因此您必须对您应用程序的环境做出一些调整。您还必须设置环境变量,以便可以加载您的应用程序的模块。
为 Elastic Beanstalk 配置您的站点
-
激活虚拟环境。
-
运行
pip freeze
,然后将输出保存到名为requirements.txt
的文件。(eb-virt) ~/ebdjango$
pip freeze > requirements.txt
Elastic Beanstalk 使用
requirements.txt
来确定哪些程序包应安装在运行应用程序的 EC2 实例上。 -
创建名为
.ebextensions
的目录。(eb-virt) ~/ebdjango$
mkdir .ebextensions
-
在
.ebextensions
目录中,添加名为django.config
的配置文件,包含以下文本:例 ~/ebdjango/.ebextensions/django.config
option_settings: aws:elasticbeanstalk:container:python: WSGIPath: ebdjango.wsgi:application
设置
WSGIPath
指定 Elastic Beanstalk 用于启动应用程序的 WSGI 脚本位置。注意
如果您使用的是 Amazon Linux AMI Python 平台版本(在 Amazon Linux 2 之前),请将
WSGIPath
的值替换为ebdjango/wsgi.py
。示例中的值适用于 Gunicorn WSGI 服务器,该服务器在 Amazon Linux AMI 平台版本上不受支持。 -
使用
deactivate
命令停用虚拟环境。(eb-virt) ~/ebdjango$
deactivate
每当您需要为应用程序添加程序包或本地运行应用程序时,重新激活虚拟环境。
使用 EB CLI 部署您的网站
您已添加在 Elastic Beanstalk 上部署应用程序所需的全部内容。您的项目目录现在应该如下所示。
~/ebdjango/
|-- .ebextensions
| `-- django.config
|-- ebdjango
| |-- __init__.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
|-- db.sqlite3
|-- manage.py
`-- requirements.txt
下一步,您将创建应用程序环境并使用 Elastic Beanstalk 部署已配置的应用程序。
完成部署后,您应立即编辑 Django 的配置以将 Elastic Beanstalk 分配给您的应用程序的域名添加到 Django 的 ALLOWED_HOSTS
。然后,您将重新部署您的应用程序。这是一个 Django 安全要求,旨在防止 HTTP Host
标头攻击。有关更多信息,请参阅主机标头验证
创建环境并部署 Django 应用程序
注意
本教程将 EB CLI 作为部署机制,但您也可以使用 Elastic Beanstalk控制台部署包含项目内容的 .zip 文件。
-
使用 eb init 命令,初始化 EB CLI 存储库。
~/ebdjango$
eb init -p python-3.7 django-tutorial
Application django-tutorial has been created.此命令会创建一个名为
django-tutorial
的应用程序。它还配置本地存储库,以最新的 Python 3.7 平台版本创建环境。 -
(可选)再次运行 eb init 以配置默认密钥对,以便使用 SSH 连接到运行您的应用程序的 EC2 实例。
~/ebdjango$
eb init
Do you want to set up SSH for your instances? (y/n):y
Select a keypair. 1) my-keypair 2) [ Create new KeyPair ]如果您已有密钥对,请选择一个,或按提示创建一个。如果您没有看到提示或需要以后更改设置,请运行 eb init -i。
-
创建环境并使用 eb create 将应用程序部署到此环境中。
~/ebdjango$
eb create django-env
注意
如果您看到“service role required”错误消息,请以交互方式运行
eb create
(不指定环境名称),EB CLI 会为您创建角色。此命令创建名为
django-env
的负载均衡的 Elastic Beanstalk 环境。创建一个环境需要大约 5 分钟。Elastic Beanstalk 在创建运行应用程序所需的资源时,将输出信息性消息,并由 EB CLI 转发至终端。 -
当环境创建过程完成时,通过运行 eb status 找到您的新环境的域名。
~/ebdjango$
eb status
Environment details for: django-env Application name: django-tutorial ... CNAME:eb-django-app-dev.elasticbeanstalk.com
...您的环境的域名是
CNAME
属性的值。 -
打开
settings.py
目录中的ebdjango
文件。找到ALLOWED_HOSTS
设置,然后将您在上一步中找到的应用程序域名添加到该设置的值。如果您在该文件中找不到此设置,请将此设置添加到一个新行。... ALLOWED_HOSTS = ['
eb-django-app-dev.elasticbeanstalk.com
'] -
部署该文件,然后通过运行 eb deploy 部署您的应用程序。运行 eb deploy 时,EB CLI 会捆绑项目目录中的内容并将其部署到环境中。
~/ebdjango$
eb deploy
注意
如果您将 Git 用于您的项目,请参阅将 EB CLI 与 Git 配合使用。
-
当环境更新过程完成时,请使用 eb open 打开网站。
~/ebdjango$
eb open
这将使用为应用程序创建的域名打开一个浏览器窗口。您应该看到在本地创建和测试的相同 Django 网站。
如果您没有看到应用程序运行,或者出现错误消息,请查看排查部署问题以获取有关如何确定错误原因的帮助。
如果您确实 看到应用程序在运行,那么恭喜,您已使用 Elastic Beanstalk 部署了第一个 Django 应用程序!
更新应用程序
现在,您已在 Elastic Beanstalk 上运行应用程序,接下来可以更新和重新部署您的应用程序或其配置,Elastic Beanstalk 会处理更新实例和启动新的应用程序版本的工作。
在本示例中,我们将启用 Django 管理控制台并配置一些其他设置。
修改您的站点设置
默认情况下, Django 网站使用 UTC 时区显示时间。您可以通过在 settings.py
中指定时区来加以更改。
更改您的站点的时区
-
在
settings.py
中修改TIME_ZONE
设置。例 ~/ebdjango/ebdjango/settings.py
... # Internationalization LANGUAGE_CODE = 'en-us' TIME_ZONE =
'US/Pacific'
USE_I18N = True USE_L10N = True USE_TZ = True如需获取时区列表,请访问此页面
。 -
将应用程序部署到您的 Elastic Beanstalk 环境。
~/ebdjango/$
eb deploy
创建站点管理员
您可以为 Django 应用程序创建站点管理员,以便从站点直接访问管理员控制台。管理员登录详细信息安全地存储在包含在 Django 生成的默认项目中包含的本地数据库镜像中。
创建站点管理员
-
初始化 Django 应用程序的本地数据库。
(eb-virt) ~/ebdjango$
python manage.py migrate
Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying sessions.0001_initial... OK -
运行
manage.py createsuperuser
以创建管理员。(eb-virt) ~/ebdjango$
python manage.py createsuperuser
Username:admin
Email address:me@mydomain.com
Password:********
Password (again):********
Superuser created successfully. -
要告诉 Django 在哪里存储静态文件,请在
settings.py
中定义STATIC_ROOT
。例 ~/ebdjango/ebdjango/settings.py
# Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.2/howto/static-files/ STATIC_URL = '/static/'
STATIC_ROOT = 'static'
-
运行
manage.py collectstatic
用管理员站点的静态资产(javascript、CSS 和图像)填充static
目录。(eb-virt) ~/ebdjango$
python manage.py collectstatic
119 static files copied to ~/ebdjango/static -
部署您的应用程序。
~/ebdjango$
eb deploy
-
在您的浏览器中打开站点,并且将
/admin/
附加到站点 URL,以此查看管理控制台,如下所示。http://
djang-env.p33kq46sfh.us-west-2
.elasticbeanstalk.com/admin/ -
使用您在步骤 2 中配置的用户名和密码登录。
您可以使用与本地更新/测试类似的过程,然后运行 eb deploy。Elastic Beanstalk 将执行更新您的实时服务器的工作,因此,您可以重点关注应用程序开发而不是服务器管理!
添加数据库迁移配置文件
您可以将命令添加到 .ebextensions
脚本,该脚本会在您的站点发生更新时运行。这样,您可以自动实现数据库迁移。
在部署应用程序时添加迁移步骤
-
利用以下内容创建名为
db-migrate.config
的配置文件。例 ~/ebdjango/.ebextensions/db-migrate.config
container_commands: 01_migrate: command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate" leader_only: true option_settings: aws:elasticbeanstalk:application:environment: DJANGO_SETTINGS_MODULE: ebdjango.settings
此配置文件激活服务器的虚拟环境,在启动应用程序之前在部署流程中运行
manage.py migrate
命令。由于它在应用程序启动之前运行,因此您还必须明确配置DJANGO_SETTINGS_MODULE
环境变量(通常在启动时由wsgi.py
负责此项工作)。在命令中指定leader_only: true
可确保当您重新部署到多个实例时,该命令仅运行一次。 -
部署您的应用程序。
~/ebdjango$
eb deploy
清理
要在开发会话之间保存实例小时和其他 AWS 资源,请使用 eb terminate 终止 Elastic Beanstalk 环境。
~/ebdjango$ eb terminate django-env
此命令会终止环境及其内部运行的所有AWS资源。但它不删除应用程序,因此,您始终可以再次运行 eb create,创建具有相同配置的更多环境。有关 EB CLI 命令的更多信息,请参阅使用 EB CLI 管理 Elastic Beanstalk 环境。
如果您不再使用示例应用程序,也可移除项目文件夹和虚拟环境。
~$ rm -rf ~/eb-virt
~$ rm -rf ~/ebdjango
后续步骤
有关 Django 的更多信息(包括详细教程),请访问官方文档
如果您希望尝试其他 Python Web 框架,请参阅将 Flask 应用程序部署到 Elastic Beanstalk。