準備工作----所需軟件安裝
- 準備服務器,可以購買騰訊雲、百度雲、華爲雲等,本次部署採用了百度雲,具體購買可以到官網去看看,很簡單,這步就略過了;
- 服務器準備以後就需要在上面安裝所需的一些軟件,這裏用的是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訪問你的網址了,如果還有錯誤請將錯誤貼在評論裏,最後再厚顏無恥的替自己網站打個廣告:從今天開始種樹,歡迎大家批評指正,軟件安裝稍後會更新。。