我的 Django 博客項(xiàng)目是部署在阿里云 ECS 服務(wù)器上面的,服務(wù)器的系統(tǒng)是64位的 Ubuntu 16.04 系統(tǒng),部署的方式是使用 Nginx + Gunicorn 實(shí)現(xiàn),數(shù)據(jù)使用的是 MySQL。部署其實(shí)是一個(gè)大坑,我在部署的過(guò)程中也是踩過(guò)很多坑,所以這篇文章就來(lái)介紹一下我的項(xiàng)目的完整部署過(guò)程,希望看到的人能少走彎路。
項(xiàng)目準(zhǔn)備
首先需要把自己本地的項(xiàng)目放到服務(wù)器上面來(lái),我使用的是 Github 克隆項(xiàng)目,這種從代碼庫(kù)克隆的方式是比較推薦的,因?yàn)榭梢猿掷m(xù)的使用 pull 來(lái)讓服務(wù)器上面的項(xiàng)目保持跟代碼倉(cāng)庫(kù)中同步。Github 的安裝、配置和使用這里省略,如果需要請(qǐng)自行去查閱相關(guān)資料完成操作。
從 Github 上克隆項(xiàng)目
選擇一個(gè)放置項(xiàng)目的文件夾,比如我把項(xiàng)目統(tǒng)一放在了自己的一個(gè)用戶(hù)的根目錄下面,這個(gè)目錄的路徑是 /home/alex
于是可以切換到當(dāng)前用戶(hù)的目錄下克隆項(xiàng)目:
~$ git clone git@github.com:Hopetree/izone.git tendcode
上面這句 git 的命令是意思是將 izone.git 這個(gè)項(xiàng)目克隆到本地并命名為 tendcode,當(dāng)然,項(xiàng)目的名稱(chēng)你可以按照自己的喜歡去命名。
創(chuàng)建一個(gè)虛擬環(huán)境
項(xiàng)目移植成功了,我們還需要來(lái)移植一個(gè)單獨(dú)給項(xiàng)目使用的環(huán)境,所以需要使用虛擬環(huán)境。虛擬環(huán)境的安裝和配置操作方式這里也不做說(shuō)明,這里只介紹創(chuàng)建虛擬環(huán)境的過(guò)程。
我雖然在本地的 Windows 上面一直使用的 virtualenvwrapper 來(lái)操作虛擬環(huán)境,但是在服務(wù)器上面還是比較喜歡直接使用 virtualenv,這里就來(lái)以這種創(chuàng)建虛擬環(huán)境的方式說(shuō)明。
在當(dāng)前用戶(hù)根目錄(跟剛才克隆項(xiàng)目同目錄)下創(chuàng)建一個(gè)虛擬環(huán)境 izone_env,使用如下命令:
~$ virtualenv izone_env
此時(shí)當(dāng)前目錄的結(jié)構(gòu)是這樣的:
/home/alex/tendcode
/home/alex/izone_env
復(fù)制虛擬環(huán)境
虛擬環(huán)境雖然已經(jīng)創(chuàng)建,但是環(huán)境中還沒(méi)有安裝項(xiàng)目的依賴(lài),所以現(xiàn)在要根據(jù)項(xiàng)目的依賴(lài)文件去安裝依賴(lài)。
首先在當(dāng)前用戶(hù)目錄下使用如下命令進(jìn)入虛擬環(huán)境:
~$ source izone_env/bin/activate
然后將當(dāng)前目錄切換到你的項(xiàng)目的依賴(lài)文件 requirements.txt 的目錄下,比如我的項(xiàng)目的依賴(lài)文件就在項(xiàng)目的一級(jí)目錄下面,比如它的地址是這樣的:
/home/alex/tendcode/requirements.txt
那么此時(shí)應(yīng)該切換到這樣:
(izone_env) ~$ cd tendcode
然后使用如下命令安裝依賴(lài):
(izone_env) ~$ pip install -r requirements.txt
此時(shí),項(xiàng)目的基本運(yùn)行條件已經(jīng)準(zhǔn)備好了,下面開(kāi)始運(yùn)行項(xiàng)目。
項(xiàng)目運(yùn)行
在部署項(xiàng)目之前,先要保證項(xiàng)目在服務(wù)器上面能夠正常運(yùn)行,這是最起碼的條件。
補(bǔ)充項(xiàng)目缺少的文件
這一步驟并不是一定需要的,這取決于你的項(xiàng)目。由于我的項(xiàng)目上傳到 Github 上之前有忽略掉一個(gè)個(gè)人信息項(xiàng)目的配置文件,所以需要在克隆項(xiàng)目之后在服務(wù)器自行創(chuàng)建一份。比如我的博客項(xiàng)目中需要單獨(dú)創(chuàng)建的是跟 settings.py 同級(jí)目錄下面的一個(gè) base_settings.py 文件,文件的具體內(nèi)容可以查看我 Github 項(xiàng)目中的說(shuō)明。如果你的項(xiàng)目不需要補(bǔ)充文件,可以跳過(guò)這一步。
創(chuàng)建數(shù)據(jù)庫(kù)
如果項(xiàng)目同樣適用的是 MySQL 數(shù)據(jù)庫(kù)的話,在項(xiàng)目運(yùn)行之前需要先創(chuàng)建數(shù)據(jù)庫(kù),比如我的項(xiàng)目中指定了數(shù)據(jù)庫(kù)的基本信息,我創(chuàng)建數(shù)據(jù)庫(kù)(進(jìn)入mysql命令行下)的命令如下:
mysql > CREATE DATABASE `tendcode` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
這句命令的意思是創(chuàng)建一個(gè)名稱(chēng)為 tendcode 的數(shù)據(jù)庫(kù),并且將數(shù)據(jù)庫(kù)的編碼設(shè)定為 utf8mb4,這個(gè)按照自己的項(xiàng)目需求去創(chuàng)建即可。
遷移數(shù)據(jù)庫(kù)
現(xiàn)在可以按照 Django 項(xiàng)目的數(shù)據(jù)庫(kù)遷移步驟來(lái)操作了,當(dāng)然,下面的操作都是在虛擬環(huán)境中進(jìn)行的。
1、創(chuàng)建數(shù)據(jù)遷移,命令如下:
(izone_env) ~/tendcode$ python manage.py makemigrations
(izone_env) ~/tendcode$ python manage.py migrate
2、創(chuàng)建管理員賬號(hào):
(izone_env) ~/tendcode$ python manage.py createsuperuser
3、靜態(tài)文件的收集:
(izone_env) ~/tendcode$ python manage.py collectstatic
啟動(dòng)項(xiàng)目
(izone_env) ~/tendcode$ python manage.py runserver 0.0.0.1:8000
如果你的服務(wù)器上面的8000端口開(kāi)啟了,那么可以訪問(wèn)你的服務(wù)器 IP 地址的8000端口看看項(xiàng)目是否正常運(yùn)行:
http://server_domain_or_IP:8000
到這里順便說(shuō)一下,由于我的項(xiàng)目是有域名的,所以在項(xiàng)目中要先添加自己的域名,就像這樣:
ALLOWED_HOSTS = ['127.0.0.1', 'localhost', '.tendcode.com']
開(kāi)始部署
安裝和配置 Gunicorn
1、首先需要在虛擬環(huán)境中安裝 Gunicorn:
(izone_env) ~/tendcode$ pip install gunicorn
2、創(chuàng)建項(xiàng)目的 Gunicorn 配置文件(退出虛擬環(huán)境):
~$ sudo vim /etc/systemd/system/gunicorn_tendcode.service
3、配置信息如下:
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=alex
Group=www-data
WorkingDirectory=/home/alex/tendcode
ExecStart=/home/alex/izone_env/bin/gunicorn --access-logfile - --workers 2 --bind unix:/home/alex/tendcode/tendcode.sock izone.wsgi:application
[Install]
WantedBy=multi-user.target
上面的配置信息中需要根據(jù)自己的項(xiàng)目改的有以下幾個(gè)地方:
- User 填寫(xiě)自己當(dāng)前用戶(hù)名稱(chēng)
- WorkingDirectory 填寫(xiě)項(xiàng)目的地址
- ExecStart 中第一個(gè)地址是虛擬環(huán)境中 gunicorn 的目錄,所以只需要改前半部分虛擬環(huán)境的地址即可
- workers 2 這里是表示2個(gè)進(jìn)程,可以自己改
- unix 這里的地址是生成一個(gè) sock 文件的地址,直接寫(xiě)在項(xiàng)目的根目錄即可
- izone.wsgi 表示的是項(xiàng)目中 wsgi.py 的地址,我的項(xiàng)目中就是在 izone 文件夾下的
啟動(dòng)配置文件
文件配置完成之后,使用下面的命令啟動(dòng)服務(wù):
~$ sudo systemctl start gunicorn_tendcode
~$ sudo systemctl enable gunicorn_tendcode
查看服務(wù)的狀態(tài)可以使用命令:
~$ sudo systemctl status gunicorn_tendcode
上面的命令啟動(dòng)沒(méi)有問(wèn)題可以看看自己的項(xiàng)目的跟目錄下面,應(yīng)該會(huì)多一個(gè) tendcod.sock 文件的。
后續(xù)如果對(duì) gunicorn 配置文件做了修改,那么應(yīng)該先使用這個(gè)命令之后重啟:
~$ sudo systemctl daemon-reload
然后再使用重啟命令:
~$ sudo systemctl restart gunicorn_tendcode
配置 Nginx
首先創(chuàng)建一個(gè) Nginx 配置文件,不要使用默認(rèn)的那個(gè):
~$ sudo nano /etc/nginx/sites-available/mynginx
配置信息如下:
server {
# 端口和域名
listen 80;
server_name www.tendcode.com;
# 日志
access_log /home/alex/tendcode/logs/nginx.access.log;
error_log /home/alex/tendcode/logs/nginx.error.log;
# 不記錄訪問(wèn)不到 favicon.ico 的報(bào)錯(cuò)日志
location = /favicon.ico { access_log off; log_not_found off; }
# static 和 media 的地址
location /static/ {
root /home/alex/tendcode;
}
location /media/ {
root /home/alex/tendcode;
}
# gunicorn 中生成的文件的地址
location / {
include proxy_params;
proxy_pass http://unix:/home/alex/tendcode/tendcode.sock;
}
}
server {
listen 80;
server_name tendcode.com;
rewrite ^(.*) http://www.tendcode.com$1 permanent;
}
第一個(gè) server 是主要的配置,第二 server 是實(shí)現(xiàn)301跳轉(zhuǎn),即讓不帶 www 的域名跳轉(zhuǎn)到帶有 www 的域名上面。
連接 Nginx 配置
上面的配置檢查好之后,使用下面的命令來(lái)將這個(gè)配置跟 Nginx 建立連接,使用命令:
~$ sudo ln -s /etc/nginx/sites-available/mynginx /etc/nginx/sites-enabled
運(yùn)行完畢之后可以查看一下 Nginx 的運(yùn)營(yíng)情況,看看會(huì)不會(huì)報(bào)錯(cuò):
~$ sudo nginx -t
如果上面這句沒(méi)有報(bào)錯(cuò),那么恭喜你,你的配置文件沒(méi)有問(wèn)題,可以繼續(xù)下一步,如果報(bào)錯(cuò)了,需要按照?qǐng)?bào)錯(cuò)的信息去更改配置文件中對(duì)應(yīng)行的代碼,好好檢查一下吧!
沒(méi)報(bào)錯(cuò)的話,重啟一下 Nginx:
~$ sudo systemctl restart nginx
好了,重啟 Nginx 之后可以登錄自己配置的域名,看看自己的項(xiàng)目是不是已經(jīng)成功的運(yùn)行了呢!
后續(xù)維護(hù)
之后的項(xiàng)目維護(hù)中,如果更改了 gunicorn 的配置文件,那么需要依次執(zhí)行下面兩條語(yǔ)句去重啟服務(wù),如果只是修改了 Django 項(xiàng)目的內(nèi)容,只需要單獨(dú)執(zhí)行第二條重啟命令即可:
~$ sudo systemctl daemon-reload
~$ sudo systemctl restart gunicorn_tendcode
如果修改了 Nginx 的配置文件,那么需要依次執(zhí)行下面兩條語(yǔ)句去重啟服務(wù):
~$ sudo nginx -t
~$ sudo systemctl restart nginx
以上就是我的項(xiàng)目部署的全部過(guò)程,希望看到這篇文章的人如果想要使用同樣的方式部署 Django 項(xiàng)目的話,可以參考一下,有問(wèn)題也可以指出。
文章原文:http://www.tendcode.com/article/set-up-django-with-nginx-and-gunicorn/