基於centos的Django+gunicorn+ngixn應用部署

準備工作----所需軟件安裝

  • 準備服務器,可以購買騰訊雲、百度雲、華爲雲等,本次部署採用了百度雲,具體購買可以到官網去看看,很簡單,這步就略過了;
  • 服務器準備以後就需要在上面安裝所需的一些軟件,這裏用的是centos的,首先自帶的python環境是2.7的,不滿足本次部署需要,如果使用django2.0以上,建議安裝python3; mysql、python3、virualen、superviosr將單獨列一篇安裝教程,下列非必須的爲不一定要安裝的;
  • 安裝mysql 參考 基於docker快速安裝mysql教程
  • 安裝python3
  • 安裝Virtualen(非必須)
  • nginx
  • superviosr
  • git(非必須)
 yum -y install git 
  • gevent(非必須)
pip install gevent  
  • 安裝gunicorn
pip install gunicorn

上傳與下載代碼

通常來說我們可以使用ftp、sftp等方式將代碼上傳到Linux上,但是這樣做不太有利於版本的控制,只適用於自己玩玩的小項目,在此使用git進行代碼管理,藉此機會也在此溫習一下git的一些命令。

部署與配置

1.確保django setting裏的必要設置都已完成

DEBUG = False# 生產部署必須設置爲False

#這裏請設置爲自己的域名,沒有域名暫時設置爲自己服務器ip
ALLOWED_HOSTS = ['www.happyhong.cn',"127.0.0.1"]
STATIC_URL = '/static/'
#STATIC_ROOT=os.path.join(BASE_DIR,"static/")#錯誤
#如果不設置STATIC_ROOT,當你在執行python manage.py collectstatic會遇到以下報錯
#django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the #STATIC_ROOT setting to a filesystem path.
STATIC_ROOT=os.path.join(BASE_DIR,"/static/")#正確
STATICFILES_DIRS  = (
    os.path.join(BASE_DIR,"static"),
                )
再提一下,必須設置STATIC_ROOT,否則會報:

django.core.exceptions.ImproperlyConfigured: You’re using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.

2.設置好以後就可以執行python manage.py collectstatic命令(請在manag.py所在目錄下執行)
在這裏插入圖片描述
在這目錄下執行,一般不建議root用戶來部署,我這裏主要是圖省事了
執行完以後應該會有一個admin目錄和一個自己的目錄,這些就代表執行成功了~~
在這裏插入圖片描述
前面軟件安裝中我們已經成功安裝gunicorn了,這裏我們就可以先試一下是否能正常啓動:
還是在剛纔的目錄執行:

gunicorn -w 3 -b 127.0.0.1:8080 blog.wsgi:application
這裏要說明一下**blog.wsgi:application**,blog需要改爲你的項目名稱,application是固定參數不用變。

在這裏插入圖片描述
如果有這樣的輸出則證明啓動成功,其中有個gevent不用管,這是我後來安裝的。可以在瀏覽器中輸入你的ip訪問一下應該是能成功的,但是css和js樣式應該是沒有的,接下來就要依靠nginx進行處理了;

3.啓動、配置nginx
假設到現在你的nginx已經安裝完畢,我的nginx目錄是在**/usr/local/nginx/sbin** ,看一下這個路徑下有什麼,
在這裏插入圖片描述
我們可以在這裏目錄下使用:

./nginx

啓動nginx,然後使用輸入

ps -ef|grep nginx

命令進行查看nginx進程:
如果看到這樣的進程說明可以正常啓動。在這裏插入圖片描述
或者也可以直接在瀏覽器輸入 你的域名(或者ip):80,如果頁面上有nginx關鍵字就說明啓動成功,這裏不再貼圖。
接下來我們開始配置nginx配置文件:

cd /usr/local/nginx/conf
ls -l

然後使用ls -l命令查看,應該有一個nginx.conf的文件,我們再使用命令將原來默認配置文件進行備份。

cp nginx.conf nginx.conf.bak

在這裏插入圖片描述
vi nginx.conf

user root;#如果使用的root用戶一定要加,否則會報沒有權限的錯誤,其它用戶可加

