您的位置:首页 > 运维架构 > Nginx

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

2015-11-14 16:03 1146 查看

阿里云部署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 就可以继续了,耐心等待更新包安装



对比文章标题,大家会发现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 .




命令解释:

- 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

本文主要是由该文章翻译整理而来,向大神致敬。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息