使用Docker容器化部署实践之Django应用部署(一)

栏目: Python · 发布时间: 5年前

内容简介:周末,在一个技术群里面有同学在问Django开发部署,所以今天给大家分享一下基于Docker下Python Django框架的部署。首先我们要知道Django常见的两种部署方式:限于篇幅情况,今天我们主要聊第一种 uWSGI 配合 Nginx的部署方式。
使用 <a href='https://www.codercto.com/topics/20577.html'>Docker</a> 容器化部署实践之Django应用部署(一)

周末,在一个技术群里面有同学在问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.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等等。你这儿可以把他等同 Pythonmanage.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应用拉动起来(这里类似pythonmanage.py runserver)

  4. 而我们浏览器请求到达Nginx之后被反向代理到uWSGI端口服务上面,从而访问到我们Django应用。

  5. 至此就是整个应用的部署配置(除了没有自动化发布脚本以外)

最后

通过上面的配置文件,我们介绍了整个Django应用发布过程的涉及到的主要步骤,实际情况会稍微复杂点儿。更多详细优化参数大家可以去进行了解。今天我们uWSGI的部署就先到这儿,下一期我们再进行分享Gunicorn部署方式。

容器化部署实践,我打算从基础操作到实战应用以一个系列进行分享,今天是第四篇docker部署Django应用,后期我将持续分享更多相关内容,从容器化入门使用到部署实践编排技术,欢迎大家持续进行关注。

使用Docker容器化部署实践之Django应用部署(一)

扫码免费加入


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learn Python the Hard Way

Learn Python the Hard Way

Zed Shaw / Example Product Manufacturer / 2011

This is a very beginner book for people who want to learn to code. If you can already code then the book will probably drive you insane. It's intended for people who have no coding chops to build up t......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具