从零开始部署一个python项目

部署前准备

  • 服务器:在Vultr上租用的VPS(Virtual Private Server 虚拟专用服务器),VPS将一台服务器分割成多个虚拟专享服务器,实现VPS的技术分为容器技术和虚拟化技术 。在容器或虚拟机中,每个VPS都可分配独立公网IP地址、独立操作系统、实现不同VPS间磁盘空间、内存、CPU资源、进程和系统配置的隔离,为用户和应用程序模拟出“独占”使用计算资源的体验。VPS可以像独立服务器一样,重装操作系统,安装程序,单独重启服务器。VPS为使用者提供了管理配置的自由,可用于企业虚拟化,也可以用于IDC资源租用。VPS主机以最大化的效率共享硬件、软件许可证以及管理资源。每个VPS主机都可分配独立公网IP地址、独立操作系统、独立超大空间、独立内存、独立CPU资源、独立执行程序和独立系统配置等. VPS主机用户除了可以分配多个虚拟主机及无限企业邮箱外, 更具有独立主机功能, 可自行安装程序,单独重启主机。从零开始部署一个python项目_第1张图片
  • 域名:namesilo上购买的域名。

环境工具说明

  • 本地环境为 Windows 10,服务器环境为 ubuntu 16.04(64 位)
  • 远程登录到服务,服务器通常位于云端,需要使用远程登录工具登录后才能对服务器进行操作。我使用的是 Xshell,Windows 下使用xshell远程连接linux服务器。

环境配置

创建非root新用户:

# 在 root 用户下运行这条命令创建一个新用户newuser
root@localhost:~# useradd -m -s /bin/bash newuser
# 把新创建的用户加入超级权限组
root@localhost:~# usermod -a -G sudo newuser
# 为新用户设置密码
root@localhost:~# passwd newuser
# 切换到创建的新用户
root@localhost:~# su - newuser
# 切换成功
newuser@localhost:~$

新服务器更新系统

newuser@localhost:~$ sudo apt-get update
newuser@localhost:~$ sudo apt-get upgrade
  • 出现的问题
  1. 执行sudo apt-get update出现以下问题
The following packages have been kept back:
  linux-generic linux-headers-generic linux-image-generic ubuntu-minimal
0 upgraded, 0 newly installed, 0 to remove and 4 not upgraded.

因为有部份packages的安装版比release版新,解决方法是统一更新到发布的版本,这条apt-get -u dist-upgrade命令会强制更新软件包到最新版本,并自动解决缺少的依赖包。

  1. sudo apt-get updateupgrade的区别

