使用Gunicorn Ngnx Supervisor部署Django項目
實驗環境:
操作系統: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項目