容器化部署实践之Django应用部署(二)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 容器化部署实践之Django应用部署(二)

上一篇文章有些同学感觉不够详细理解起来有些困难,我再来简单解释一下。


我们在开发的情况下:

   浏览器请求→ python manage.py runserver(比如8000) → 到应用代码(Django,Flask等等)


部署到线上的情况:

   域名请求→ DNS解析→ 服务器IP→ Nginx(80端口)→ 代理转发 127.0.0.1:8000(IP不一定是127.0.0.1)→ 到项目应用代码逻辑。


在整个部署过程中,我们加了一层docker来进行隔离部署,不仅解决了开发(dev)测试(test)线上(prod)多个环境不一致的问题,也达到了一次封装,处处运行的目的,我们日常使用virtualenv进行Python包环境隔离都不需要了,这在多人开发模式下面非常方便。

我其实在docker入门篇Docker 容器化部署实践--入门已经讲过了。至于新手的话如果觉得一开始觉得不太容易上手,可以考虑去掉docker这个中间环节,直接把服务跑在Linux机器上面。


解释完上面,接下来进入我们今天的主题:

Django + Nginx + Gunicorn 部署


Gunicorn


Gunicorn,是「Green Unicorn」,最初来于Ruby社区的Unicorn,是用于Unix的Python WSGI HTTP服务器,Gunicorn与各种Web框架广泛兼容,简单轻便。

我们之所以使用使用uWSGI或Gunicorn原因就是Flask,Django自带的WSGI服务性能不够好,一般用在测试开发环境用,线上主要使用更为高性能的WSGI服务。

作为介绍我这里引用一个官方例子:

$ pip install gunicorn
  $ cat myapp.py
    def app(environ, start_response):
        data = b"Hello, World!\n"
        start_response("200 OK", [
            ("Content-Type", "text/plain"),
            ("Content-Length", str(len(data)))
        ])
        return iter([data])
  $ gunicorn -w 4 myapp:app
  [2014-09-10 10:22:28 +0000] [30869] [INFO] Listening at: http://127.0.0.1:8000 (30869)
  [2014-09-10 10:22:28 +0000] [30869] [INFO] Using worker: sync
  [2014-09-10 10:22:28 +0000] [30874] [INFO] Booting worker with pid: 30874
  [2014-09-10 10:22:28 +0000] [30875] [INFO] Booting worker with pid: 30875
  [2014-09-10 10:22:28 +0000] [30876] [INFO] Booting worker with pid: 30876
  [2014-09-10 10:22:28 +0000] [30877] [INFO] Booting worker with pid: 30877


装好gunicorn之后,我们可以通过gunicorn -h 进行查看配置,通常情况下为了方便,我们都是把gunicorn放在配置文件中。

这里提一点,gunicorn中有一个--statsd-host 这个使得可以用另外一种方式来跟踪请求,我之前在监控一文说到过statsd,大家可以参看我之前写的博客「使用Statsd+Graphite+Grafana搭建web监控系统」,点击阅读原文。


同uWSGI一样我给一个简单的supervisor例子:


# gunicorn.conf.py
import multiprocessing
import socket
bind = '0.0.0.0:9527'
workers = multiprocessing.cpu_count() * 2 + 1 
worker_class = 'gevent' # 搭配gevent运行
daemon = False
proc_name = 'yourproject'
pidfile = '/data/run/gunicorn.pid'
loglevel = 'error'
accesslog = '/data/yourproject/supervisor/gunicorn.access.log'
errorlog = '/data/yourproject/supervisor/gunicorn.error.log'
max_requests = 200000
# StatsD integration
# StatsD host is omitted here, please append `--statsd-host` to gunicorn
# statsd_host = 'localhost:8125'
statsd_prefix = socket.gethostname()

上面说下为什么worker数目是CPU核数*2+1,这个没有太多科学依据,主要是根据一个work进行读写操作,另一个work处理请求,具体可以根据自己情况进行配置。更多特殊配置,大家可以进行自行查阅文档。


supervisor & nginx & docker-compose


supervisor同上篇文章使用Docker容器化部署实践之Django应用部署(一)一样,唯一变化的就是我们command从uUWSGI变为了gunicorn,这里我就不多列出来supervisor完整配置了。


[program:gunicorn]
command=/path/to/gunicorn main:application -c /path/to/gunicorn.conf.py
directory=/path/to/project
user=nobody
autostart=true
autorestart=true
redirect_stderr=true


Nginx同上篇文章一样,我这里列一个简单的样例:


server {
    listen 80;
    server_name example.org;
    access_log  /var/log/nginx/example.log;
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }


docker-compose配置同之前文章一样,内容较多,就不列出来了。可以参考上篇文章使用Docker容器化部署实践之Django应用部署(一)的配置。


说到最后

今天我们主要阐述了Django部署使用的第二种方式,实际上这个过程和没有docker几乎差不多的,你可以剥离掉docker,对你整个过程没有太大影响。

同样的我整个部署过程阐述的过程比较简单,实际情况会多少有些出入,不知道你听懂了么?欢迎大家给我留言,我们一起讨论。

Docker容器化部署相关我们下一篇我们聊聊Kubernets这个大杀器。

相关文章
|
11天前
|
缓存 Kubernetes Docker
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
|
3天前
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
21天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
1月前
|
人工智能 Kubernetes 安全
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
70 13
|
1月前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
1月前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
63 5
|
1月前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
75 4
|
1月前
|
存储 安全 数据中心
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具。本文探讨了 Docker 如何通过 Namespace 和 Cgroups 实现 CPU、内存、网络和存储资源的隔离,提高系统安全性和资源利用率,以及面临的挑战和应对策略。
58 1
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
77 1
|
2月前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
121 0

相关产品

  • 容器服务Kubernetes版