当前位置: 首页 > news >正文

通过Gunicorn、Supervisor和Nginx更好地运行Django

文章目录

  • 通过runserver运行Django
  • 通过Gunicorn运行Django
  • 通过Nginx来做反向代理
  • 通过Supervisor来托管gunicorn和nginx

同步发布在个人站点:https://panzhixiang.cn

通过runserver运行Django

相信用过Django做开发的人对于python manage.py runserver 这个命令一定不陌生,这个命令利用django自带的一个web服务器,可以帮助我们在本地很简单地就运行django,对于本地测试来说足够了,但是不能用作生产环境中,甚至测试环境都不行,主要有如下几点问题:

  1. 性能差
    它是单进程、单线程的,因此只能同时处理一个请求。随着请求量的增加,服务器的 CPU 和内存使用率会不断上升,最终导致性能下降

  2. 功能有限
    它仅支持基本的 HTTP 请求,不支持 HTTPS、负载均衡、静态文件服务等功能。在生产环境中,这些功能是必不可少的。

通过Gunicorn运行Django

正式使用Gunicorn之前,先说一下它的优点:
(以下内容来自GPT4)

Gunicorn(Green Unicorn)是一个Python的WSGI HTTP服务器,许多大型网站和高性能应用都选用它来托管 Python web 应用。以下是 Gunicorn 的一些主要优点:

  1. 简单易用:Gunicorn 非常容易安装和配置。你只需要通过 pip 安装它,并用几行命令就可以启动一个 WSGI 应用。这使得开发者可以更加专注于他们的应用程序代码,而不需要过多关心部署和运维问题。

  2. 兼容性强:Gunicorn 全面支持 WSGI 规范,因此理论上与所有遵循该规范的Python web框架兼容,包括但不限于Django、Flask和Pyramid等。

  3. 预分叉模型:Gunicorn 使用 Unix 的 fork 系统调用创建子进程(worker),每个 worker 可以独立地处理请求。使用预分叉模型,父进程可以在必要时杀死并重建子进程,提供了对内存泄漏的防护机制。

  4. 负载管理:Gunicorn 有多种类型的 worker 可供选择,包括同步 worker 和异步 worker。同步 worker 适合 CPU 密集型任务,而异步 worker 则适合 IO 密集型或网络密集型的任务。这意味着你可以根据自己的应用特性选择最合适的 worker 类型。

  5. 错误隔离:由于每个请求都由各自的 worker 进程处理,如果一个请求导致 crash 或者未捕获的异常,那么只会影响到正在处理该请求的 worker,其他 worker 或请求将不受影响。

  6. 健壮性和可靠性:Gunicorn 能够自动管理 worker 进程,如果某个 worker 异常退出,Gunicorn 主进程会自动重新启动新的 worker 进程来代替,从而保证服务的持续可用。

  7. 配置灵活:Gunicorn 提供了大量的配置选项,你可以控制日志级别、输出位置、worker 数量、请求超时时间、SSL 设置等诸多方面。同时,Gunicorn 支持从 Python 文件、环境变量、命令行参数中读取配置,满足了不同场景下的需求。

  8. 热重载:Gunicorn 支持无缝重启,这意味着你可以在不中断服务的情况下升级代码或者配置。

  9. 社区支持和文档:最后但同样重要的是,Gunicorn 有一个活跃的开发者社区和详细的官方文档,能够为使用 Gunicorn 的开发者提供大量的帮助和指导。

在使用 Gunicorn 运行 Django 之前,你需要确保已经正确地安装了 Django 和 Gunicorn。假设你的 Django 项目名为 myproject,并且它位于 /path/to/myproject/ 下。

  1. 安装 Gunicorn
    如果你还没有安装 Gunicorn,可以使用 pip 来安装:

    pip install gunicorn
    
  2. 运行 Gunicorn
    现在你应该可以用 Gunicorn 来启动你的 Django 应用了。Gunicorn 的基本命令格式是 gunicorn [OPTIONS] APP_MODULE,其中 APP_MODULE 是一个 Python 导入路径,指向包含 WSGI application 对象的模块。

    在标准的 Django 项目中,这个对象(通常被称为 application)定义在 wsgi.py 文件里。所以如果你的项目名为 myproject,那么 APP_MODULE 就是 myproject.wsgi

    要让 Gunicorn 启动 Django 项目,可以执行以下命令:

    cd /path/to/myproject/
    gunicorn myproject.wsgi
    

    这将会在监听 localhost:8000 的 Gunicorn 服务器上启动你的 Django 应用。

    注意:这个只是为了演示gunicorn的简单运行方式,正式环境中不推荐这么使用

  3. 配置 Gunicorn

    Gunicorn 提供了许多可配置的选项,可以根据自己的需求去调整其行为,比较常用的方式是创建一个 Gunicorn 配置文件可以让你的配置更加结构化和方便管理。Gunicorn 的配置文件通常是一个 Python 脚本,其中定义了一些全局变量。

    假设我们在 /path/to/myproject/gunicorn_config.py 创建以下配置文件:

    # gunicorn_config.pyimport multiprocessing# 绑定ip和端口号bind = "0.0.0.0:8080"# 使用gevent模式,还可以使用sync 模式,默认的是sync模式worker_class = 'gevent'# 开启的进程数workers = multiprocessing.cpu_count() * 2 + 1# 并发处理的请求数量threads = 2# 最大待处理连接数backlog = 2048# 工作模式协程worker_connections = 1000# 重载、修改配置后,自动重新加载程序reload = True# 访问日志文件accesslog = "/var/log/gunicorn/access.log"# 错误日志文件errorlog = "/var/log/gunicorn/error.log"
    

    上述配置中,我们设置了多个参数,如绑定地址、工作模式、日志位置等等。这只是一个基础的配置例子,你可以根据实际需求进行修改或扩展。

    然后,你可以通过 -c--config 命令行选项来指明配置文件的路径,运行 Django 应用,如下所示:

    cd /path/to/myproject/
    gunicorn myproject.wsgi -c gunicorn_config.py
    

    该命令告诉 Gunicorn 加载 gunicorn_config.py 文件,并应用里面定义的配置。

通过Nginx来做反向代理

gunicorn比起django的runserver要好很多,但是实践中,一般不会直接将gunicorn直接对外暴露,而是再加一层反向代理,最常用的就是Nginx。

使用Nginx作为反向代理,主要有以下优势:

  1. 静态文件处理:Nginx 非常擅长处理静态内容(如 CSS、JavaScript 文件或图片),而 Python WSGI 服务器通常并不适合直接服务静态文件,这可能会引发性能问题。通过将静态文件服务任务交给 Nginx,你可以释放出 Gunicorn 的资源来处理动态内容。

  2. 负载均衡:如果你有多个后端服务器或者多个 worker 进程,Nginx 可以有效地分配传入请求到各个后端服务器上,实现负载均衡。它还支持多种负载均衡策略和健康检查。

  3. 缓冲请求:Nginx 可以为后端提供一层保护,因为它拦截并处理了所有客户端连接。这意味着后端服务器只需要处理完整的请求,无需关心网络问题或慢速连接。此外,如果后端应用挂掉或重启,在这段时间内 Nginx 仍然可以继续为用户提供服务(例如返回一个友好的错误页面)。

  4. SSL 终止:如果你的网站需要 SSL 加密,Nginx 可以处理所有的 HTTPS 握手过程,并与后端服务器进行非加密通信,这样就减轻了后端服务器的负担。

  5. HTTP/2 支持:Nginx 支持 HTTP/2 协议,而大部分 WSGI 服务器包括 Gunicorn 目前还没有直接支持 HTTP/2 的计划。通过在 Nginx 中开启 HTTP/2,你的用户可以享受到更快的加载速度和更低的延迟。

  6. 访问控制和安全防护:Nginx 提供了一系列安全相关功能,比如 IP 白名单/黑名单、限速、防止 DDOS 攻击等。

  7. gzip 压缩:Nginx 可以对响应数据进行 gzip 压缩,从而减少网络带宽消耗和提高页面的加载速度。

下面是使用 Nginx 作为 Gunicorn 的反向代理的详细步骤

  1. 安装 Nginx

    在 Ubuntu/Debian 上,你可以通过 apt-get 来安装 Nginx:

    sudo apt-get install nginx
    
  2. 配置 Nginx

    配置 Nginx 以使其能正确地将请求转发到 Gunicorn。Nginx 的设置文件通常位于 /etc/nginx/sites-available/default

    下面是一个基本的配置示例:

    server {listen 80;server_name yourdomain.com;location /static/ {alias /path/to/myproject/static/;  # 这里是指向Django中的静态文件目录的}location / {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_pass http://localhost:8000; # 替换成 gunicorn 正在监听的地址和端口号}
    }
    
  3. 启动 Nginx

    完成配置后,你就可以启动 Nginx 了:

    sudo service nginx start
    

以上就是基本的流程。当然,这只是最简单的配置,如果你需要更高级的特性(比如 HTTPS、负载均衡或缓存),则需要进行更多的配置。建议查阅 Nginx 官方文档 获取更详细的信息。

通过Supervisor来托管gunicorn和nginx

我是在第二份工作中才接触到supervisor的,了解之后就非常喜欢这个工具,最大好处就是托管某一个进程,尤其是如果进程出现问题死掉了,supervisor会自动尝试重启这个进程,这个对于线上环境来说非常重要。

Supervisor 是一个用 Python 写的进程管理工具,可以很方便地用来在 UNIX-like 系统(不支持Windows)下启动、重启(自动)和关闭进程。

以下是如何使用 Supervisor 托管 gunicorn 和 nginx 的步骤:

  1. 安装 Supervisor

    在 Ubuntu/Debian 上,你可以通过 apt-get 来安装 Supervisor:

     sudo apt-get install supervisor
    
  2. 创建 Supervisor 配置文件

    你需要为每个要由 Supervisor 管理的程序创建一个配置文件。这些文件通常位于 /etc/supervisor/conf.d/ 目录下,并且以 .conf 结尾。

    如上假设,Django 项目路径为 /path/to/myproject/,Gunicorn 的配置文件名为 gunicorn_config.py,那么我们需要为 Gunicorn 创建一个名为 myproject_gunicorn.conf 的文件:

    # /etc/supervisor/conf.d/myproject_gunicorn.conf[program:myproject_gunicorn]
    command=/usr/local/bin/gunicorn myproject.wsgi:application -c /path/to/myproject/gunicorn_config.py
    directory=/path/to/myproject/
    user=yourusername
    autostart=true
    autorestart=true
    redirect_stderr=true
    

    同样,我们也需要为 Nginx 创建一个名为 nginx.conf 的文件:

    # /etc/supervisor/conf.d/nginx.conf[program:nginx]
    command=/usr/sbin/nginx -g "daemon off;"
    autostart=true
    autorestart=true
    redirect_stderr=true
    
  3. 运行 Supervisor

    安装完 Supervisor 并创建了相关的配置文件后,你就可以让 Supervisor 开始工作了。首先,你需要读取所有新的或修改过的配置文件:

    sudo supervisorctl reread
    

    接着,你可以更新 Supervisor 服务的状态,使其开始运行新添加的程序:

    sudo supervisorctl update
    

    或者,如果你想单独启动某个程序,比如 myproject_gunicorn (也就是上面的Django),你可以这样做:

    sudo supervisorctl start myproject_gunicorn
    

相关文章:

通过Gunicorn、Supervisor和Nginx更好地运行Django

文章目录 通过runserver运行Django通过Gunicorn运行Django通过Nginx来做反向代理通过Supervisor来托管gunicorn和nginx 同步发布在个人站点:https://panzhixiang.cn 通过runserver运行Django 相信用过Django做开发的人对于python manage.py runserver 这个命令一定…...

[SQL] union all

UNION ALL 是一个用于合并多个查询结果集的操作符。它将多个 SELECT 查询的结果合并成一个结果集,并且保留所有的行,包括重复的行。 具体语法如下: SELECT column1, column2, ... FROM table1 UNION ALL SELECT column1, column2, ... FROM…...

Filebeat+Kafka+ELK日志分析架构

目录 一、zookeeper: 1. zookeeper 定义: 2. Zookeeper 工作机制: 3. Zookeeper 特点: 4. Zookeeper 数据结构: 5. Zookeeper 应用场景: 5.1 统一命名服务: 5.2 统一配置管理: 5.3 统一集群管理: 5.4 服务器动态上下线: 5.5 软负载均衡: 6. Zookeeper 选…...

RK3568驱动指南|第六篇-平台总线-第55章 初识设备树

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…...

【ELK 使用指南 1】ELK + Filebeat 分布式日志管理平台部署

ELK和EFLK 一、前言1.1 日志分析的作用1.2 需要收集的日志1.3 完整日志系统的基本特征 二、ELK概述2.1 ELK简介2.2 为什么要用ELK?2.3 ELK的组件 三、ELK组件详解3.1 Logstash3.1.1 简介3.1.2 Logstash命令常用选项3.1.3 Logstash 的输入和输出流3.1.4 Logstash配置文件 3.2 E…...

Springboot高频应用注解

本文旨在记录开发中遇到的SpringBoot高频注解,并针对其具体应用记录。 一、LOMBOK相关注解 Slf4j 目的在于使用Log的日志功能,可以在JAVA中自动生成日志记录器!使用时在类上添加Slf4j注解后即可以在类中调用log方法如 可以 调用 log.info …...

面试总结分享:25道数据库测试题

1)什么是数据库测试? 数据库测试也称为后端测试。数据库测试分为四个不同的类别。数据完整性测试 数据有效性测试 数据库相关的性能 测试功能,程序和触发器 2)在数据库测试中,我们需要正常检查什么? 通常&a…...

