Django 部署说明。Linux 上的 Nginx Gunicorn Supervisor(Ubuntu)
三个基本工具。
- nginx - 免费,开源,高性能 HTTP 服务器和反向代理,具有高性能;
- gunicorn - ‘Green Unicorn’是用于 UNIX 的 Python WSGI HTTP 服务器(需要管理你的服务器);
- 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
要获得此过程的实时演示,请浏览此 视频 。