作者:HelloGitHub-追夢人物
文中涉及的示例代碼,已同步更新到 HelloGitHub-Team 倉庫
<https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial>
博客的基礎(chǔ)功能已經(jīng)開發(fā)的差不多了,雖然還有很多地方可以完善,但我們還是希望早點(diǎn)把博客部署到服務(wù)器上,讓他人可以通過外網(wǎng)訪問。至于有待完善的地方,可以等部署完后一點(diǎn)點(diǎn)地迭代和改進(jìn)?,F(xiàn)在就讓我們來把博客部署到服務(wù)器上吧!
↓↓↓ 視頻在這里 ↓↓↓
作者親自錄制的真機(jī)環(huán)境演示部署全過程,再不成功你打我!
B 站演示(阿里云 CentOS 7 系統(tǒng))觀看地址:https://www.bilibili.com/video/av68020610/
注意:本文的每一個步驟都在真實(shí)環(huán)境下驗(yàn)證無誤。除非你知道自己在做什么,否則建議每一步均嚴(yán)格按照教程的指導(dǎo)來,這樣能保證你順利完成部署。
部署前準(zhǔn)備
我們將使用比較流行的 Nginx + Gunicorn 的方式將 django 開發(fā)的博客部署到自己的服務(wù)器,讓別人能夠通過域名訪問你的博客。至于
Nginx、Gunicorn 是什么暫時放到一邊,讀完本教程后你就會知道它們的作用和使用方法了。
為了部署我們的博客,需要滿足以下兩個條件:
* 最好有一臺可以通過外網(wǎng)訪問的服務(wù)器(如果沒有的話可以在自己的電腦上建一臺虛擬機(jī),通過虛擬 ip 訪問)。
* 最好有一個域名(如果沒有的話,則只能使用 ip 訪問,且不能開啟 HTTPS)。
配置服務(wù)器
本教程使用的本地環(huán)境為 Windows 10,服務(wù)器環(huán)境為 CentOS 7(64 位)。如果你的環(huán)境和我的有所差異(比如
Ubuntu)導(dǎo)致一些命令無法執(zhí)行,將這些命令轉(zhuǎn)換為你所在環(huán)境的命令執(zhí)行即可,重點(diǎn)在于理解每一步的作用,這樣無論在何種環(huán)境你都能成功地完成部署,而不是機(jī)械地復(fù)制粘貼命令。
### 遠(yuǎn)程登錄到服務(wù)器
服務(wù)器通常位于云端,需要使用遠(yuǎn)程登錄工具登錄后才能對服務(wù)器進(jìn)行操作。我使用的是 Xshell,Windows 下百度 Xshell
下載安裝即可,軟件對學(xué)校和個人用戶是免費(fèi)的。
如何遠(yuǎn)程登錄到服務(wù)器這里就不贅述了,相信你參考網(wǎng)上的一些教程肯定能夠順利登錄。假如你和我一樣使用 Xshell 的話,這里有一篇很詳細(xì)的教程可以參考:
教你怎么使用 xshell 遠(yuǎn)程連接 linux 服務(wù)器
<http://jingyan.baidu.com/article/ab69b270b0ca3d2ca7189fdc.html>。
創(chuàng)建一個超級用戶
順利連接到遠(yuǎn)程服務(wù)器了,如果是一臺全新服務(wù)器的話,通常我們是以 root 用戶登錄的。在 root 下部署代碼不夠安全,最好是建一個新用戶(如果你已經(jīng)以非
root 用戶登錄的話可以跳過這一步)。下面的一些列命令將創(chuàng)建一個擁有超級權(quán)限的新用戶(把 yangxg 替換成你自己想要的用戶名,我這里取我的名字拼音
yangxg):
# 在 root 用戶下運(yùn)行這條命令創(chuàng)建一個新用戶,yangxg 是用戶名 # 因?yàn)槲医袟顚W(xué)光,所以我取的用戶名是 yangxg #
選擇一個你喜歡的用戶名,不一定非得和我的相同 root@server:~# adduser yangxg # 為新用戶設(shè)置密碼 #
注意在輸密碼的時候不會有字符顯示,不要以為鍵盤壞了,正常輸入即可 root@server:~# passwd yangxg # 把新創(chuàng)建的用戶加入超級權(quán)限組
root@server:~# usermod -aG wheel yangxg # 切換到創(chuàng)建的新用戶 root@server:~# su - yangxg
# 切換成功,@符號前面已經(jīng)是新用戶名而不是 root 了 yangxg@server:$
新用戶創(chuàng)建并切換成功了。如果是新服務(wù)器的話,最好先更新一下系統(tǒng),避免因?yàn)榘姹咎f而給后面安裝軟件帶來麻煩。運(yùn)行下面的兩條命令:
yangxg@server:$ sudo yum update yangxg@server:$ sudo yum upgrade
更新 SQLite3
為了方便,我們博客使用了 SQLite3 數(shù)據(jù)庫,django 2.2 要求 SQLite3 數(shù)據(jù)庫版本在 3.8.3 以上,而 CentOS 7
系統(tǒng)自帶版本低于 django 2.2 所要求的最低版本,所以首先來更新 SQLite3 的版本。
注意
有可能你使用的服務(wù)器系統(tǒng)發(fā)行版 SQLite3 已經(jīng)高于 3.8.3,這一步就可以跳過。如何查看 SQLite3 的版本呢?請執(zhí)行 sqlite3
--version
首先登陸到 sqlite 的官方下載地址 <https://sqlite.org/download.html>
,查看最新發(fā)布的版本,截止到本教程完成時,其最新版本為 3.29.0,找到該版本的源碼壓縮包,復(fù)制其下載鏈接,然后通過 wget
命令下載到服務(wù)器(我一般習(xí)慣將源碼放在 ~/src 目錄下。)
# 創(chuàng)建 src 目錄并進(jìn)到這個目錄 yangxg@server:$ mkdir -p ~/src yangxg@server:$ cd ~/src #
下載 sqlite3 源碼并解壓安裝 yangxg@server:$ wget
https://sqlite.org/2019/sqlite-autoconf-3290000.tar.gz yangxg@server:$ tar zxvf
sqlite-autoconf-3290000.tar.gz yangxg@server:$ cd sqlite-autoconf-3290000
yangxg@server:$ ./configure yangxg@server:$ make yangxg@server:$ sudo make
install
小貼士:
如果 wget 命令不存在,使用 sudo yum install -y wget 安裝即可。
至此 SQLite3 更新完畢,接下來安裝 Python3。
安裝 Python3 和 Pipenv
CentOS 7 自帶的 Python 發(fā)行版為 2.7,因此需要安裝 Python3,為了兼容性,我們安裝 Python 3.6.4。
首先安裝可能的依賴:
yangxg@server:$ sudo yum install -y openssl-devel bzip2-devel expat-devel
gdbm-devel readline-devel sqlite-devel
然后下載 Python 3.6.4 的源碼并解壓:
yangxg@server:$ cd ~/src yangxg@server:$ wget
https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz yangxg@server:$ tar
-zxvf Python-3.6.4.tgz
最后編譯安裝:
yangxg@server:$ cd Python-3.6.4 yangxg@server:$ ./configure
LD_RUN_PATH=/usr/local/lib LDFLAGS="-L/usr/local/lib"
CPPFLAGS="-I/usr/local/include" yangxg@server:$ make LD_RUN_PATH=/usr/local/lib
yangxg@server:$ sudo make install
注意這里安裝 Python 時,Python 會依賴 SQLite3 的庫,所以在 configure 時通過 LD_RUN_PATH
指定依賴的搜索目錄(因?yàn)槲覀冎案铝?SQLite3 的版本,指定依賴搜索目錄確保使用新的 SQLite3 依賴庫),另外兩個參數(shù)作用類似。
然后輸入 python3.6 -V 和 pip3.6 -V 命令測試安裝結(jié)果,輸出版本號說明安裝成功了。
有了 pip,就可以安裝 Pipenv 了:
yangxg@server:$ sudo pip3.6 install pipenv
小貼士:
如果以上命令報錯,可能是因?yàn)?pip3.6 安裝在當(dāng)前用戶的 bin 路徑下(/usr/local/bin/),使用 pip3.6 install
pipenv --users 命令也把 Pipenv 安裝到當(dāng)前用戶的 bin 路徑下就可以了。
部署代碼
接下來開始準(zhǔn)備部署代碼,讓我們的博客應(yīng)用在服務(wù)上跑起來,這和在本地開發(fā)時的過程是一模一樣的。不過為了將應(yīng)用部署到服務(wù)器上,我們首先要對項(xiàng)目做一點(diǎn)配置,打開
settings.py,找到ALLOWED_HOSTS,將其修改為:
blogproject/settings.py ALLOWED_HOSTS = ['127.0.0.1', 'localhost ',
'.zmrenwu.com']
指定了 ALLOWED_HOSTS 的值后,django 將只允許通過指定的域名訪問我們的應(yīng)用,比如這里只允許通過 127.0.0.1,localhost
以及 zmrenwu.com 和其任意子域名(域名前加一個點(diǎn)表示允許訪問該域名下的子域名)訪問(即 HTTP 報文頭部中 Host
的值必須是以上指定的域名,通常你在瀏覽器輸入域名訪問網(wǎng)站時,Host 的值就會被設(shè)置為網(wǎng)站的域名),這樣可以避免 HTTP Host 頭攻擊。
Django 項(xiàng)目中會有一些 CSS、JavaScript 等靜態(tài)文件,為了能夠方便地讓 Nginx
處理這些靜態(tài)文件的請求,我們把項(xiàng)目中的全部靜態(tài)文件收集到一個統(tǒng)一的目錄下,這個目錄通常位于 django 項(xiàng)目的根目錄,并且命名為
static。為了完成這些任務(wù),需要在項(xiàng)目的配置文件里做一些必要的配置:
blogproject/settings.py # 其他配置... STATIC_URL = '/static/' # 加入下面的配置
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_ROOT 即指定靜態(tài)文件的收集路徑,這里指定為 BASE_DIR(項(xiàng)目根目錄,在 settings.py 文件起始處定義)下的 static
文件夾。
現(xiàn)在的關(guān)鍵是把代碼傳到服務(wù)器上來了,這里我們使用 git。首先安裝 git:
yangxg@server:$ sudo yum install -y git
將代碼上傳到 GitHub 等代碼托管平臺,這樣我們就可以方便地把代碼拉取到服務(wù)器了。Git 和 GitHub
的使用相信你已經(jīng)很熟悉了,這里就不贅述過程。如果不知道如何使用地話可以自行百度相關(guān)教程。注意數(shù)據(jù)庫文件不要上傳!
我通常喜歡把應(yīng)用代碼放在 ~/apps/ 目錄下,先來設(shè)置一下服務(wù)器的文件結(jié)構(gòu),用于存放應(yīng)用代碼等相關(guān)文件:
# 在用戶目錄下創(chuàng)建 apps 目錄并進(jìn)入 yangxg@server:$ mkdir -p ~/apps yangxg@server:$ cd
~/apps # 拉取博客代碼 yangxg@server:$ git clone
https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial.git
然后進(jìn)入到項(xiàng)目根目錄,安裝項(xiàng)目依賴:
yangxg@server:$ cd ~/apps/HelloDjango-blog-tutorial yangxg@server:$ pipenv
install --deploy --ignore-pipfile
這里指定 --deploy 參數(shù),Pipenv 將只會安裝 Pipfile 中 [packages]
下指定的依賴。因?yàn)槲覀儸F(xiàn)在是在線上環(huán)境進(jìn)行部署,僅用于開發(fā)環(huán)境的相關(guān)依賴我們并不需要。
--ignore-pipfile 將會使 Pipenv 從 Pipfile.lock 文件中安裝項(xiàng)目依賴。Pipfile.lock
記錄了項(xiàng)目依賴的精確信息,從這里讀取依賴信息能夠確保依賴信息被無意中修改或者破壞而使得運(yùn)行環(huán)境因?yàn)橐蕾嚢木壒食霈F(xiàn)不可預(yù)料的問題。
Pipenv 會自動幫我們創(chuàng)建虛擬環(huán)境,然后將項(xiàng)目依賴安裝到虛擬環(huán)境下。
然后創(chuàng)建一下數(shù)據(jù)庫:
yangxg@server:$ pipenv run python manage.py migrate
啟動開發(fā)服務(wù)器:
yangxg@server:$ pipenv run python manage.py runserver 0.0.0.0:8000
這里我們啟動開發(fā)服務(wù)器時指定了服務(wù)器運(yùn)行的 ip 和端口,這將允許通過公網(wǎng) ip 的 8000 端口訪問我們的博客。
訪問 ip:8000,可以看到訪問成功(其中 ip 為你服務(wù)器的公網(wǎng) ip)。
使用 Gunicorn
Django 官方文檔強(qiáng)調(diào)使用 runserver 開啟的開發(fā)服務(wù)器僅用于開發(fā)測試,不建議用于生產(chǎn)環(huán)境。所以我們使用流行的 Gunicorn
來啟動可以用于線上環(huán)境的服務(wù)器。
首先進(jìn)入到項(xiàng)目根目錄,安裝 Gunicorn:
yangxg@server:$ pipenv install gunicorn
由于我們在服務(wù)端修改安裝了 gunicorn,代碼中 Pipfile 文件和 Pipfile.lock
文件會被更新,因此別忘了把改動同步到本地,具體做法可以自行學(xué)習(xí),以下是一個參考:
# 服務(wù)端提交代碼 yangxg@server:$ git add Pipfile Pipfile.lock yangxg@server:$ git
commit -m "add gunicorn dependency" yangxg@server:$ git push # 本地拉取代碼 git pull
回到線上服務(wù)器,在項(xiàng)目根目錄,執(zhí)行下面的命令啟動服務(wù):
yangxg@server:$ pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b
0.0.0.0:8000
來解釋一下各個參數(shù)的含義。
`-w 2 表示啟動 2 個 worker 用于處理請求(一個 worker 可以理解為一個進(jìn)程),通常將 worker 數(shù)目設(shè)置為 CPU 核心數(shù)的
2-4 倍。
-k gthread 指定每個 worker 處理請求的方式,根據(jù)大家的實(shí)踐,指定為 gthread 的異步模式能獲取比較高的性能,因此我們采用這種模式。
-b 0.0.0.0:8000,將服務(wù)綁定到 8000 端口,運(yùn)行通過公網(wǎng) ip 和 8000 端口訪問應(yīng)用。
訪問 ip:8000(ip 為你服務(wù)器的公網(wǎng) ip),應(yīng)用成功訪問了,但是我們看到樣式完全亂了。別急,這不是 bug!此前我們使用 django
自帶的開發(fā)服務(wù)器,它會自動幫我們處理靜態(tài)樣式文件,但是 Gunicorn 并不會幫我們這么做。因?yàn)樘幚盱o態(tài)文件并不是 Gunicorn
所擅長的事,應(yīng)該將它交給更加專業(yè)的服務(wù)應(yīng)用來做,比如 Nginx。
啟動 Nginx 服務(wù)器
Nginx (engine x) 是一個高性能的 HTTP 和反向代理 web
服務(wù)器,它的功能非常多,這里我們主要用它來處理靜態(tài)文件以及將非靜態(tài)文件的請求反向代理給 Gunicorn。
當(dāng)我們訪問一個博客文章詳情頁面時,服務(wù)器會接收到下面兩種請求:
* 顯示文章的詳情信息,這些信息通常保存在數(shù)據(jù)庫里,因此需要調(diào)用數(shù)據(jù)庫獲取數(shù)據(jù)。
* 圖片、css、js 等存在服務(wù)器某個文件夾下的靜態(tài)文件。
對于前一種請求,博客文章的數(shù)據(jù)需要借助 django 從數(shù)據(jù)庫中獲取,Nginx 處理不了,它就會把這個請求轉(zhuǎn)發(fā)給 運(yùn)行在 Gunicorn 服務(wù)中的
django 應(yīng)用,讓 django 去處理。而對于后一種靜態(tài)文件的請求,只需要去這些靜態(tài)文件所在的文件夾獲取,Nginx 就會代為處理,不再麻煩
django。
用 django 去獲取靜態(tài)文件是很耗時的,但 Nginx 可以很高效地處理,這就是我們要使用 Nginx 的原因。
首先安裝 Nginx:
yangxg@server:$ sudo yum install epel-release -y yangxg@server:$ sudo yum
install nginx -y
運(yùn)行下面的命令啟動 Nginx 服務(wù):
yangxg@server:$ sudo systemctl start nginx
在瀏覽器輸入 ip(不輸入端口則默認(rèn)為 80 端口,Nginx 默認(rèn)在 80 端口監(jiān)聽請求),看到 Nginx 的歡迎界面說明 Nginx 啟動成功了。
配置 Nginx
Nginx 的配置位于 /etc/nginx/nginx.conf 文件中,你可以打開這個文件看看里面的內(nèi)容,下面是一些關(guān)鍵性的配置:
user nobody nobody; ... http { # Load modular configuration files from the
/etc/nginx/conf.d directory. # See
http://nginx.org/en/docs/ngx_core_module.html#include # for more information.
include /etc/nginx/conf.d/*.conf; server { listen 80 default_server; listen
[::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load
configuration files for the default server block. include
/etc/nginx/default.d/*.conf; location / { } } }
首先是這個 user 配置,用于指定 Nginx
進(jìn)程運(yùn)行時的用戶和組(分別為第一個和第二個參數(shù)),為了防止可能的權(quán)限問題,我們改成當(dāng)前系統(tǒng)用戶(我的用戶名是 yangxg,所屬組
yangxg,記得改成你自己服務(wù)器中運(yùn)行的用戶和組,修改完后記得保存文件內(nèi)容):
user yangxg yangxg;
然后在 http 配置下有一個 server 模塊,server 模塊用于配置一個虛擬服務(wù),使這個虛擬服務(wù)監(jiān)聽指定的端口和域名。你可以配置多個
server,這樣就會啟動多個虛擬服務(wù),用于監(jiān)聽不同端口,或者是同一個端口,但是不同的域名,這樣你就可以在同一服務(wù)器部署多個 web 應(yīng)用了。
這個 server 的配置我們下面會詳細(xì)講解,再來看看 server 下的 include,include
會將指定路徑中配置文件包含進(jìn)來,這樣便于配置的模塊化管理,例如我們可以把不同 web 應(yīng)用的配置放到 /etc/nginx/conf.d/ 目錄下,這樣
nginx 會把這個目錄下所有以 .conf 結(jié)尾的文件內(nèi)容包含到 nginx.conf 的配置中來,而無需把所有配置都堆到 nginx.conf
中,使得配置文件十分臃腫。
我們來配置博客應(yīng)用,上面說了,為了模塊化管理,我們將配置寫到 /etc/nginx/conf.d/ 目錄下。先在服務(wù)器的 conf.d
目錄下新建一個配置文件,我把它叫做 HelloDjango-blog-tutorial.conf。寫入下面的配置內(nèi)容:
server { charset utf-8; listen 80; server_name
hellodjango-blog-tutorial-demo.zmrenwu.com; location /static { alias
/home/yangxg/apps/HelloDjango-blog-tutorial/static; } location / {
proxy_set_header Host $host; proxy_pass http://127.0.0.1:8000; } }
首先我們配置了一個虛擬服務(wù),編碼方式為 utf-8,監(jiān)聽于 80 端口。
服務(wù)的域名為 hellodjango-blog-tutorial-demo.zmrenwu.com,所以來自這個域名的請求都會被這個服務(wù)所處理。
所有URL 匹配 /static 的請求均由 Nginx 處理,alias 指明了靜態(tài)文件的存放目錄,這樣 Nginx
就可以在這個目錄下找到請求的文件返回給客戶端。
其它請求轉(zhuǎn)發(fā)給運(yùn)行在本機(jī) 8000 端口的應(yīng)用程序處理,我們會在這個端口啟動 Gunicorn 用于處理 Nginx 轉(zhuǎn)發(fā)過來的請求。
重啟 nginx 使得配置生效:
yangxg@server:$ sudo systemctl restart nginx
關(guān)閉 DEBUG 模式,收集靜態(tài)文件
開發(fā)環(huán)境下,django 為了調(diào)試方便,會將 settings.py 文件中的 DEBUG 選項(xiàng)配置為
True,這樣如果程序運(yùn)行出錯,調(diào)試信息將一覽無余,這在開發(fā)時很方便,但部署到線上就會帶來巨大安全隱患,所以我們把 DEBUG 選項(xiàng)設(shè)置為
False,關(guān)閉調(diào)試模式,在本地將 settings.py 中的 DEBUG 為:
DEBUG=False
線上服務(wù)器更新最新的代碼,然后運(yùn)行命令收集靜態(tài)文件到之前配置的 STATIC_ROOT 目錄下:
yangxg@server:$ pipenv run python manage.py collectstatic
然后使用 Gunicorn 啟動服務(wù)。
yangxg@server:$ pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b
127.0.0.1:8000
現(xiàn)在,訪問配置的域名 hellodjango-blog-tutorial-demo.zmrenwu.com(改成你自己在 Nginx
中配置的域名),可以看到博客成功部署!
管理 Gunicorn 進(jìn)程
現(xiàn)在 Gunicorn 是我們手工啟動的,一旦我們退出 shell,服務(wù)器就關(guān)閉了,博客無法訪問。就算在后臺啟動
Gunicorn,萬一哪天服務(wù)器崩潰重啟了又得重新登錄服務(wù)器去啟動,非常麻煩。為此使用 Supervisor 來管理 Gunicorn
進(jìn)程,這樣當(dāng)服務(wù)器重新啟動或者 Gunicorn 進(jìn)程意外崩潰后,Supervisor 會幫我們自動重啟 Gunicorn。
先按 Ctrl + C 停止剛才啟動的 Gunicorn 服務(wù)進(jìn)程。
首先安裝 Supervisor 注意這里使用的是系統(tǒng)自帶的 pip2,因?yàn)榻刂帘窘坛虝鴮憰r Supervisor 還不支持
Python3,不過這并不影響使用。
yangxg@server:$ pip install supervisor
為了方便,我一般會設(shè)置如下的目錄結(jié)構(gòu)(位于 ~/etc 目錄下)來管理 Supervisor 有關(guān)的文件:
~/etc ├── supervisor │?? ├── conf.d │?? └── var │?? ├── log └──
supervisord.conf
其中 supervisord.conf 是 Supervior 的配置文件,它會包含 conf.d 下的配置。var 目錄下用于存放一些經(jīng)常變動的文件,例如
socket 文件,pid 文件,log 下則存放日志文件。
首先來建立上述的目錄結(jié)構(gòu):
yangxg@server:$ mkdir -p ~/etc/supervisor/conf.d yangxg@server:$ mkdir -p
~/etc/supervisor/var/log
然后進(jìn)入 ~/etc 目錄下生成 Supervisor 的配置文件:
yangxg@server:$ cd ~/etc yangxg@server:$ echo_supervisord_conf >
supervisord.conf
修改 supervisor.conf,讓 Supervisor 進(jìn)程產(chǎn)生的一些文件生成到上面我們創(chuàng)建的目錄下,而不是其默認(rèn)指定的地方。
首先找到 [unix_http_server] 版塊,將 file 設(shè)置改為如下的值:
[unix_http_server] file=/home/yangxg/etc/supervisor/var/supervisor.sock
即讓 socket 文件生成在 ~/etc/supervisor/var/ 目錄下。注意 supervisor 不支持將 ~ 展開為用戶 home
目錄,所以要用絕對路徑指定。
類似的修改 [supervisord] 板塊下的 logfile 和 pidfile 文件的路徑,還有 user 改為系統(tǒng)用戶,這樣 supervisor
啟動的進(jìn)程將以系統(tǒng)用戶運(yùn)行,避免可能的權(quán)限問題:
logfile=/home/yangxg/etc/supervisor/var/log/supervisord.log
pidfile=/home/yangxg/etc/supervisor/var/supervisord.pid user=yangxg
還有 [supervisorctl] 板塊下:
serverurl=unix:///home/yangxg/etc/supervisor/var/supervisor.sock
[include] 版塊,將 /home/yangxg/etc/supervisor/conf.d/ 目錄下所有以 .ini
結(jié)尾的文件內(nèi)容包含到配置中來,這樣便于配置的模塊化管理,和之前 Nginx 配置文件的處理方式是類似的。
files = /home/yangxg/etc/supervisor/conf.d/*.ini
然后我們到 conf.d 新建我們博客應(yīng)用的配置:
[program:hellodjango-blog-tutorial] command=pipenv run gunicorn
blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000
directory=/home/yangxg/apps/HelloDjango-blog-tutorial autostart=true
autorestart=unexpected user=yangxg
stdout_logfile=/home/yangxg/etc/supervisor/var/log/hellodjango-blog-tutorial-stdout.log
stderr_logfile=/home/yangxg/etc/supervisor/var/log/hellodjango-blog-tutorial-stderr.log
說一下各項(xiàng)配置的含義:
[program:hellodjango-blog-tutorial] 指明運(yùn)行應(yīng)用的進(jìn)程,名為 hellodjango-blog-tutorial。
*
command 為進(jìn)程啟動時執(zhí)行的命令。
*
directory 指定執(zhí)行命令時所在的目錄。
*
autostart 隨 Supervisor 啟動自動啟動進(jìn)程。
*
autorestart 進(jìn)程意外退出時重啟。
*
user 進(jìn)程運(yùn)行的用戶,防止權(quán)限問題。
*
stdout_logfile,stderr_logfile 日志輸出文件。
啟動 Supervisor
yangxg@server:$ supervisord -c ~/etc/supervisord.conf
-c 指定 Supervisr 啟動時的配置文件。
進(jìn)入 supervisorctl 進(jìn)程管理控制臺:
yangxg@server:$ supervisorctl -c ~/etc/supervisord.conf
執(zhí)行 update 命令更新配置文件并啟動應(yīng)用。
瀏覽器輸入域名,可以看到服務(wù)已經(jīng)正常啟動了。
使用 CDN 加快 Bootstrap 和 jQuery 的加載速度
我們的項(xiàng)目使用了 Bootstrap 和
jQuery,這兩個文件我們是從本地加載的。如果服務(wù)器性能比較差的話,加載需要耗費(fèi)很長的時間,網(wǎng)站打開的速度就變得無法忍受。我們使用 CDN
來加快加載速度。具體來說,替換 base.html 的幾個靜態(tài)文件的加載標(biāo)簽:
base.html - <link rel="stylesheet" href="{% static
'blog/css/bootstrap.min.css' %}"> - <script src="{% static
'blog/js/jquery-2.1.3.min.js' %}"></script> - <script src="{% static
'blog/js/bootstrap.min.js' %}"></script> + <link
href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
rel="stylesheet"> + <script
src="https://cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script> + <script
src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
本地修改代碼后,將代碼同步到線上服務(wù)器,執(zhí)行下面的命令重啟 hellodjango-blog-tutorial 應(yīng)用進(jìn)程:
yangxg@server:$ supervisorctl -c ~/etc/supervisord.conf restart
hellodjango-blog-tutorial
這樣網(wǎng)站訪問的速度將大大提升!
總結(jié)
部署步驟很多且繁雜,因?yàn)槊總€環(huán)境都不一樣,因此部署是最容易出錯的步驟,一定要搞清楚每一步的作用,這樣在遇到問題時,才能針對性地去解決,如果只知道一味地復(fù)制粘貼命令,而不知道自己在干嘛,那么一旦出錯將束手無策。
部署過程自動化
在整個部署過程中我們運(yùn)行了十幾條命令,手動輸入了 N 個字符。如果每次更新代碼都要遠(yuǎn)程連接到服務(wù)器執(zhí)行這些命令的話將變得非常麻煩。接下來的教程我們將介紹使用
Fabric 自動化整個部署過程。寫好部署腳本后,只需要執(zhí)行一條命令,就可以非常方便地自動完成整個部署。
『講解開源項(xiàng)目系列』
——讓對開源項(xiàng)目感興趣的人不再畏懼、讓開源項(xiàng)目的發(fā)起者不再孤單。跟著我們的文章,你會發(fā)現(xiàn)編程的樂趣、使用和發(fā)現(xiàn)參與開源項(xiàng)目如此簡單。歡迎留言聯(lián)系我們、加入我們,讓更多人愛上開源、貢獻(xiàn)開源~
熱門工具 換一換