使用Docker容器化部署實踐之Django應用部署(一)

濤哥聊Python發表於2019-01-19
image

週末,在一個技術群裡面有同學在問Django開發部署,所以今天給大家分享一下基於Docker下Python Django框架的部署。

首先我們要知道Django常見的兩種部署方式:

  1. Django + Nginx + uWSGI

  2. Django+ Nginx + Gunicorn

限於篇幅情況,今天我們主要聊第一種 uWSGI 配合 Nginx的部署方式。

首先我們要知道我們釋出上線的步驟,這裡面我們以Docker容器化為例子:

1.通過自動化指令碼,把程式碼同步到線上伺服器(通過fabric或者ansible等)2.重啟supervisord(程式管理工具,通過uWSGI 控制Django服務啟動)3.通過docker-compose 更新docker映象(如果有映象有變更,比如裝了包到容器裡面)4.做資料表migrate,比如資料表進行了變更(如果是關係型資料庫)5.通過docker-compose重啟docker容器

這上面5個步驟,只要配置好了對應的配置檔案(nginx,uWSGI,supervisor等),我們就能通過一個釋出指令碼進行一鍵進行程式碼釋出上線。

下面分別簡單闡述一下,Nginx,Supervisor,uWSGI,Docker-compose等配置檔案及用法。

Nginx

Nginx是一個高效能的HTTP和反向代理伺服器。

我們要進行服務部署,首先我們Nginx需要進行配置好對應的配置檔案。

把配置檔案放在/etc/nginx/sites-enabled/ 目錄下面,這兒你也可以放在專案裡面通過ln 進行連結過去。

之所以這樣配置是因為我們主配置檔案/etc/nginx/nginx.conf是include /etc/nginx/sites-enabled/ 目錄的原因。

這裡我們配置檔案命名為 
api.yourdomain.com.conf 
``配置檔案如下

# api.yourdomain.com.confserver { 
listen 80;
charset utf-8;
server_name api.yourdomain.com;
# DNS解析到當前nginx伺服器 location / {
proxy_pass http://127.0.0.1:9527;
# 代理的埠 proxy_pass_header Server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;

} access_log /test/log/nginx.access.log;
error_log /test/log/nginx.error.log;

}複製程式碼

uWSGI

配置好了nginx,接下來就是uWSGI配置了。uWSGI是一個Web伺服器,它實現了WSGI協議、uwsgi、http等協議。

後面我們會說uWSGI 和 Gunicorn 他們都是實現了WSGI server協議的伺服器。

通過uWSGI我們可以獲得更好的服務效能,詳細日誌,多應用管理等多種定製功能。下面我們簡單來看下配置檔案。

# /yourdir/uwsgi.ini [uwsgi]chdir     = /yourdir/  # 執行目錄module    = yourproject.wsgi # wsgi檔案master    = trueprocesses = 1  # 一般越多程式處理能力越強,由於這裡是測試設為1vacuum    = truehttp      = 0.0.0.0:9527# virtualenv = /home/test/project/python/yourproject/venv這裡我們用了docker就不用考慮virtualenv情況env = DJANGO_SETTINGS_MODULE=yourproject.settingsharakiri  = 30 # 當程式被卡住的時間超過特定的秒數後就銷燬這個程式no-orphans  # 在沒有主程式的情況下自動結束工作程式。複製程式碼

為了方便展示以及解讀,這裡面我刪除精簡了一些配置,具體線上配置更為複雜一些,具體情況請具體進行配置。

另外這裡面我們需要知道uWSGI 是一個語言無關的伺服器,這裡面我們可以部署Django,也可以部署Flask,Web2py等等。你這兒可以把他等同 Python manage.py runserver 這條命令,區別在一個在測試環境和線上環境。

Supervisor

supervisor我在Linux系列文章第一篇Linux系列開坑記(一)-常用的3個命令,就分享過了,這裡直接列一個配置檔案出來。

[supervisord]nodaemon=truelogfile=/data/log/supervisord.logpidfile=/var/run/supervisord.pid[program:your_app_name]process_name=app%(process_num)scommand=uwsgi -i /yourdir/uwsgi.ini --touch-reload=/yourdir/uwsgi.inidirectory=/yourdir ;
執行命令時切換工作目錄user=sitin ;
使用sitin來啟動程式stopsignal=HUPautostart = trueautorestart=true&
emsp;
&
emsp;
;
自動重啟redirect_stderr = true&
emsp;
&
emsp;
;
重定向日誌stdout_logfile = /data/log/stdout-%(program_name)s.loglogfile_maxbytes=300MBlogfile_backups=5numprocs=3 &
emsp;
;
啟動3個 9527,9528,9529numprocs_start=9527 ;
從9527開始複製程式碼

這裡面supervisor控制服務uWSGI進行服務啟動,我們可以進行start,restart,stop等操作。

Docker-compose

Docker-compose是進行容器編排,方便我們進行容器管理。我們配置好了上面的檔案,再來看下docker-compose的配置檔案,這裡同樣我在之前docker文章進行分享過了,參考 
Docker容器化部署實踐Docker Compose

version: "3"  # 注意版本號services:  # 一個應用的容器,可以包括多個相同映象容器例項  dev:    image: hub.yourdomain.com/test:1.0 # 映象地址    command: supervisord -c /yourdir/supervisord.conf #&
emsp;
容器執行命令
container_name: test&
emsp;
&
emsp;
# 容器名 restart: always volumes: - ./docker:/data #&
emsp;
掛載地址
ports: - "9527:9527"&
emsp;
#埠 environment: - PYTHONPATH=/data - XXX_API_SETTINGS=XXX.config.dev - DJANGO_SETTINGS_MODULE=yourproject.settings network_mode: bridge extra_hosts: # 配置額外的host名稱 - "test.yourdomain.com:127.0.0.1" external_links: # 連結到外部容器 - redis:redis - mysql:mysql複製程式碼

看到這兒想必有同學已經有些暈了,我們再來理一下這裡的邏輯。

  1. 我們通過docker-compose配置檔案,進行控制supervisor啟動

  2. Supervisor控制uWSGI埠服務啟動

  3. uWSGI把整個Django應用拉動起來(這裡類似python manage.py runserver)

  4. 而我們瀏覽器請求到達Nginx之後被反向代理到uWSGI埠服務上面,從而訪問到我們Django應用。

  5. 至此就是整個應用的部署配置(除了沒有自動化釋出指令碼以外)

最後

通過上面的配置檔案,我們介紹了整個Django應用釋出過程的涉及到的主要步驟,實際情況會稍微複雜點兒。更多詳細優化引數大家可以去進行了解。今天我們uWSGI的部署就先到這兒,下一期我們再進行分享Gunicorn部署方式。

容器化部署實踐,我打算從基礎操作到實戰應用以一個系列進行分享,今天是第四篇docker部署Django應用,後期我將持續分享更多相關內容,從容器化入門使用到部署實踐編排技術,歡迎大家持續進行關注。

image

掃碼免費加入

相關文章:

Docker 容器化部署實踐–入門

Docker容器化部署實踐Docker Compose

Docker 容器化部署實踐之Dockerfile

Linux系列開坑記(一)-常用的3個命令

image

來源:https://juejin.im/post/5c42e9a7f265da616f703c53#comment

相關文章