阿里云部署Django项目(超详细图文教程) —— Part2. 使用Nginx, Gunicorn, virtualenv, supervisor 部署Django应用

阿里云部署Django项目(超详细图文教程)

Part2. 使用Nginx, Gunicorn, virtualenv, supervisor 部署Django应用

前言:

花了一个月的空闲时间,终于成功把Django网站部署到了阿里云ECS上,包含以下功能:

  • 不使用任何第三方工具,直接用网页连接阿里云ECS
  • 使用GIT进行源码控制和上传到服务器
  • 使用git hooks实现自动部署
  • 用的是时下比较流行的一套部署方案——Nginx, Gunicorn, virtualenv, supervisor and PostgreSQL
  • 可以在同一台服务器上部署两个、甚至多个网站

光说不练假把式,建议大家边看边操作!

软件介绍

nginx: 反向代理服务器,处理静态资源,负载均衡等。
gunicorn: Python WSGI HTTP Server for UNIX。
virtualenv: 创建独立的 python 环境。
supervisor: 基于linux操作系统的一款服务器管理工具,用以监控服务器的运行,发现问题能立即自动预警及自动重启等功能。

1.系统更新和软件安装

依次在远程管理终端下执行以下步骤,进行服务器系统更新和依赖软件安装:
* 更新系统

 sudo aptitude update
 sudo aptitude upgrade

* 安装数据库PostgreSQL

 sudo aptitude install postgresql postgresql-contrib
 sudo aptitude install libpq-dev python-dev

* 安装virtualenv

 sudo aptitude install python-virtualenv

* 安装Supervisor

 sudo aptitude install supervisor

* 安装Nginx

 sudo aptitude install nginx

PS: 可以使用右上角的“复制命令输入”将命令粘贴进来
这里写图片描述
过程中会提示需要多少的磁盘空间,如果空间够用的话选择 yes 就可以继续了,耐心等待更新包安装
阿里云部署Django项目(超详细图文教程) —— Part2. 使用Nginx, Gunicorn, virtualenv, supervisor 部署Django应用_第1张图片

对比文章标题,大家会发现Gunicorn还没有安装,稍后我们会在创建出的python环境中安装Gunicorn

2. 创建一个权限组来管理应用

出于安全和方便管理的目的,使用专门的用户组来操作web应用

  • 添加用户组
sudo groupadd --system webapps

命令解释:
groupadd 添加用户组
–system 指定将要添加的用户组是系统级别的
webapps 用户组的名字,也可以叫djangoapps等,起名字最好有一定的意义
* 添加用户

 sudo useradd --system --gid webapps --shell /bin/bash --home /webapps/hello_django user_hello_django

命令解释:
useradd 添加用户
–gid 指定用户所属的组,后面紧跟的webapps就指定了用户属于webapps组
–shell 用户使用shell的路径,即/bin/bash
–home 用户home文件夹位置,即/webapps/hello_django,这个目录将是web应用的根目录
user_hello_django 用户名(起名字要有辨识度,最好能自解释)

  • 为用户设置密码

    sudo passwd user_hello_django

  • 给用户添加执行sudo命令的权限

    vim /etc/sudoers

    在root ALL=(ALL:ALL) ALL 下面添加一行:

    user_hello_django ALL=(ALL:ALL) ALL

  • 创建目录并授权

     sudo mkdir -p /webapps/hello_django/
     sudo chown user_hello_django /webapps/hello_django/

命令解释:
mkdir 创建文件夹
chown 改变文件或文件夹的所有者
这几条命令都是linux的基础命令,有疑问可以百度之。

3.创建独立的python运行环境

  • 切换用户

    sudo su - user_hello_django

    注意命令提示符前缀的变化。

  • 进入应用目录

    cd /webapps/hello_django/

  • 创建环境
    virtualenv -p /usr/bin/python3.4 .

阿里云部署Django项目(超详细图文教程) —— Part2. 使用Nginx, Gunicorn, virtualenv, supervisor 部署Django应用_第2张图片
命令解释:
- p /usr/bin/python3.4 表示创建python3.4的运行环境,也可以通过改变参数创建其他python版本的环境
- . 表示当前目录,也可以指定完整路径,如/webapps/hello_django/
* 激活环境
source bin/activate

