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

安裝Virtualenv

終端下輸入 sudo pip3 install virtualenv virtualenvhtml

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

#建立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.

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

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 gunicornios

配置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項目名,若是有相似以下輸出則說明成功執行: nginx

上面的命令是一個簡單的測試,爲了真正在生產環境下使用Gunicorn,咱們還須要增長一些配置。咱們把這些配置文件寫成一個bash腳本,保存爲bin/gunicorn_start(這裏我是本身的項目代碼文件夾下建立的bin文件夾)django

#!/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 虛擬環境下安裝一次,不然將提示缺失模塊) vim

若是你在上面的過程當中設置了自定義的參數的話,須要將gunicorn_start腳本中對應的參數改過來。其中,worker的數量推薦設置爲2 * CPUs + 1,這樣的話,在任什麼時候候都有一半的worker在作IObash

 

安裝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路徑下面。如沒有則直接建立app

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內核、版本各不相同,不保證能做用於其它人,但大體流程都是差很少,細節上用好搜索引擎相信均可以解決。

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

相關文章
相關標籤/搜索