DJango部署 Gunicorn+Nginx+Django+supervisor+Virtualenv

weixin_34391445發表於2017-09-15

這兩天部署了一下自己寫的django blog 記錄一下備忘

  • 系統:Ubuntu 16.04.2

  • 部署方案:Gunicorn+Nginx+Django+supervisor+Virtualenv

  • virtualenv 建立一個python3環境用於執行django blog


1.安裝相關軟體

apt-get install nginx                            //安裝nginx

systemctl enable nginx                     //設定nginx開機自啟動

apt-getinstall python3 python3-pip    //安裝python3和PIP

python3-m pip install virtualenv         //安裝virtualenv

2.建立專案環境

mkdir  /django                                        //dango相關主目錄

mkdir  /django/site                                 //用來放網站檔案

mkdir  /django/env                                //用來放虛擬環境目錄

建立虛擬環境

cd/django/env

virtualenv --python=python3 django               //這個用來跑django專案

3.拉取django專案檔案並安裝專案依賴

cd/django/site

git cloneXXXXXXXX(你的專案git倉庫地址)                        //拉取專案

cd  Django-project(你的Django專案)

source /django/env/django/bin/activate                                 //啟用虛擬環境

pip install -r requirements                                //安裝專案依賴這步不懂的自行百度pip

安裝完畢依賴後

python manager.py runserver                       //測試一下專案和環境在本機能正常訪問127.0.0.1:8000表示正常

pip install gunicorn                                           //在虛擬環境下安裝gunicorn

pip install gevent//在虛擬環境下安裝gevent

4.django相關配置

配置專案settings.py

INSTALLED_APPS下新增gunicorn

DEBUG= False               //關閉除錯模式

ALLOWED_HOSTS= ['*']                  //我直接設成所有了也可以根據自己需要設定

STATIC_ROOT= os.path.join(BASE_DIR, 'static')              //設定靜態檔案目錄

python manage.py collectstatic               //收集靜態檔案(在django虛擬環境下執行)

5.測試gunicorn

使用gunicorn替換runserver啟動django

啟用虛擬環境切換到Django專案根目錄

gunicorn --worker-class=gevent blogprject.wsgi:application

//blogprject就是你的專案名稱內有setting.py和wsgi.py的那個資料夾的名字

無報錯,能正常訪問127.0.0.1:8000表示成功

預設用的是8000埠 如果要在一臺伺服器上部署多個網站可以指定別的埠

-b 127.0.0.1:8080       這個引數可以指定別的埠

6.配置 nginx

vim /etc/nginx/sites-available/default //ubuntu下是這個配置檔案(記得先備份)其他系統一般是 /etc/nginx/nginx.conf

server {

listen   80;

        server_name 127.0.0.1:8000;
        access_log  /var/log/nginx/django.log;

        location / {
                proxy_pass http://127.0.0.1:8000;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /static/ {                                          #靜態檔案引用所有url中帶static的都指向下面的目錄
                root /django/site/Django-project;       #Django專案所在目錄
        }

        location /media/ {                                         #同上這個檔案我的專案中是放圖片和頭像的
                root /django/site/Django-project;
        }

}

測試 先開啟nginx 再執行 gunicorn 後 訪問伺服器外網IP 能正常訪問--正常

7.配置 supervisor

守護程式 作用自行百度我的理解 就是 保證 gunicorn 程式一直存在 方便啟動和停止
superisor 不支援python3 不過不影響使用

apt-get install python-pip                //安裝python2下的pip ubuntu自帶python2.7
pip install supervisor                             //直接在ubuntu中安裝 不是虛擬環境
echo_supervisord_conf > supervisor.conf                   //建立配置檔案
vim supervisor.conf                                                                            //編輯配置檔案

啟用web頁面對比一下原配置檔案去掉冒號就行了


7929840-20317997a6190ed6.png
image.png
7929840-5f07665d170911da.png
image.png

配置要守護的程式 gunirorn


7929840-cb45719eff78324e.png
image.png

說明:/django/env/django/bin/gunicorn 是虛擬目錄django的路徑

supervisor操作

• supervisord -c supervisor.conf //啟動supervisor程式
• supervisorctl //進入互動式介面 輸使用者名稱密碼(預設 user/123 配置檔案裡有)
• status //檢視APP狀態

7929840-dba40dcfe0ff4d17.png
image.png

• start all start django //啟動所有app或者啟動指定
• stop 同上
• 測試 能否通過 supervisor 啟動或停止 gunicron

設定supervisor開機自啟動

建立啟動檔案 vim /lib/systemd/system/supervisord.service

[Unit]

Description=Process Monitoring and Control Daemon

After=rc-local.service


[Service]

Type=forking

ExecStart=/usr/local/bin/supervisord -c /django/supervisor.conf               //   /django/supervisor.conf配置檔案的路徑最好使用絕對路徑

SysVStartPriority=99


[Install]

WantedBy=multi-user.target

systemctl stop supervisord.service
systemctl start supervisord.service
測試能都通過上述命令 停止和啟動 supervisor 如果可以表示成功
systemctl enable supervisord.service 設定開機自啟動因為在 配置檔案中已經開啟了 gunicron app 隨supervisor啟動後自啟
確保nginx也是開機自啟動後,嘗試 reboot 系統
如重啟後能正常訪問頁面表示成功!!

使用 Fabric

還可以使用 fabric 進一步自動化部署
更新伺服器上程式碼的步驟一般有這麼幾個吧?

  • 到github上下載更新的程式碼
git pull    # 抓取github上最新的程式碼
git checkout . && git clean -xdf     #上一步可能會失敗 執行該命令丟棄本地所有未提交的程式碼後重試
  • 安裝最新的依賴庫
pip install -r requirements.txt
  • 檢查一下setting.py 檔案中伺服器部署相關配置還在不在
  • 重新收集一下靜態檔案
  • 重新啟動 gunicorn或supervisor
  • 重新啟動 nginx
    最少也要上面j幾個步驟吧?如果每次更新都這樣來一遍頁很麻煩吧?

所以該 Fabric 這個神器出場啦。。。。

相關文章