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

本文介紹的是如何將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)境中部署時,遇到的一些情況進行說明和解釋,如需了解更多該配置文件中的配置項的使用情況,可以查閱這里。

  1. DEBUG
    當設置 DEBUG = False 時,如果不設置 ALLOWED_HOSTS,即該值為空 [],那么在訪問Django工程的時候,會返回 Bad Request (400)
    當設置 DEBUG = True 時,如果不設置 ALLOWED_HOSTS,其值為 ['localhost', '127.0.0.1', '[::1]'],所以本地開發(fā)的時候,可以訪問,可以查閱這里了解詳情

  2. TIME_ZONE
    配置 TIME_ZONE 默認為 UTC,在查看日志的時候,會發(fā)現(xiàn)和中國的時間差距8小時;在Django工程中使用 datetime.datetime.now() 得到的時間也是 UTC 的時間,與中國的時間少了8小時,所以如果為了將其轉化為東八區(qū)的時間,這里我們需要設置該配置的值為 Asia/Shanghai,具體可以參考這里.

參考

  1. Deploying Django with nginx and gunicorn
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容