Django工程正式環(huán)境部署流程

本文介紹的是如何將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)的使用情況,可以查閱這里正塌。

  1. 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í)候帐姻,可以訪問,可以查閱這里了解詳情

  2. 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蹲缠,具體可以參考這里.

參考

  1. Deploying Django with nginx and gunicorn
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棺克,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吼砂,更是在濱河造成了極大的恐慌逆航,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渔肩,死亡現(xiàn)場離奇詭異因俐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)周偎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門抹剩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蓉坎,你說我怎么就攤上這事澳眷。” “怎么了蛉艾?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵钳踊,是天一觀的道長。 經(jīng)常有香客問我勿侯,道長拓瞪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任助琐,我火速辦了婚禮祭埂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兵钮。我一直安慰自己蛆橡,他們只是感情好舌界,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泰演,像睡著了一般呻拌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睦焕,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天柏锄,我揣著相機(jī)與錄音,去河邊找鬼复亏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛缭嫡,可吹牛的內(nèi)容都是我干的缔御。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼妇蛀,長吁一口氣:“原來是場噩夢啊……” “哼耕突!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起评架,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤眷茁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纵诞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體上祈,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年浙芙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了登刺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗡呼,死狀恐怖纸俭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情南窗,我是刑警寧澤揍很,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站万伤,受9級特大地震影響窒悔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜壕翩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一蛉迹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧放妈,春花似錦北救、人聲如沸荐操。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽托启。三九已至,卻和暖如春攘宙,著一層夾襖步出監(jiān)牢的瞬間屯耸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工蹭劈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疗绣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓铺韧,卻偏偏與公主長得像多矮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子哈打,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345