本文介紹的是如何將Django的工程代碼部署到現(xiàn)網(wǎng)上,供外網(wǎng)用戶訪問。
寫在前面
本地開發(fā)我們知道,需要將配置文件 settings.py 中的 DEBUG 設置為 True 即可滿足我們本地開發(fā)的需求,那么要將代碼部署到現(xiàn)網(wǎng)環(huán)境需要考慮的內容就比較多,比如靜態(tài)資源的訪問上,我們需要使用nginx來幫助我們處理靜態(tài)資源,以提高訪問的高可用和高可靠性,還有服務進程的管理上也是需要使用Procfile來幫助我們管理進程,下面將講述我通過 Nginx + gunicorn + Django 來實現(xiàn)正式環(huán)境部署Django工程代碼的。
靜態(tài)資源合并
要將Django工程代碼部署到現(xiàn)網(wǎng),我們肯定是需要在現(xiàn)網(wǎng)環(huán)境執(zhí)行 pip install -r requirements.txt 來將項目所依賴的庫進行下載安裝,之后我們就需要將工程的所有靜態(tài)文件還有Django admin的靜態(tài)資源進行打包,如何進行資源整合的呢?(這里說的靜態(tài)資源指: javascript / css / images 等文件)
在工程的配置文件 settings.py 中有三個配置項: STATICFILES_DIRS / STATIC_ROOT / STATIC_URL,和工程的靜態(tài)資源息息相關,下面分別介紹一下:
-
STATICFILES_DIRS: 表示工程里靜態(tài)資源的引用路徑,默認為空
[],將只會引用各個application目錄下面的static子目錄下的內容,我們可以將其設置為如下工程目錄下的 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)資源存放路徑,我們可以將其設置為 `STATIC_ROOT = 'staticfiles',那么執(zhí)行完命令之后,就會在工程目錄下創(chuàng)建一個目錄名為 staticfiles,里面存放的是工程的所有靜態(tài)資源 - STATIC_URL: 表示靜態(tài)資源的訪問url,默認為 static。比如在本地開發(fā)環(huán)境下,我們想要訪問某個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)資源進行打包,放在 STATICFILES_DIRS 目錄下,這樣做的目的,是為了方便后面nginx能夠方便訪問到。
nginx的搭建部署
這里我參考的是這里安裝的nginx,一些庫的作用大致說明一下:
- pcre: 是為了支持配置文件 nginx.conf 中使用正則表達式
- zlib: 是為了支持http包的內容做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應用中的靜態(tài)資源,這里需要配置一下 nginx.conf 配置文件,由于我的Django工程靜態(tài)資源所在目錄為 /data/jshan/django-project/test_pipeline/staticfiles,工程的啟動服務訪問地址為 http://127.0.0.1:8001,那么我的 nginx.conf 配置文件內容為:
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 來訪問到服務器上 /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)境,為了保證服務進程數(shù)量的控制,這樣啟動是不合適的,這里可以使用 gunicorn 方式來啟動,它可以設置工程啟動的進程數(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 來管理進程,如何操作的呢?就是在工程目錄下面新建一個文件,文件名為 Procfile,里面的內容如下:
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"'
這樣做的好處,主要是為了將該工程相關的所有需要啟動的進程,放在一起集中管理。要去解析并執(zhí)行該進程管理文件,可以使用 honcho、heroku等,這里我使用的是 honcho,這樣工程的啟動命令如下,在工程的根目錄下執(zhí)行(Procfile文件需在此目錄下):
cd /data/jshan/django-project/test_pipeline
honcho -d . start # -d 表示后臺運行
至此正式環(huán)境部署發(fā)布Django工程的整個流程就走完了,最后說明一下Django配置文件 settings.py 中的一些配置在正式環(huán)境中部署時,遇到的一些情況進行說明和解釋,如需了解更多該配置文件中的配置項的使用情況,可以查閱這里。
DEBUG
當設置DEBUG = False時,如果不設置ALLOWED_HOSTS,即該值為空[],那么在訪問Django工程的時候,會返回 Bad Request (400)
當設置DEBUG = True時,如果不設置ALLOWED_HOSTS,其值為['localhost', '127.0.0.1', '[::1]'],所以本地開發(fā)的時候,可以訪問,可以查閱這里了解詳情TIME_ZONE
配置TIME_ZONE默認為 UTC,在查看日志的時候,會發(fā)現(xiàn)和中國的時間差距8小時;在Django工程中使用datetime.datetime.now()得到的時間也是 UTC 的時間,與中國的時間少了8小時,所以如果為了將其轉化為東八區(qū)的時間,這里我們需要設置該配置的值為 Asia/Shanghai,具體可以參考這里.