使用Nginx+Gunicorn+virtualenv+supervisor來部署django項目


安裝Virtualenv

終端下輸入 sudo pip3 install virtualenv virtualenv

可以創建一個擁有自己安裝目錄的環境, 這個環境不與其他虛擬環境共享庫, 能夠方便的管理python版本和管理python庫。 下面是創建python3的虛擬環境

#創建ENV目錄
root@dev:~# cd ~ && mkdir ENV && cd ENV
root@dev:~/ENV# ls
#創建python3虛擬環境,實際路徑要看自己的python3安裝目錄
root@dev:~/ENV# virtualenv -p /usr/local/python3/bin/python3.6 python3
Running virtualenv with interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /root/ENV/python3/bin/python3
Also creating executable in /root/ENV/python3/bin/python
Installing setuptools, pip, wheel...done.

  看到類似這樣的輸出說明虛擬環境我們已經創建成功,下面是使他生效:

root@dev:~/ENV# source python3/bin/activate (python3) root@dev:~/ENV#

  

注意,在虛擬環境生效之后前面會有(python3)的提示,來指示現在所生效的虛擬環境名。 在創建虛擬環境的時候,如果加上--system-site-packages的話會集成系統現有的包。 這樣,虛擬環境就生效了,我們就可以使用pip來安裝包而不會和系統的包發生沖突。 關閉可以使用如下命令來退出現在的虛擬環境:

  

(python3) root@dev:~/ENV# deactivate
root@dev:~/ENV#

  可以看到,在退出之后前面的(python3)就會消失掉。 接下來就是安裝gunicorn和django等包,直接使用pip安裝即可。注意是在之前創建的虛擬環境生效的前提下來安裝。下面會介紹gunicorn。pip install django gunicorn

配置gunicorn

Gunicorn (獨角獸)是一個高效的Python WSGI Server,通常用它來運行 wsgi application(由我們自己編寫遵循WSGI application的編寫規范) 或者 wsgi framework(如Django,Paster),地位相當於Java中的Tomcat。 在我們要部署的Django項目中執行如下命令來嘗試運行: gunicorn DjangoBlog.wsgi:application -b 0.0.0.0:6666 DjangoBlog為要運行的Django項目名,如果有類似如下輸出則說明成功執行: 

上面的命令是一個簡單的測試,為了真正在生產環境下使用Gunicorn,我們還需要增加一些配置。我們把這些配置文件寫成一個bash腳本,保存為bin/gunicorn_start(這里我是自己的項目代碼文件夾下創建的bin文件夾)

#!/bin/bash

NAME="DjangoBlog"
DJANGODIR=/root/test/DjangoBlog #Django project directory
SOCKFILE=/root/test/DjangoBlog/run/gunicorn.sock # we will communicte using this unix socket
USER=root # the user to run as
GROUP=root # the group to run as
NUM_WORKERS=2 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=DjangoBlog.settings # which settings file should Django use
DJANGO_WSGI_MODULE=DjangoBlog.wsgi # WSGI module name

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source /root/ENV/python3/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)
#gunicorn目錄(剛剛創建的虛擬環境的bin目錄中)
exec /root/ENV/python3/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 bin/gunicorn_start 然后就可以嘗試執行這個腳本了: ./bin/gunicorn_start 如果看到類似下面對輸出說明已經成功了: (請注意,項目所需要的所有包與模塊,還有剛剛安裝的gunicorn,都必須在Virtualenv 虛擬環境下安裝一次,否則將提示缺失模塊) 

如果你在上面的過程中設置了自定義的參數的話,需要將gunicorn_start腳本中對應的參數改過來。其中,worker的數量推薦設置為2 * CPUs + 1,這樣的話,在任何時候都有一半的worker在做IO

 

安裝Supervisor

Superviosr是一個進程監管的工具。簡而言之,Superviosr可以保證你的程序在服務器開機時自動啟動以及程序意外終止時重新啟動。通過下面的命令即可安裝:

下載supervior源文件

wget https://pypi.python.org/packages/31/7e/788fc6566211e77c395ea272058eb71299c65cc5e55b6214d479c6c2ec9a/supervisor-3.3.3.tar.gz
tar xvf supervisor-3.3.3.tar.gz 
cd supervisor-3.3.3/
# 由於supervior不支持python3,這里我們暫時退出虛擬環境,使用python2安裝
deactivate
python setup.py install

  

1.Superviosr通過配置文件來設置被監管的程序。一般配置文件都放置在/etc/supervisor/conf.d路徑下面。如沒有則直接創建

mkdir -m 755 -p /etc/supervisor/
mkdir -m 755 conf.d
echo_supervisord_conf > /etc/supervisor/supervisord.conf

  