和硕首次参加展OCP 峰会,将发布多项AI合作项目产品 | 百能云芯

电子代工大厂和硕联合科技宣布,将参与今年的 OCP 全球峰会 (OCP Global Summit),展示与英伟达 (NVIDIA) 合作成果,包含使用英伟达 GH200 Grace Hopper 超级芯片的 MGX AI 服务器,以及搭载 A100、L40 等服务器产品。 OCP 峰会于 10…...

FPGA基于1G/2.5G Ethernet PCS/PMA or SGMII实现 UDP 网络视频传输,提供工程和QT上位机源码加技术支持

目录 1、前言版本更新说明免责声明 2、我这里已有的以太网方案3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条UDP协议栈UDP视频数据组包UDP协议栈数据发送UDP协议栈数据缓冲IP地址、端口号的修改Tri Mode Ethernet MAC1G/2.5G Ethernet PCS/PMA or SGMIIQT上位机和源…...

小程序setData动态传递key

有些时候可能需要根据key是个变量 比如 let keyName "name" this.setData({keyName :"张三" })本来想将keyName替换为name的,但是小程序只会在data中定义一个key为keyName ,value为“张三”的一条数据。 正确写法为: let keyNam…...

boost Geometry

boost::Geometry boost作为C中最常用的第三方库,Geometry库里面拥有大量的开源算法。 函数作用get获取几何图形(通常为点)的坐标值get (with index)获取框或段的坐标值set设置几何图形(通常为点)的坐标值set (with i…...

凉鞋的 Unity 笔记 201. 第三轮循环:引入变量

201. 第三轮循环:引入变量 在这一篇,我们进行第三轮 编辑-测试 循环。 在之前我们编写了 输出 Hello Unity 的脚本,如下: using System.Collections; using System.Collections.Generic; using UnityEngine;public class FirstGameObject …...

小魔推短视频裂变工具,如何帮助实体行业降本增效?

在如今的互联网时代,大多数的实体老板都在寻找不同的宣传方法来吸引客户,现在短视频平台已经成为重中之重的获客渠道之一,而如何在这个日活用户超7亿的平台获取客户,让更多人知道自己的门店、自己的品牌,泽成为了不少老…...

VBA技术资料MF71:查找所有空格并替换为固定字符

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…...

c++小知识

内联函数 inline 用来替换宏函数 不能分文件编辑 在c语言中#define NULL 0在c中使用nullptr表示空指针class内存的大小计算规则使用的是内存对齐 没有成员,但是还有1个字节,我们使用这个来标记他是个类 类成员函数不存在于类中 为什么每个对象使用的…...

C#上位机序列9: 批量读写+事件广播

1. 读取配置文件及创建变量信息(点位名称,地址,数据类型(bool/short/int/float/long/double)) 2. 读任务&写任务,数据有变化时事件广播通知 using HslCommunication; using HslCommunication.Core; usi…...

ARM +FPGA GPIB IP核实现

目前在数据发生其技术上居领先的是美国的 Tektronix 公司和 Agilent 公司。 Agilent 公司的台式脉冲 / 数据发生器家族的最高时钟频率达 3GHz (定 时发生器),数据发生器 E81200 在通道数为 8CH 时数据速率为 660Mb/s, 即可以产…...

有消息称苹果Vision Pro会有廉价版

据外媒爆料,苹果公司苹果正在研发的头显产品Vision Pro,将会有廉价版。据透露,这款产品预计售价在1500美元至2500美元之间,虽然仍不算低,但较现有的Vision Pro 3499美元的起售价,还是有明显降低。 透露廉价…...

jenkins整合gerrit

背景 公司项目之前使用jenkins整合了gitlab,后面代码迁移到gerrit,所以需要修改jenkins配置。下面就简单的介绍一下jenkins如何整合gerrit。 环境 服务器:linux 环境:docker、jenkins 代码仓库:gerrit 前提 docke…...

PMP考完后应该考什么?

PMP(项目管理专业)认证是全球范围内最受认可和尊重的项目管理资格证书之一。通过PMP考试的人已经展示了他们在项目管理领域的知识和技能。然而,项目管理是一个不断发展和变化的领域,持续学习和进一步提升自己的能力是非常重要的。…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...