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

image

週末,在一個技術羣裏面有同窗在問Django開發部署,因此今天給你們分享一下基於Docker下Python Django框架的部署。python

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

  1. Django + Nginx + uWSGInginx

  2. Django+ Nginx + Gunicornredis

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

首先咱們要知道咱們發佈上線的步驟,這裏面咱們以Docker容器化爲例子:docker

1.經過自動化腳本,把代碼同步到線上服務器(經過fabric或者ansible等) 2.重啓supervisord(進程管理工具,經過uWSGI 控制Django服務啓動) 3.經過docker-compose 更新docker鏡像(若是有鏡像有變動,好比裝了包到容器裏面) 4.作數據表migrate,好比數據表進行了變動(若是是關係型數據庫) 5.經過docker-compose重啓docker容器數據庫

這上面5個步驟,只要配置好了對應的配置文件(nginx,uWSGI,supervisor等),咱們就能經過一個發佈腳本進行一鍵進行代碼發佈上線。api

下面分別簡單闡述一下,Nginx,Supervisor,uWSGI,Docker-compose等配置文件及用法。瀏覽器

Nginx

Nginx是一個高性能的HTTP和反向代理服務器。bash

咱們要進行服務部署,首先咱們Nginx須要進行配置好對應的配置文件。

把配置文件放在/etc/nginx/sites-enabled/ 目錄下面,這兒你也能夠放在項目裏面經過ln 進行連接過去。

之因此這樣配置是由於咱們主配置文件/etc/nginx/nginx.conf是include /etc/nginx/sites-enabled/ 目錄的緣由。

這裏咱們配置文件命名爲 api.yourdomain.com.conf ``配置文件以下

# api.yourdomain.com.conf

server {

    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    = true
processes = 1  # 通常越多進程處理能力越強,因爲這裏是測試設爲1
vacuum    = true
http      = 0.0.0.0:9527

# virtualenv = /home/test/project/python/yourproject/venv

這裏咱們用了docker就不用考慮virtualenv狀況

env = DJANGO_SETTINGS_MODULE=yourproject.settings

harakiri  = 30 # 當進程被卡住的時間超過特定的秒數後就銷燬這個進程

no-orphans  # 在沒有主進程的狀況下自動結束工做進程。
複製代碼

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

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

Supervisor

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

[supervisord]

nodaemon=true

logfile=/data/log/supervisord.log
pidfile=/var/run/supervisord.pid

[program:your_app_name]

process_name=app%(process_num)s

command=uwsgi -i /yourdir/uwsgi.ini --touch-reload=/yourdir/uwsgi.ini

directory=/yourdir ;執行命令時切換工做目錄
user=sitin                 ; 使用sitin來啓動進程
stopsignal=HUP
autostart = true
autorestart=true  ;自動重啓
redirect_stderr = true  ;重定向日誌
stdout_logfile = /data/log/stdout-%(program_name)s.log

logfile_maxbytes=300MB

logfile_backups=5

numprocs=3  ;啓動3個 9527,9528,9529

numprocs_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 # 容器執行命令
    container_name: test  # 容器名
    restart: always  
    volumes:
      - ./docker:/data  # 掛載地址

    ports:
      - "9527:9527" #端口

    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
相關文章
相關標籤/搜索