1. 程式人生 > >使用Gunicorn Ngnx Supervisor部署Django項目

使用Gunicorn Ngnx Supervisor部署Django項目

django gunicorn nginx supervisor linux

Django作為最受歡迎基於Python的Web框架之一,為用戶提供了一個輕量級的測試Server,但這個Server最好不要用於生產環境。那麽如果我們需要在生產環境上面部署Django項目,那麽我們使用什麽環境呢?最早Django推薦使用Apache+mod_wsgi,但現在已經Django的部署方法已對有很多,越來越好,也相對更復雜了,本文將介紹其中一種Django在生產環境的部署方案:Gunicorn+Nginx+Supervisor


實驗環境:

  • 操作系統:CentOS 7

  • Python版本:3.4.8

  • Django版本:2.0.5


準備實驗環境:

因為CentOS 7默認的Python版本為2.7.5,所以我們需要再安裝一個3.4.8的版本。另外我們使用的Django版本為2.0.5,Django 2.x版本只支持Python 3.x的版本,所以我們第一步先安裝3.x版本的Python

yum install python34 python34-pip

接下來再安裝Django

#  此命令表示使用3.4版本的Python來安裝Django,如果直接使用pip install django,默認是使用2.7.5的Python,這樣會提示不支持,無法安裝
python3.4 -m pip install django

安裝Gunicorn

python3.4 -m pip install gunicorn

安裝Nginx

yum install nginx

安裝Supervisor

yum install supervisor


創建Django項目:

# 註意替換ProJectName為自己的項目名,AppName為自己的App名
django-admin startproject ProJectName
cd ProJectName
django-admin startapp AppName


使用Gunicorn測試啟動Django項目:

# 必須進入到項目的目錄再執行下面的命令
cd ProJectName
gunicorn ProJectName.wsgi

啟動成功後輸入大概如下

[2018-05-24 09:50:33 +0800] [22849] [INFO] Starting gunicorn 19.8.1
[2018-05-24 09:50:33 +0800] [22849] [INFO] Listening at: http://127.0.0.1:8000 (22849)
[2018-05-24 09:50:33 +0800] [22849] [INFO] Using worker: sync
[2018-05-24 09:50:33 +0800] [22852] [INFO] Booting worker with pid: 22852

從以上信息我們可以看出項目已經啟動成功,gunicron版本為19.8.1,監聽127.0.0.1:8000端口並且工作在22849號進程,啟動的worker方式為sync,並啟動了一個worker進程,進程號為22852。更多關於workder相關的資料自行查略更多的信息

由上面我們監聽在127.0.0.1,我們客戶端無法訪問,所以我們需要指定監聽端口啟動,把上面的直接Ctrl+c結束,然後執行下面的命令啟動

# 使用-b指定監聽的地址和端口
gunicorn Gogenius.wsgi -b 0.0.0.0:8000


配置Supervisor:

Supervisor主要是用來管理進程的工具,默認安裝好了以後有一個配置文件/etc/supervisord.conf,這是主配置文件。還有一個目錄/etc/supervisord.d,這個目錄一般用來存放我們管理的進程,每個進程一個配置文件,以.ini結尾

創建一個管理Gunicorn的配置文件

touch /etc/supervisord.d/gunicorn.ini

gunicorn.conf的內容為

[program:gunicorn]
directory= /usr/local/ProJectName
command = /usr/bin/gunicorn ProJectName.wsgi -b 127.0.0.1:8000
user = root
autostart= true
autorestart= true
redirect_stderr = true
stdout_logfile = /var/log/gunicorn.log

說明:

  • [program:gunicorn]:其中gunicorn為要管理的子進程名稱,此名稱可以自定義,但最好不要亂寫,與子進程有點關系為好

  • directory:Django項目的根目

  • command:要執行的命令,這裏為啟動子進程的命令,子進程為gunicorn

  • user:指定啟動子進程的用戶

  • autostart :自動啟動,也就是當父親進程啟動的時候,子進程也跟隨啟動。supervisor為父進程

  • autorestart:自動重啟,也就是當子進程掛掉的時候,父進程將會嘗試自動去重啟了進程

  • redirect_stderr:當此選項為true的時候,錯誤日誌也會寫進stdout_logfile中

  • stdout_logfile:定義stdout_logfile路徑

關於更多資料可以參考此鏈接

接下來就是啟動Supervisor

systemctl start supervisord.service
systemctl enable supervisord.service

如果更改過子進程的配置文件,這時候我們只需要reload下我們的Supervisor服務即可,不需要重啟整個服務,這樣會影響其它的服務

supervisorctl reload


配置Nginx轉發:

我們知道我們Django本身就可以作用一個輕量級的Web Server,Django裏面為我們定義了我們html js img css等頁面的存放位置,並且為自動的去找到需要的頁面。但現在我們沒有使用Django本身的Web Server,這時候就需要通過我們Nginx配置代理來讓客戶端請求訪問到對應的頁面,Nginx配置如下:根據自己需求

server {

    listen 5000;

    location / {
        # proxy_pass指定地址為訪問gunicorn地址和端口
        proxy_pass http://127.0.0.1:8000;
        proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }

    location ~.*\.(html|css|js|jpg|json|png|map|\ttf*|\woff2*|\woff*|eot|otf|ttf|json|cur|woff|svg|woff2|m3u8|ts|mp3)$ {
        # root指定Django項目的根目錄
        root /usr/local/Gogenius;
        proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

啟動Nginx

systemctl start nginx
systemctl enable nginx

至此,我們就可以通過Nginx的5000端口訪問我們的Django項目了

使用Gunicorn Ngnx Supervisor部署Django項目