Django 部署说明。Linux 上的 Nginx Gunicorn Supervisor(Ubuntu)

三个基本工具。

  1. nginx - 免费,开源,高性能 HTTP 服务器和反向代理,具有高性能;
  2. gunicorn - ‘Green Unicorn’是用于 UNIX 的 Python WSGI HTTP 服务器(需要管理你的服务器);
  3. supervisor - 一个客户端/服务器系统,允许其用户监视和控制类 UNIX 操作系统上的许多进程。在应用程序或系统崩溃时使用,重新启动 django / celery / celery cam 等;

为了简单起见,让我们假设你的应用程序位于此目录中:/home/root/app/src/我们将使用 root 用户(但你应该为你的应用创建单独的用户)。我们的虚拟环境也将位于/home/root/app/env/路径中。

NGINX

让我们从 nginx 开始吧。如果 nginx 尚未在计算机上,请使用 sudo apt-get install nginx 进行安装。稍后,你必须在 nginx 目录/etc/nginx/sites-enabled/yourapp.conf 中创建一个新的配置文件。如果有一个名为 default.conf 的文件 - 将其删除。

bellow 代码到 nginx conf 文件,它将尝试使用套接字文件运行你的服务; 稍后将有一个 gunicorn 的配置。此处使用套接字文件在 nginx 和 gunicorn 之间进行通信。它也可以使用端口完成。

# your application name; can be whatever you want
upstream yourappname {
    server        unix:/home/root/app/src/gunicorn.sock fail_timeout=0;
}

server {
    # root folder of your application
    root        /home/root/app/src/;
 
    listen        80;
    # server name, your main domain, all subdomains and specific subdomains
    server_name   yourdomain.com *.yourdomain.com somesubdomain.yourdomain.com
 
    charset       utf-8;

    client_max_body_size                        100m;
 
    # place where logs will be stored;
    # folder and files have to be already located there, nginx will not create
    access_log        /home/root/app/src/logs/nginx-access.log; 
    error_log         /home/root/app/src/logs/nginx-error.log;
    
    # this is where your app is served (gunicorn upstream above)
    location / {
        uwsgi_pass  yourappname;
        include     uwsgi_params; 
    }

    # static files folder, I assume they will be used
    location /static/ {
        alias         /home/root/app/src/static/;
    }
 
    # media files folder
    location /media/ {
        alias         /home/root/app/src/media/;
    }

}

GUNICORN

现在我们的 GUNICORN 脚本,它将负责在服务器上运行 django 应用程序。首先是用 pip install gunicorn 在虚拟环境中安装 gunicorn。

#!/bin/bash

ME="root"
DJANGODIR=/home/root/app/src # django app dir
SOCKFILE=/home/root/app/src/gunicorn.sock # your sock file - do not create it manually
USER=root
GROUP=webapps
NUM_WORKERS=3 
DJANGO_SETTINGS_MODULE=yourapp.yoursettings
DJANGO_WSGI_MODULE=yourapp.wsgi  
echo "Starting $NAME as `whoami`"
 
# Activate the virtual environment
cd $DJANGODIR

source /home/root/app/env/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 Gunicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec /home/root/app/env/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name root \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --bind=unix:$SOCKFILE \
  --log-level=debug \
  --log-file=-

为了能够运行 gunicorn 启动脚本,它必须启用执行模式

sudo chmod u+x /home/root/app/src/gunicorn_start

现在,你只需使用 ./gunicorn_start 即可启动你的 gunicorn 服务器

SUPERVISOR

正如开头所说,我们希望我们的应用程序在主管失败时重新启动。如果主管尚未在服务器上安装 sudo apt-get install supervisor

首先安装主管。然后在主目录/etc/supervisor/conf.d/your_conf_file.conf 中创建一个 .conf 文件

配置文件内容:

[program:yourappname]
command = /home/root/app/src/gunicorn_start
user = root
stdout_logfile = /home/root/app/src/logs/gunicorn_supervisor.log
redirect_stderr = true

快速简介,[program:youappname] 在开始时是必需的,它将是我们的标识符。stdout_logfile 也是一个存储日志的文件,包括访问和错误。

完成后我们必须告诉我们的主管我们刚刚添加了新的配置文件。要做到这一点,不同的 Ubuntu 版本有不同的过程。

对于 Ubuntu version 14.04 or lesser 而言,只需运行以下命令:

sudo supervisorctl reread - >重新读取管理程序目录中的所有配置文件,这应该打印出来: yourappname:available

sudo supervisorctl update - >更新主管新添加的配置文件; 应打印出 yourappname:添加进程组

对于 Ubuntu 16.04 运行:

sudo service supervisor restart

并且为了检查你的应用程序是否正常运行,请运行

sudo supervisorctl status yourappname

这应该显示:

yourappname RUNNING pid 18020, uptime 0:00:50

要获得此过程的实时演示,请浏览此 视频