在ubuntu下,我们维护一个源列表,源列表里面都是一些网址信息,这每一条网址就是一个源,这个地址指向的数据标识着这台源服务器上有哪些软件可以安装使用。 在这个文件里加入或者注释(加#)掉一些源后,保存。这时候,我们的源列表里指向的软件就会增加或减少一部分。

sudo vim /etc/apt/sources.list

这个命令,会访问源列表里的每个网址,并读取软件列表,然后保存在本地电脑。我们在新软件包管理器里看到的软件列表,都是通过update命令更新的。

sudo apt-get update

这个命令,会把本地已安装的软件,与刚下载的软件列表里对应软件进行对比,如果发现已安装的软件版本太低,就会提示你更新。如果你的软件都是最新版本,会提示:

sudo apt-get upgrade
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。
  • 总而言之,update是更新软件列表,upgrade是更新软件。

安装所需软件

sudo apt-get install nginx
sudo apt-get install git python3 python3-pip
sudo pip3 install virtualenv

启动nginx服务

  • 关于nginx作用详细说明,这篇有详细介绍
sudo service nginx start
  • 在浏览器输入域名,可以看到 Nginx 启动成功的页面。

部署代码

项目配置

  1. 在生产环境下需要关闭 DEBUG 选项以及设置允许访问的域名。打开 settings.py 文件,找到 DEBUG 和 ALLOWED_HOSTS 这两个选项,将它们设置成如下的值:
blogproject/settings.py
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', '.knows365.com']

ALLOWED_HOSTS 是允许访问的域名列表,127.0.0.1 和 localhost 是本地访问的域名,.knows365.com 是访问服务器的域名。域名前加一个点表示允许访问该域名下的子域名,比如 www.knows365.com、test.knows365.com 等二级域名同样允许访问。如果不加前面的点则只允许访问 knows365.com。

  1. 将项目中一些 CSS、JavaScript 等静态文件收集到一个统一的目录下,即项目根目录(BASE_DIR)下的 static 文件夹。为了能够方便地让 Nginx 处理这些静态文件的请求。
STATIC_URL = '/static/'
# 加入下面的配置
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  1. 需要把静态文件目录加入到mysite\urls.py
    从零开始部署一个python项目_第2张图片
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

上传代码

  1. 记录项目的全部依赖
(mooc_project)..\mooc-project> pip freeze > requirements.txt
  1. ..\mooc-project\requirements.txt会生成
Django==2.1.7
jieba==0.39
PyMySQL==0.9.3
pytz==2018.9
  1. push到github库

设置服务器目录结构

  1. ~相当于/home/nweuser
mkdir -p ~/sites/knows365  #mkdir:建立一个子目录。参数:-p 确保目录名称存在,如果目录不存在的就新创建一个。
cd ~/sites/knows365
virtualenv --python=python3 env  #使用 --python=python3 来指定创建 Python3 的虚拟环境
git clone https://github.com/MorsoLi/mooc-project.git
  1. 现在的目录结构
/home/nweuser/
   sites/
        knows365/
            env/
            mooc-project/

安装依赖项

source env/bin/activate  #激活虚拟环境
cd mooc-project   #进入项目目录
pip install -r requirements.txt #安装项目依赖

收集静态文件

mkdir static
python manage.py collectstatic
  • 注意:如果使用Django默认数据库sqlite3,可以直接执行以下命令生成数据库,其他数据库必须先配置(这里以MySQL为例进行了说明)后才行
python manage.py migrate    #生成数据库
python manage.py createsuperuser  #创建超级用户进入 Django 管理后台

配置 Nginx

  • 关于nginx各个字段作用详细说明,这篇有详细介绍
    从零开始部署一个python项目_第3张图片
  • 添加链接,把这个配置文件加入到启用的网站列表中去
sudo ln -s /etc/nginx/sites-available/knows365 /etc/nginx/sites-enabled/knows365

使用 Gunicorn

  • Gunicorn是一个被广泛使用的高性能的Python WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork worker模式,具有使用非常简单,轻量级的资源消耗,以及高性能等特点。具体看这篇介绍。
  • 再次切回到虚拟环境
(env)morso@vultr:~/sites/knows365$ source env/bin/activate
(env)morso@vultr:~/sites/knows365/mooc-project$ pip install gunicorn  #安装Gunicorn
(env)../$ gunicorn --bind unix:/tmp/knows365.socket mysite.wsgi:application
  • 执行完就可以愉快的访问自己的网站了!?

进阶:ubuntu16.04自动系统启动gunicorn

  • 每次都手动启动gunicorn太大笨蛋了,可以写一个自启动脚本,这样当服务器重新启动后,脚本会帮我们重启 Gunicorn。
  1. 新建自启动的服务文件
sudo mkdir -p /usr/lib/systemd/system     #新建目录
sudo vim /usr/lib/systemd/system/knows365.service   #新建文件
  1. 文件内容
[Unit]
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
# 你的用户
User=morso
# 你的目录
WorkingDirectory=/home/morso/sites/knows365/mooc-project
# gunicorn启动命令
ExecStart=/home/morso/sites/knows365/env/bin/gunicorn --bind unix:/tmp/knows365.com.socket mysite.wsgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo systemctl start knows365  #启动服务,和knows365.service这个脚本同名
sudo systemctl enable knows365.service  #添加服务到开机自动运行
ps -ef | grep gunicorn  #查看进程
  1. 当代码或者配置文件修改时有变化时,运行下面的命令重新加载
systemctl daemon-reload
sudo systemctl start knows365   #重启gunicore配置的服务脚本 knows365.service
sudo service nginx reload  #重新加载nginx

你可能感兴趣的:(Django)