#event也必須加上
events {
    worker_connections  1024;
}
http{
	#下面兩行看情況加上,如果前端console報Resource interpreted as Stylesheet but transferred with MIME type text/plain;
	#則需要加上才能避免
    include       mime.types;
    default_type  application/octet-stream;
    
server{
    listen 80;#監聽的端口不需要改
    server_name www.happyhong.cn;#這裏可換成你的域名或者ip
    location / {
      proxy_pass http://127.0.0.1:8080;#不用改
      proxy_set_header Host $host;#
      proxy_set_header X-Real-IP $remote_addr;#獲取遠程ip
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
    location /static {
      alias /root/www/blog/static/;#要有最後的斜杆
    }
}
}

接下來讓nginx重新載入配置文件:

/usr/local/nginx/sbin/nginx -s reload 

nginx配置結束。

4.配置gunicorn
gunicorn最好還是以配置文件的形式進行啓動,因爲gunicorn是python進行開發的,所以我們可以在項目根目錄下(也就是與menage.py同級的)創建一個gunicorn.py的文件,vi gunicorn.py

#!/usr/bin/env python
#導入庫
import multiprocessing
#得到cpu個數
cpu_count = multiprocessing.cpu_count()
#必須,綁定等於gunicorn -w 3 -b 127.0.0.1:8080 blog.wsgi:application中的 -b
bind="127.0.0.1:8080"

backlog=64
#必須,進程個數等於gunicorn -w 3 -b 127.0.0.1:8080 blog.wsgi:application中的 -w
worker=cpu_count*2+1

#這裏我採用了“gevent”,可以實現更高的併發,安裝也很簡單,pip install  gevent即可
worker_class="gevent"

#線程數,可選
threads=3

worker_connections=500

#超時時間,建議加上,一般我們個人用的服務器配置都一般,響應時間可能會比正常得要高
timeout=60

keepalive=2

#啓動之前切換到的目錄,改爲你自己的項目目錄
chdir="/root/www/blog"

#這個建議設爲False,因爲我們後面要用superviosr進行管理,如果這項爲True會導致superviosr啓動gunicorn報錯
daemon=False

#日誌目錄,可有可無,因爲nginx的日誌已經差不多滿足了
accesslog="/var/log/gunicorn/access.log"
#日誌格式h:遠程ip l:- m:請求方法....
access_log_format = '%(h)s %(l)s %(m)s %(u)s %(t)s %(l)s %(s)s %(a)s'
#可有可無
errorlog="/var/log/gunicorn/error.log"
#日誌等級,可有可無
loglevel="info"

如果你不想手動敲只需將上面的內容複製然後目錄改爲自己的就行。
這樣我們就可以將gunicorn用配置文件啓動,再嘗試啓動之前我們先將原本的gunicorn進程殺掉,使用命令

pkill -f gunicorn

,可以用ps -ef|grep gunicorn確認是否殺掉,如果有沒有殺掉的可用:

kill -9 進程id

,然後我們可以使用這個命令嘗試使用配置文件啓動gunicorn(依然是在項目根目錄下進行執行),

gunicorn -c gunicorn.py blog.wsgi:application

更加安全的方法是加上gunicorn的路徑,例如:

/root/virtlen/py3/bin/gunicorn -c gunicorn.py blog.wsgi:application

我的是裝在virtlen中的,強烈建議使用virtualen進行管理,如果你跟我一樣使用了virtualen,那還需要加上虛擬環境的python路徑:

/root/virtlen/py3/bin/python   /root/virtlen/py3/bin/gunicorn -c gunicorn.py blog.wsgi:application
命令分爲三部分:
/root/virtlen/py3/bin/python:python路徑   
 /root/virtlen/py3/bin/gunicorn:gunicorn路徑
 -c gunicorn.py:參數

注意python路徑和gunicorn路徑中的空格,這樣做能避免很多不必要的報錯,例如找不到路徑等等。至此,gunicorn配置部分結束。

5.supervisor管理gunicorn
假設你的superviosr已經按照步驟安裝完畢,接下來需要在supervisor配置文件路徑下新建一個gunicorn.ini的文件,我的路徑是在 /var/local/super/conf,這個路徑下專門存放supervisor的應用配置文件。

vi gunicorn.ini
#program是固定的,gunicorn是你取得名字,我們一會需要利用這個名字啓動應用
[program:gunicorn]
#這個命令剛纔上面解釋過了
command=/root/virtlen/py3/bin/python /root/virtlen/py3/bin/gunicorn -c gunicorn.py blog.wsgi:application
#啓動應用的目錄
directory=/root/www/blog
#啓動應用的用戶
user=root
#自動重啓
autorestart=true
#重啓次數
startretires=3
redirect_stderr=true
stderr_logfile=/var/local/super/log/error.log
stdout_logfile=/var/local/super/log/out.log                                         

接下來查看superviosr是否正常啓動了,如果啓動了則使用命令進行配置文件更新,

supervisorctl update

這個命令對配置沒有更新的進程並沒有影響;然後使用

supervisorctl

進入superviosr客戶端,輸入status即可查看當前運行的進程:
在這裏插入圖片描述
這裏我的gunicorn是運行RUNNING狀態,當然如果是第一次啓動肯定是stopped的,這時候執行start gunicorn命令即可將gunicorn啓動(記得執行之前先將gunicorn停止),如果報 Exited too quickly (process log may have details)錯,可以去查看日誌或者看看是不是gunicorn.py裏的deamon爲Flase沒有改。

結束

到此你可以在瀏覽器中輸入你的域名或者ip:port訪問你的網址了,如果還有錯誤請將錯誤貼在評論裏,最後再厚顏無恥的替自己網站打個廣告:從今天開始種樹,歡迎大家批評指正,軟件安裝稍後會更新。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章