阿里云从零部署 Django
阿里云快捷登录
在阿里云的控制台中复制服务器的公网 IP,我的是 47.102.121.213
免密登录
在本地执行命令(按提示输入密码),向服务器发送自己的公钥文件
|
|
此时阿里云上的 ~/.ssh/authorized_keys
与本地 ~/.ssh/id_rsa.pub
一致,即可免密登录阿里云
|
|
若重新格式化磁盘,则需要在目录 ~/.ssh
下的 known_hosts
中的 47.102.121.213
,才能登录阿里云。
此外,也可将自己的私钥加入 ssh-agent,ssh 代理,它会帮你自动输入密码短语 passphrase
|
|
配置服务器 Host
在本地 ~/.ssh
目录下新建 config
,输入以下内容
|
|
保存退出后即可用 ssh aliyun
登录。
修改 hostname
登录服务器后会发现,服务器实例名称是一串冗长的字母和数字,可在阿里云服务器上修改 etc/hostname
,例如 aliyun
,并 reboot
使之生效。此时终端命令行的开头变成 root@aliyun:
,更美观。
安装相关软件
服务器系统是 Ubuntu 16.04.6 LTS
部署 Django 需要用到 Git、Pytohn3、pip3、virtualenv、Nginx
安装 Git
|
|
生成公钥、密钥,并且在 github 上配置
|
|
将输出的公钥添加到 GitHub,settings -> SSH and GPG keys -> New SSH key
安装 Pytohn3、pip3、virtualenv
|
|
安装 virtualenv 时,报错
|
|
终端执行 export LC_ALL=C
可暂时解决该问题。
可在 .bashrc
中添加
|
|
并运行 source .bashrc
重新安装 virtualenv
|
|
切入到目录 /root/sites/stanine.top/
,输入一下命令建立虚拟环境,取名为 env
|
|
这里使用 –python=python3 来指定克隆 Python3 的环境,如果不特别指定的话 Virtualenv 默认克隆的是 Python2 的环境。
使用虚拟环境,在终端输入source env/bin/activate
,退出虚拟环境,输入deactivate
。如果项目开发完成后想删除虚拟环境,直接删除虚拟环境目录即可。
安装 Nginx
|
|
ubantu 安装完 Nginx 后,文件结构大致为:
|
|
在阿里云 -> ECS -> 安全组 -> 配置规则,添加 80
端口以通过 HTTP 服务访问网站,通过 netstat -ant |grep 80
可查看 80 端口的监听状况。
启动 Ngnix 服务
Nginx 是用来处理静态文件请求的,比如当我们访问一个博客文章详情页面时,服务器会接收到下面两种请求:
- 显示文章的详情信息,这些信息通常保存在数据库里,因此需要调用数据库获取数据
- 图片、css、js 等存在服务器某个文件夹下的静态文件
对于前一种请求,博客文章的数据需要借助 Django 从数据库中获取,Nginx 处理不了,它就会把这个请求转发给 Django,让 Django 去处理。而对于后一种静态文件的请求,只需要去这些静态文件所在的文件夹获取,Nginx 就会代为处理,不再麻烦 Django。
用 Django 去获取静态文件是很耗时的,但 Nginx 可以很高效地处理,这就是我们要使用 Nginx 的原因(当然其功能远不止这些)。
Nginx 启动、停止和重启
|
|
或
|
|
启动后,在浏览器输入 IP 地址 47.102.121.213,看到如下页面说明 Nginx 启动成功了。
本地建立 Django 项目
先在本地建立 Django 并测试,在同步到阿里云。
建立 Django 项目
建立 Django 项目,django-admin startproject stanine
,目录结构为
|
|
运行 python manage.py runserver
命令就可以在本机上开启一个 Web 服务器
修改 settings.py
文件
|
|
添加 Django APP,python manage.py startapp stanineapi
,目录结构为
|
|
修改 settings.py
文件,在 INSTALLED_APPS
数组添加 stanineapi
创建 Django 项目数据库模型
编写博客模型代码,修改 stanineapi/models.py
|
|
运行 python manage.py createsuperuser
命令并根据提示创建用户。
迁移数据库
选择数据库版本,这里选择自带的 sqlite3
切换到 manage.py
文件所在的目录下,分别运行 python manage.py makemigrations
和 python manage.py migrate
命令
查看数据库表创建语句,python manage.py sqlmigrate stanineapi 0001
用 Django 的方式操作数据库
存数据
在 manage.py 所在目录下运行 python manage.py shell
命令
|
|
取数据
objects
是我们的模型管理器,它为我们提供一系列从数据库中取数据方法。 all
方法,表示把对应的数据全部取出来,是一个类似于列表的数据结构(QuerySet); get
返回一条记录数据,如有多条记录或者没有记录,get
方法均会抛出相应异常。
|
|
删数据
|
|
重置 migration
若不需要原有的数据库数据
- 删除数据库所有表
- 删除项目的 migration 模块中的所有文件,除了
init.py
- 执行脚本
python manage.py makemigrations
和python manage.py migrate
若不想删除现有的数据库,只想重新建立 migration 文件
- 保证目前的 migration 文件与数据库同步,通过执行
python manage.py makemigrations
,若提示No changes detected
,则可以继续 - 通过执行
python manage.py showmigrations
查看所有 app 及对应的已生效的 migration 文件 - 通过执行
python manage.py migrate --fake stanineapi zero
删除 stanineapi 这个 app 下的 migrations 模块中除了init.py
的所有文件 (程序会再次生成0001_intial.py
之类的文件) - 执行
python manage.py migrate --fake-initial
,在数据库中的 migrations 表中记录当前这个 app 执行到0001_initial.py
视图
绑定 URL 与视图函数
首先 Django 需要知道当用户访问不同的网址时,应该如何处理这些不同的网址(即所说的路由)。Django 的做法是把不同的网址对应的处理函数写在一个 urls.py 文件里,当用户访问某个网址时,Django 就去会这个文件里找,如果找到这个网址,就会调用和它绑定在一起的处理函数(叫做视图函数)。
在 stanineapi
目录下新建 urls.py
,写入
|
|
编写视图函数
Web 服务器的作用就是接收来自用户的 HTTP 请求,根据请求内容作出相应的处理,并把处理结果包装成 HTTP 响应返回给用户
修改 stanineapi/views.py
|
|
配置项目 URL
之前绑定了 URL 和视图函数 index
,但是 Django 并不知道。Django 匹配 URL 模式是在 stanine\ 目录的 urls.py 下的,所以我们要把 stanineapi 应用下的 urls.py 文件包含到 stanine\urls.py 里去。
|
|
运行 python manage.py runserver
,打开浏览器查看效果。
部署 Django
部署前的项目配置
Django 项目中会有一些 CSS、JavaScript 等静态文件,为了能够方便地让 Nginx 处理这些静态文件的请求,可以把项目中的全部静态文件收集到一个统一的目录下。在 settings.py
添加如下配置
|
|
STATIC_ROOT
指明了静态文件的收集目录,即项目根目录(BASE_DIR)下的 static
文件夹。
为了安全起见,在生产环境下需要关闭 DEBUG
选项以及设置允许访问的域名。打开 settings.py
文件,找到 DEBUG
和 ALLOWED_HOSTS
这两个选项,将它们设置成如下的值:
|
|
ALLOWED_HOSTS
是允许访问的域名列表,127.0.0.1 和 localhost 是本地访问的域名。
项目还会依赖一些第三方 Python 库,为了方便在服务器上一次性安装,将全部依赖写入一个叫 requirements.txt 的文本文件中。激活本地的虚拟环境,并进入项目的根目录,运行 pip3 freeze > requirements.txt
命令。这时项目根目录下会生成了一个 requirements.txt
的文本文件,其内容记录了项目的全部依赖。
最后,将代码上传到 GitHub 等代码托管平台。
拉取代码并安装项目依赖
进入到 ~/sites/stanine.top/
目录下,激活虚拟环境,接着从代码仓库把项目代码拉取到 stanine.backend/
路径下。
进入到项目根目录,即 requirements.txt
所在的目录,安装项目的全部依赖
|
|
收集静态文件
虚拟环境下继续运行 python manage.py collectstatic
命令收集静态文件到 static 目录下
|
|
配置 Nginx 并启动服务
配置 Nginx
先在服务器的 /etc/nginx/sites-available/ 目录下新建一个配置文件,文件名一般就设置为域名,api.stanine.top
。写上配置内容
|
|
在 /etc/nginx/sites-available/ 放置了配置文件,而被启用网站的目录在 /etc/nginx/sites-enabled/,需要建立软链
|
|
PS:软链中目标路径必须是绝对路径
启动服务
在项目根目录下,运行 python manage.py runserver
,打开浏览器查看效果,47.102.121.213/admin
可登陆后台。
但是阿里云下线时,服务也会停止。一下命令可在下线情况下,仍然提供服务
|
|
nohup
命令可在注销后运行后台中的程序,&
可以把一个程序放在后台运行。
参考
- 使用 Nginx 和 Gunicorn 部署 Django 博客_追梦人物的博客
- 阿里云服务器从零开始部署博客 | 无趣的小帕
- linux 的 nohup & 和 daemon 总结 (转) - 平和的心 - 博客园
ChangLog
- 2019-04-06 初稿