本文介紹的是如何將Django的工程代碼部署到現(xiàn)網(wǎng)上栽燕,供外網(wǎng)用戶訪問暂氯。
寫在前面
本地開發(fā)我們知道潮模,需要將配置文件 settings.py 中的 DEBUG
設(shè)置為 True
即可滿足我們本地開發(fā)的需求,那么要將代碼部署到現(xiàn)網(wǎng)環(huán)境需要考慮的內(nèi)容就比較多痴施,比如靜態(tài)資源的訪問上擎厢,我們需要使用nginx來幫助我們處理靜態(tài)資源,以提高訪問的高可用和高可靠性辣吃,還有服務(wù)進(jìn)程的管理上也是需要使用Procfile來幫助我們管理進(jìn)程动遭,下面將講述我通過 Nginx + gunicorn + Django 來實(shí)現(xiàn)正式環(huán)境部署Django工程代碼的。
靜態(tài)資源合并
要將Django工程代碼部署到現(xiàn)網(wǎng)神得,我們肯定是需要在現(xiàn)網(wǎng)環(huán)境執(zhí)行 pip install -r requirements.txt
來將項(xiàng)目所依賴的庫進(jìn)行下載安裝厘惦,之后我們就需要將工程的所有靜態(tài)文件還有Django admin的靜態(tài)資源進(jìn)行打包,如何進(jìn)行資源整合的呢?(這里說的靜態(tài)資源指: javascript / css / images 等文件)
在工程的配置文件 settings.py 中有三個(gè)配置項(xiàng): STATICFILES_DIRS / STATIC_ROOT / STATIC_URL,和工程的靜態(tài)資源息息相關(guān)培漏,下面分別介紹一下:
-
STATICFILES_DIRS: 表示工程里靜態(tài)資源的引用路徑脑慧,默認(rèn)為空
[]
吕朵,將只會引用各個(gè)application目錄下面的static子目錄下的內(nèi)容,我們可以將其設(shè)置為如下工程目錄下的 static 目錄,那么靜態(tài)資源會先從 STATICFILES_DIRS 中查詢,如果沒有查到稼稿,才會去application下的靜態(tài)資源目錄中查詢STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') ]
-
STATIC_ROOT: 表示執(zhí)行命令
python manage.py collectstatic --noinput
之后,工程所有的靜態(tài)資源存放路徑讳窟,我們可以將其設(shè)置為 `STATIC_ROOT = 'staticfiles'让歼,那么執(zhí)行完命令之后,就會在工程目錄下創(chuàng)建一個(gè)目錄名為 staticfiles丽啡,里面存放的是工程的所有靜態(tài)資源 - STATIC_URL: 表示靜態(tài)資源的訪問url谋右,默認(rèn)為 static。比如在本地開發(fā)環(huán)境下补箍,我們想要訪問某個(gè)application下的 static/js/test.js 文件倚评,可以在瀏覽器中輸入 http://127.0.0.1:8000/static/js/test.js浦徊,該域名中的 static 就是這里的 STATIC_URL 的值決定的
通過執(zhí)行命令 python manage.py collectstatic --noinput
命令之后,就會將工程的所有靜態(tài)資源進(jìn)行打包天梧,放在 STATICFILES_DIRS 目錄下,這樣做的目的霞丧,是為了方便后面nginx能夠方便訪問到呢岗。
nginx的搭建部署
這里我參考的是這里安裝的nginx,一些庫的作用大致說明一下:
- pcre: 是為了支持配置文件 nginx.conf 中使用正則表達(dá)式
- zlib: 是為了支持http包的內(nèi)容做gzip格式的壓縮蛹尝,在配置文件 nginx.conf 中配置
gzip on
# 安裝nginx依賴的一些包
yum -y install make pcre pcre-dev zlib zlib-devel gcc-c++ libtool openssl openssl-devel
mkdir -p /data/jshan/applications/nginx/
cd /data/jshan/applications/nginx/
# 下載包并解壓
wget http://nginx.org/download/nginx-1.16.0.tar.gz
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -zxf nginx-1.16.0.tar.gz && mv nginx-1.16.0 nginx-src
tar -zxf pcre-8.43.tar.gz
tar -zxf zlib-1.2.11.tar.gz
# 安裝nginx
cd nginx-src
./configure --prefix=/data/jshan/applications/nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-stream --with-debug --with-pcre=../pcre-8.43 --with-zlib=../zlib-1.2.11
make && make install
# 啟動nginx
../sbin/nginx
為了保證nginx能夠訪問到我們的Django應(yīng)用中的靜態(tài)資源后豫,這里需要配置一下 nginx.conf 配置文件,由于我的Django工程靜態(tài)資源所在目錄為 /data/jshan/django-project/test_pipeline/staticfiles突那,工程的啟動服務(wù)訪問地址為 http://127.0.0.1:8001挫酿,那么我的 nginx.conf 配置文件內(nèi)容為:
server {
listen 8011;
access_log /data/jshan/django-project/test_pipeline/logs/access.log;
error_log /data/jshan/django-project/test_pipeline/logs/error.log;
location /static/ {
alias /data/jshan/django-project/test_pipeline/staticfiles/;
}
location / {
proxy_pass http://127.0.0.1:8001;
}
}
這樣要訪問工程的靜態(tài)資源就可以使用 http://xxx.xxx.xxx.xxx:8001/static/js/test.js 來訪問到服務(wù)器上 /data/jshan/django-project/test_pipeline/staticfiles/js/test.js 文件了。
gunicorn
我們在本地啟動Django工程可以直接使用 python manage.py runserver 127.0.0.1:8080
方式來啟動愕难,但是到了現(xiàn)網(wǎng)環(huán)境早龟,為了保證服務(wù)進(jìn)程數(shù)量的控制,這樣啟動是不合適的猫缭,這里可以使用 gunicorn 方式來啟動葱弟,它可以設(shè)置工程啟動的進(jìn)程數(shù)和線程數(shù)等等,gunicorn的使用可以參考這里猜丹,我這里啟動的命令是:
gunicorn test_pipeline.wsgi -w 1 --threads 1 -b 127.0.0.1:8001 --daemon --access-logfile /data/jshan/django-project/test_pipeline/access_app.log --error-logfile /data/jshan/django-project/test_pipeline/error_app.log --access-logformat '[%(h)s] %({request_id}i)s %(u)s %(t)s "%(r)s" %(s)s %(D)s %(b)s "%(f)s" "%(a)s"'
但是為了方便管理工程的啟動命令芝加,我這里使用的是 Procfile 來管理進(jìn)程,如何操作的呢射窒?就是在工程目錄下面新建一個(gè)文件藏杖,文件名為 Procfile,里面的內(nèi)容如下:
web: gunicorn test_pipeline.wsgi -w 1 --threads 1 -b 127.0.0.1:8001 --daemon --access-logfile /data/jshan/django-project/test_pipeline/access_app.log --error-logfile /data/jshan/django-project/test_pipeline/error_app.log --access-logformat '[%(h)s] %({request_id}i)s %(u)s %(t)s "%(r)s" %(s)s %(D)s %(b)s "%(f)s" "%(a)s"'
這樣做的好處脉顿,主要是為了將該工程相關(guān)的所有需要啟動的進(jìn)程蝌麸,放在一起集中管理。要去解析并執(zhí)行該進(jìn)程管理文件弊予,可以使用 honcho祥楣、heroku等,這里我使用的是 honcho汉柒,這樣工程的啟動命令如下误褪,在工程的根目錄下執(zhí)行(Procfile文件需在此目錄下):
cd /data/jshan/django-project/test_pipeline
honcho -d . start # -d 表示后臺運(yùn)行
至此正式環(huán)境部署發(fā)布Django工程的整個(gè)流程就走完了,最后說明一下Django配置文件 settings.py 中的一些配置在正式環(huán)境中部署時(shí)碾褂,遇到的一些情況進(jìn)行說明和解釋兽间,如需了解更多該配置文件中的配置項(xiàng)的使用情況,可以查閱這里正塌。
DEBUG
當(dāng)設(shè)置DEBUG = False
時(shí)嘀略,如果不設(shè)置ALLOWED_HOSTS
恤溶,即該值為空[]
,那么在訪問Django工程的時(shí)候帜羊,會返回 Bad Request (400)
當(dāng)設(shè)置DEBUG = True
時(shí)咒程,如果不設(shè)置ALLOWED_HOSTS
,其值為['localhost', '127.0.0.1', '[::1]']
讼育,所以本地開發(fā)的時(shí)候帐姻,可以訪問,可以查閱這里了解詳情TIME_ZONE
配置TIME_ZONE
默認(rèn)為 UTC奶段,在查看日志的時(shí)候饥瓷,會發(fā)現(xiàn)和中國的時(shí)間差距8小時(shí);在Django工程中使用datetime.datetime.now()
得到的時(shí)間也是 UTC 的時(shí)間痹籍,與中國的時(shí)間少了8小時(shí)呢铆,所以如果為了將其轉(zhuǎn)化為東八區(qū)的時(shí)間,這里我們需要設(shè)置該配置的值為 Asia/Shanghai蹲缠,具體可以參考這里.