Django的部署记录:Nginx+Gunicorn+virtualenv+supervisor+PostgreSQL

手记,以免下次配置再入坑。有些细节未做详细描述,如果有问题,可以评论或私信我。

前期准备

你需要一个你拥有root权限的server。下面的教程是基于Ubuntu 的。

更新系统

首先确保系统处于最新的状态

sudo apt-get update 

PostgreSQL(可选)

见我上一文章专门介绍

https://blog.csdn.net/z_yong_cool/article/details/78649429


创建一个运行账户

为了避免万一web应用被攻击以后带来不受控制的后果,我们一般会单独为web应用创建一个权限受限的用户来运行这个web应用。例如我们这里为我们的django应用创建一个名为webapps的用户,并将其归入webapps这个组。

sudo groupadd --system webapps

sudo useradd --system --gid webapps --shell /bin/bash --home /data/django_work_src webapps

virtualenv

Virtualenv是一个Python虚拟环境管理的工具,所谓虚拟环境就是讲你Web应用所需要的python环境从系统的python环境中独立出来,这使得你可以在不同的应用中使用不同版本的第三方库。详情见我上面的文章

你的Django应用创建一个python环境

这里我将django应用放在了/data/django_work_src 这个路径下面,如果你偏好/var/wwwsrv或者其他的路径也可以。首先在这个目录下面创建/data/django_work_src/文件夹来存储应用,并将这个文件夹的owner设置为上面我们创建的运行账户webapps

sudo chown webapps /data/django_work_src/

切换到 webapps 用户并创建虚拟环境

弄完过后,把项目测试跑起来看看

************************************************************************************************************

为Django配置PostgreSQL

Django默认的新工程使用的是SQLite3作为数据库的,这个数据库的性能不足以支持生产环境下的数据库应用。我们这里采用PostgreSQL来做为我们的Django项目的数据库。为了让Django能够使用PostgreSQL,我们需要将psycopg2安装到虚拟环境。

pip install psycopg2


Gunicorn

在实际生产环境中我们不会使用Django的单线程开发服务器。这里我们使用Gunicorn.

通过pip来安装Gunicorn

pip install gunicorn 

安装好以后你可以尝试用Gunicorn来运行Django了

nohup gunicorn com_e3si.wsgi:application -b 0.0.0.0:8000&

上面的命令是一个简单的测试,为了真正在生产环境下使用Gunicorn,我们还需要增加一些配置。

我们把这些配置文件写成一个bash脚本,保存为gunicorn_start.sh

#!/bin/bash

NAME="com_e3si" # Name of the application
DJANGODIR=/data/django_work_src/com_e3si # Django project directory
SOCKFILE=/data/django_work_src/com_e3si/run/gunicorn.sock # we will communicte using this unix socket
USER=webapps # the user to run as
GROUP=webapps # the group to run as
NUM_WORKERS=3 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=com_e3si.settings # which settings file should Django use
DJANGO_WSGI_MODULE=com_e3si.wsgi # WSGI module name

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source /data/virtualenvs/com_e3si/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec /data/virtualenvs/com_e3si/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=debug \
--log-file=-
将这个文件改成可执行模式

sudo chmod u+x gunicorn_start.sh 

执行试下

这里有可能会报错:gunicorn.sock failed (13: Permission denied)  upstream。。。。。

这是因为NGINUX没权限读取.sock流文件,解决办法是修改 

/etc/nginx/nginx.conf

让nginx以webapps用户运行

logger_class: gunicorn.glogging.Logger

[2018-06-17 01:17:47 +0000] [1931] [INFO] Starting gunicorn 19.8.1

[2018-06-17 01:17:47 +0000] [1931] [DEBUG] Arbiter booted

[2018-06-17 01:17:47 +0000] [1931] [INFO] Listening at: unix:/data/django_work_src/com_e3si/run/gunicorn.sock (1931)

[2018-06-17 01:17:47 +0000] [1931] [INFO] Using worker: sync

[2018-06-17 01:17:47 +0000] [1940] [INFO] Booting worker with pid: 1940

[2018-06-17 01:17:47 +0000] [1942] [INFO] Booting worker with pid: 1942

[2018-06-17 01:17:47 +0000] [1944] [INFO] Booting worker with pid: 1944

[2018-06-17 01:17:47 +0000] [1931] [DEBUG] 3 workers



^C[2018-06-17 01:19:24 +0000] [1931] [INFO] Handling signal: int

[2018-06-17 01:19:24 +0000] [1944] [INFO] Worker exiting (pid: 1944)

[2018-06-17 01:19:24 +0000] [1940] [INFO] Worker exiting (pid: 1940)

[2018-06-17 01:19:24 +0000] [1942] [INFO] Worker exiting (pid: 1942)

[2018-06-17 01:19:24 +0000] [1931] [INFO] Shutting down: Master


OK!

Nginx

安装Nginx同样非常简单:

sudo apt-get install nginx

sudo service nginx start

为Django创建一个虚拟server配置

每个Nginx的虚拟server都由/etc/nginx/sites-available路径下的一个配置文件来表示。

而将其链接到的/etc/nginx/sites-enabled路径下则可以启用对应的站点。

为我们的Django应用创建一个配置文件/etc/nginx/sites-available/com.e3si. 文件内容如下:

upstream com_e3si_app_server {

        server unix:/data/django_work_src/com_e3si/run/gunicorn.sock fail_timeout=0;

}


server {


        listen 80;

        server_name e3si.com www.e3si.com;


        client_max_body_size 4G;


        access_log /data/django_work_src/com_e3si/logs/nginx-access.log;

        error_log /data/django_work_src/com_e3si/logs/nginx-error.log;


        location /static/ {

                alias /data/django_work_src/com_e3si/;

        }


        location /media/ {

                alias /data/django_work_src/com_e3si/static/;

        }


        location / {

                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                proxy_set_header Host $http_host;

                proxy_redirect off;

               

                proxy_pass http://com_e3si_app_server;

        }


# Error pages

        error_page 500 502 503 504 /500.html;

        location = /500.html {

        root /data/django_work_src/com_e3si;

        }

}

将这个文件链接到 site-enabled 文件夹下:

sudo ln -s /etc/nginx/sites-available/com.e3si /etc/nginx/sites-enabled/com.e3si

然后重启nginx

Supervisor

Superviosr是一个进程监管的工具。简而言之,Superviosr可以保证你的程序在服务器开机时自动启动以及程序意外终止时重新启动。通过下面的命令即可安装:

sudo apt-get install supervisor

Superviosr通过配置文件来设置被监管的程序。一般配置文件都放置在 /etc/supervisor/conf.d 路径下面。

vi /etc/supervisor/conf.d/com_e3si.conf

内容如下:

[program:com_e3si]

command = /data/django_work_src/com_e3si/gunicorn_start.sh

user = webapps

autostart=true

autorestart=true

stdout_logfile = /data/django_work_src/com_e3si/logs/gunicorn_supervisor.log

redirect_stderr = true

environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8


设置好上面的文件以后,我们可以通过supervisorctl工具来启用这些设置了:

sudo supervisorctl reread 

sudo supervisorctl update

现在可以start,stop或者restart你的进程了

sudo supervisorctl restart com_e3si

com_e3si: stopped

com_e3si: started






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值