4.安装Django和Gunicorn

  • 安装
 pip install django
 pip install gunicorn
 pip install psycopg2

这里写图片描述

  • 创建一个Django项目,名称为hello
    django-admin.py startproject hello
  • 验证Django是否正常工作
    cd hello
    python manage.py runserver 112.74.123.69:8000
    命令解释:
    112.74.123.69 为服务器的IP地址,注意替换为自己的

在浏览器中输入112.74.123.69:8000并跳转,看到如下页面表示成功:

5.创建Gunicorn的启动脚本

  • 创建文件/webapps/hello_django/bin/gunicorn_start
cd /webapps/hello_django/bin/
vim gunicorn_start
  • 在vim中编辑文件
    输入i进入编辑模式
    粘贴文本内容
    :w 保存修改
    :q 退出
(...)
NAME="hello_app"                                  # Django应用的名称
DJANGODIR=/webapps/hello_django/hello             # Django 项目的目录
SOCKFILE=/webapps/hello_django/run/gunicorn.sock  
USER=user_hello_django                                        # 用户名
GROUP=webapps                                     # 用户组
NUM_WORKERS=3                                     # 一般是服务器使用CPU的个数X2+1,所以一个CPU的话,worker就是3
DJANGO_SETTINGS_MODULE=hello.settings             # Django应用使用的settings文件
DJANGO_WSGI_MODULE=hello.wsgi                     # WSGI 模块名称
(...)

给文件添加可执行权限
sudo chmod u+x bin/gunicorn_start

6.创建Supervisor配置文件

在/etc/supervisor/conf.d目录下创建文件hello.conf
内容如下:

[program:hello]
command = /webapps/hello_django/bin/gunicorn_start                    #指定启动Django app的命令,也是刚才创建的gunicorn脚本
user = user_hello_django                                                          #用户名
stdout_logfile = /webapps/hello_django/logs/gunicorn_supervisor.log   #运行日志存放位置
redirect_stderr = true                                                #把stderr日志也放在刚才的文件里

注意到日志文件还没有创建,我们来创建一下:

 mkdir -p /webapps/hello_django/logs/
 touch /webapps/hello_django/logs/gunicorn_supervisor.log 

可以使用下面的命令控件Supervisor

sudo supervisorctl reread #修改配置文件后需要使用
sudo supervisorctl update #更新状态,会启动刚配置的应用
sudo supervisorctl status hello #查看应用状态
sudo supervisorctl stop hello #停止应用
sudo supervisorctl start hello #启动应用
sudo supervisorctl restart hello #重启应用

7. 创建Nginx虚拟服务器

在目录/etc/nginx/sites-available下创建hello文件

upstream hello_app_server {
  server unix:/webapps/hello_django/run/gunicorn.sock fail_timeout=0;
}

server {
    listen   80;
    server_name hello.test;

client_max_body_size 4G;

access_log /webapps/hello_django/logs/nginx-access.log;
error_log /webapps/hello_django/logs/nginx-error.log;

location /static/ {
    alias   /webapps/hello_django/static/;
}

location /media/ {
    alias   /webapps/hello_django/media/;
}

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    if (!-f $request_filename) {
        proxy_pass http://hello_app_server;
        break;
    }
}

执行命令进行文件链接
sudo ln -s /etc/nginx/sites-available/hello /etc/nginx/sites-enabled/hello
sudo service nginx restart

命令解释:
ln -s 建立两个文件之间的同步链接,这时/etc/nginx/sites-available/hello和/etc/nginx/sites-enabled/hello的内容将会完全相同,以后要修改的话也只需要修改/sites-available/hello的内容,会自动同步

如果nginx restart 显示 fail, 可以使用sudo nginx -t命令查看失败原因

注意在Django的settings文件中INSTALLED_APPS加入gunicorn

修改内容后:

sudo service nginx restart
sudo supervisorctl restart hello     

参考文章:
Setting up Django with Nginx, Gunicorn, virtualenv, supervisor and PostgreSQL
本文主要是由该文章翻译整理而来,向大神致敬。

你可能感兴趣的:(Django部署)