在AWS上部署Django服务

💡 本文对以下场景有所帮助

  • AWS服务的申请和使用
  • Django服务的部署

背景介绍

AWS上有免费的云服务一年使用额度,不用白不用,刚好用来试试手。

步骤

整个部署大致分为三步:aws申请、环境配置、服务运行。

0. AWS帐户申请

直接去官网创建即可,如果之前已经创建过了的可以忽略这一步。

注册过程中需要用到的信息:

  • 邮箱
  • 密码
  • 手机号
  • 合适的地址
  • visa或者万事达信用卡

如果之前已经使用完AWS Free Tier额度,后续申请实例就需要收费了。

1. 申请EC2实例

出于使用习惯,系统镜像的话选择了ubuntu 24.04 LTS。

实例类型选的是micro,nano还是太小了,而且micro刚好是免费额度内最高标准的。

创个新的密钥对。把生成的pem保存下来,具体登陆脚本创建完aws会给你的。嫌命令麻烦的话可以参考之前的博客,直接将ssh的信息配置进系统里面。

安全组的话,先开个SSH和HTTP就行,后续的看需求来开。

磁盘随意,反正不用钱。

2. 系统相关环境配置

系统已经有git和python的了,但是没有pip。并且如果使用pip来下载python库的话,会被系统劝退。这边推荐是使用虚拟环境来解决。

1
2
3
4
5
6
7
sudo apt-get update 							# 刚拿到手的新系统,不得更新下

# 这个是用来安装pip
sudo apt install python3-pip # 不知道下载哪个就直接运行pip,看系统推荐你下哪个

# 这个是用来安装python虚拟环境管理工具的
sudo apt install python3.12-venv # 和上面一样,不知道运行哪个就直接运行python3 -m venv

3. Django相关环境配置

我这边数据库用的是postgresql,所以只需要下载postgresql就行。你要是想用django自带的SQLite的话,这个session可以直接跳过了。

注意:如果项目中链接postgresql的相关python库是psycopg2的话,哪怕安装完postgresql后可能还是会出现库文件确实的错误,所以需要将psycopg2修改成psycopg2-binary,让它从源码自信构建即可。

3.1 下载PostgreSQL

后面那个postgresql-contrib其实是一些有可能用上的数据库工具包,不想下的话也无所谓。

1
sudo apt-get install postgresql postgresql-contrib

3.2 查看运行状态

下载后已经自运行了,可以通过以下命令去查服务是否正常启动了。

1
sudo systemctl status postgresql

3.3 连接数据库

1
2
3
4
5
# 切换到对应的数据库用户
sudo -i -u postgres

# 进入到数据库的命令行界面
psql

3.4 创建项目所需要的用户和数据库

1
2
3
4
5
# 切换到对应的数据库用户
CREATE USER myuser WITH PASSWORD 'mypassword';

# 切换到对应的数据库用户
CREATE DATABASE mydatabase OWNER myuser;

3.5 退出数据库服务

1
2
3
4
5
# 退出命令行界面
\q

# 退出postgres用户
exit

4. 下载项目到AWS

如果你是从头开始构建项目的话,不需要看这一个session。

本来想直接git clone的,后来因为提升了认证等级,密码不能用,最终改为用公私钥来clone,具体操作参考github官方文档,这种方式通过公私钥直接绑定机器。需要注意的是,在生成密钥所定义的passphrase,其实就是一个多因子验证。可以理解成以后每次push或者clone的时候,需要输一次passphrase,才能调用对应的公私钥。

5. 运行项目并用公网IP连接

先进入到项目文件夹,然后配置python虚拟环境

1
2
3
4
5
6
7
cd mydir/

# 配置虚拟环境
python3 -m venv venv

# 激活虚拟环境
source venv/bin/activate

运行项目之前,需要下载项目依赖(不会有人还不写项目依赖吧🤯

1
pip3 install -r requirements.txt

数据表迁移脚本和迁移操作

1
2
python3 manage.py makemigrations
python3 manage.py migrate

创建超级管理员

1
python3 manage.py createsuperuser

修改项目配置文件setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 用这个库,只需要在根目录下添加.env文件,就可以当作环境变量来用了,代码不需要保留key value
from decouple import config

# 加上AWS的公网IP
ALLOWED_HOSTS = config('ALLOWED_HOSTS').split(',')

# 将数据库配置修改成postgresql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': config('DB_NAME'),
'USER': config('DB_USER'),
'PASSWORD': config('DB_PASSWORD'),
'HOST': config('DB_HOST'),
'PORT': config('DB_PORT'),
}
}

.env文件内容如下

1
2
3
4
5
6
7
ALLOWED_HOSTS=localhost,127.0.0.1,1.2.3.4

DB_NAME=mydatabase
DB_USER=myuser
DB_PASSWORD=mypassword
DB_HOST=127.0.0.1
DB_PORT=5432

运行项目在公网IP上

1
python3 manage.py runserver 0.0.0.0:8000

接下来,和修改aws的postgresql入站规则一样,我们再给django服务器增加一条8000端口的入站规则,接下来就能够通过公网IP来访问网站了。

至此,你已经完成了在AWS上部署Django服务的操作。

接下来的是额外的知识点:

6. 本地连接AWS上的数据库

为了更方便地查看aws上的数据库使用情况,你可能期望从本地连接AWS上的数据库。这需要两步,分别是修改AWS安全组的入站规则,以及修改原有的数据库配置文件。这里就以postgresql为例来进行讲解。

6.1 修改AWS安全组的入站规则

规则类型选择PostgreSQL或者自定义,端口号5432,TCP类型。

请求源IP的话,看你对安全和便捷的取舍,我这边只填了本机的IP。

6.2 修改数据库配置文件

原始的Postgresql只允许localhost连接,因此需要修改两个配置文件,postgresql.conf和pg_hba.conf。

6.2.1 定位文件位置
1
sudo find /etc/postgresql -name postgresql.conf
6.2.2 将postgresql.conf文件中的listen_addresses修改成如下
1
listen_addresses = '*'
6.2.3 在pg_hba.conf文件最后添加一行,写你期望发起请求的ip源即可
1
host    all    all    your-local-ip-address/32    md5
6.2.4 重启数据库服务
1
sudo systemctl restart postgresql

6.3 发起链接请求

我这里用的是pycharm自带的数据库连接工具。

将AWS对应的公网IP、postgresql端口、数据库用户、对应密码、数据库名称填入后,点一下test connection检查连通性,如没问题就可以直接apply了。