2.此處我們創建一個名為djaogoblog.conf的配置文件,內容如下:

[program:djangoblog]
    # django項目下,剛剛創建的gunicorn文件路徑
    command = /root/test/DjangoBlog/bin/gunicorn_star  
    user = root
    autostart=true
    autorestart=true
    redirect_stderr = true
    stdout_logfile = /root/logs/blog/robot.log
    stderr_logfile=/root/logs/blog/err.log

  

日志目錄還需要手動創建下: mkdir -p /root/logs/blog,也可以順便把2個文件創建了

3.添加配置文件到主配置文件 打開/etc/supervisor/supervisord.conf 文件,到最后一行可以看到

;[include]
;files = /relative/dictory/*.ini

  

刪除這里的分號,然后添加我們配置文件/etc/supervisor/conf.d/djangoblog.conf,修改后如下

[include]
files = /etc/supervisor/conf.d/djangoblog.conf

  

多個路徑用空格隔開就可以了

4.啟動supervisor

supervisor有兩個命令,supervisord和supervisorctl,通過supervisord管理啟動和配置supervisor本身,通過supervisorctl來管理使用supervisor啟動和管理的自身的一些應用,如我們的這里的app.py
啟動supervisor 用命令
supervisord -c /etc/supervisor/supervisord.conf  
關閉supervisor 用命令
supervisorctl shutdown  
如果先建的djangoblog.conf(控制文件),在使用啟動命令后這些經過配置的程序也會啟動

啟動程序
supervisorctl start program_name  
這里的program的name是配置文件ini中的[program:name],所以這里的program_name是djangoblog

關閉程序
supervisorctl stop program_name  
刷新配置文件 如果啟動后,修改了ini文件,可以通過reload命令來刷新
supervisorctl reload  
查看supervisor的運行狀態
ps -efH|grep supervisor

  

這里提醒一下如果按以上操作出現以下error:

Error: .ini file does not include supervisorctl section  
For help, use /usr/local/bin/supervisorctl -h

  

切換到/etc/supervisor目錄執行以上的命令

執行supervisorctl start APP_NAME 或者執行 supervisorctl 的相關命令,如果出現

unix:///tmp/supervisor.sock no such file

說明 Supervisord 服務還沒有啟動,檢查你的 supervisord.conf 文件最后的注釋 ; 取消,files 路徑沒有問題

[include]
files = ./conf.d/*.ini  ./conf.d/*.conf

  

之后在目錄 /etc/supervisor 下重新運行 supervisord -c /etc/supervisor/supervisord.conf
重新 read 配置文件: supervisorctl reread

重啟服務: supervisorctl reload

關閉服務: supervisorctl shutdown

參考

完成supervisor配置並啟動后,收到監管的Gunicorn會隨之啟動,並運行Django配置好的Django項目,無需單獨啟動Gunicorn

Nginx配置

通過whereis nginx確認你的nginx安裝目錄,以我的/usr/local/nginx/為例

切換到配置文件目錄下

cd /usr/local/nginx/conf/
# 備份配置文件 
cp nginx.conf nginx.conf.cp
# 修改配置文件
vim nginx.conf

  

刪除http{}中的server{}項,添加如下代碼:

upstream djangoblog {
     # 自動生成的gunicorn端口文件位置
    server unix:/root/test/DjangoBlog/run/gunicorn.sock fail_timeout=0;
}

server {

    server_name blog.weibn.me;
    # 你的django項目主目錄
    root /root/test/DjangoBlog;

    listen 80;

    keepalive_timeout 70;
    #access_log /var/log/nginx/django_access.log;
    #error_log /var/log/nginx/django_error.log;

    location /static/ {
          expires max;
          # static目錄
          alias /root/test/DjangoBlogcollectedstatic/;
    }

    location / {
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


        if (!-f $request_filename) {
            proxy_pass http://djangoblog;
            break;
        }
    }

}

  

保存並退出。 由於我的Nginx環境沒有配好,為了確保讀取到此配置文件,圖省事,我在Django項目下創建一個 nginx_start.sh腳本文件:

service nginx stop; cd /usr/local/nginx/sbin/; ./nginx -c /usr/local/nginx/conf/nginx.conf

  

需要重啟nginx時, ./nginx_start.sh 運行腳本即可,同理supervisor也可如此設置,當然這是比較蠢的方法。

完結

到此,整個項目的部署基本完成。由於每個人linux內核、版本各不相同,不保證能作用於其它人,但大致流程都是差不多,細節上用好搜索引擎相信都可以解決。

一年前個人網站的搬運過來一下 - -

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM