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

要獲得此過程的實時演示,請瀏覽此 視訊