阿里云从零部署 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 初稿