使用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
相关文章
相关标签/搜索