通过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,对于本地测试来说足够了,但是不能用作生产环境中,甚至测试环境都不行,主要有如下几点问题:
-
性能差
它是单进程、单线程的,因此只能同时处理一个请求。随着请求量的增加,服务器的 CPU 和内存使用率会不断上升,最终导致性能下降 -
功能有限
它仅支持基本的 HTTP 请求,不支持 HTTPS、负载均衡、静态文件服务等功能。在生产环境中,这些功能是必不可少的。
通过Gunicorn运行Django
正式使用Gunicorn之前,先说一下它的优点:
(以下内容来自GPT4)
Gunicorn(Green Unicorn)是一个Python的WSGI HTTP服务器,许多大型网站和高性能应用都选用它来托管 Python web 应用。以下是 Gunicorn 的一些主要优点:
简单易用:Gunicorn 非常容易安装和配置。你只需要通过 pip 安装它,并用几行命令就可以启动一个 WSGI 应用。这使得开发者可以更加专注于他们的应用程序代码,而不需要过多关心部署和运维问题。
兼容性强:Gunicorn 全面支持 WSGI 规范,因此理论上与所有遵循该规范的Python web框架兼容,包括但不限于Django、Flask和Pyramid等。
预分叉模型:Gunicorn 使用 Unix 的 fork 系统调用创建子进程(worker),每个 worker 可以独立地处理请求。使用预分叉模型,父进程可以在必要时杀死并重建子进程,提供了对内存泄漏的防护机制。
负载管理:Gunicorn 有多种类型的 worker 可供选择,包括同步 worker 和异步 worker。同步 worker 适合 CPU 密集型任务,而异步 worker 则适合 IO 密集型或网络密集型的任务。这意味着你可以根据自己的应用特性选择最合适的 worker 类型。
错误隔离:由于每个请求都由各自的 worker 进程处理,如果一个请求导致 crash 或者未捕获的异常,那么只会影响到正在处理该请求的 worker,其他 worker 或请求将不受影响。
健壮性和可靠性:Gunicorn 能够自动管理 worker 进程,如果某个 worker 异常退出,Gunicorn 主进程会自动重新启动新的 worker 进程来代替,从而保证服务的持续可用。
配置灵活:Gunicorn 提供了大量的配置选项,你可以控制日志级别、输出位置、worker 数量、请求超时时间、SSL 设置等诸多方面。同时,Gunicorn 支持从 Python 文件、环境变量、命令行参数中读取配置,满足了不同场景下的需求。
热重载:Gunicorn 支持无缝重启,这意味着你可以在不中断服务的情况下升级代码或者配置。
社区支持和文档:最后但同样重要的是,Gunicorn 有一个活跃的开发者社区和详细的官方文档,能够为使用 Gunicorn 的开发者提供大量的帮助和指导。
在使用 Gunicorn 运行 Django 之前,你需要确保已经正确地安装了 Django 和 Gunicorn。假设你的 Django 项目名为 myproject
,并且它位于 /path/to/myproject/
下。
-
安装 Gunicorn
如果你还没有安装 Gunicorn,可以使用 pip 来安装:pip install gunicorn
-
运行 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的简单运行方式,正式环境中不推荐这么使用
-
配置 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作为反向代理,主要有以下优势:
静态文件处理:Nginx 非常擅长处理静态内容(如 CSS、JavaScript 文件或图片),而 Python WSGI 服务器通常并不适合直接服务静态文件,这可能会引发性能问题。通过将静态文件服务任务交给 Nginx,你可以释放出 Gunicorn 的资源来处理动态内容。
负载均衡:如果你有多个后端服务器或者多个 worker 进程,Nginx 可以有效地分配传入请求到各个后端服务器上,实现负载均衡。它还支持多种负载均衡策略和健康检查。
缓冲请求:Nginx 可以为后端提供一层保护,因为它拦截并处理了所有客户端连接。这意味着后端服务器只需要处理完整的请求,无需关心网络问题或慢速连接。此外,如果后端应用挂掉或重启,在这段时间内 Nginx 仍然可以继续为用户提供服务(例如返回一个友好的错误页面)。
SSL 终止:如果你的网站需要 SSL 加密,Nginx 可以处理所有的 HTTPS 握手过程,并与后端服务器进行非加密通信,这样就减轻了后端服务器的负担。
HTTP/2 支持:Nginx 支持 HTTP/2 协议,而大部分 WSGI 服务器包括 Gunicorn 目前还没有直接支持 HTTP/2 的计划。通过在 Nginx 中开启 HTTP/2,你的用户可以享受到更快的加载速度和更低的延迟。
访问控制和安全防护:Nginx 提供了一系列安全相关功能,比如 IP 白名单/黑名单、限速、防止 DDOS 攻击等。
gzip 压缩:Nginx 可以对响应数据进行 gzip 压缩,从而减少网络带宽消耗和提高页面的加载速度。
下面是使用 Nginx 作为 Gunicorn 的反向代理的详细步骤
-
安装 Nginx
在 Ubuntu/Debian 上,你可以通过 apt-get 来安装 Nginx:
sudo apt-get install nginx
-
配置 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 正在监听的地址和端口号} }
-
启动 Nginx
完成配置后,你就可以启动 Nginx 了:
sudo service nginx start
以上就是基本的流程。当然,这只是最简单的配置,如果你需要更高级的特性(比如 HTTPS、负载均衡或缓存),则需要进行更多的配置。建议查阅 Nginx 官方文档 获取更详细的信息。
通过Supervisor来托管gunicorn和nginx
我是在第二份工作中才接触到supervisor的,了解之后就非常喜欢这个工具,最大好处就是托管某一个进程,尤其是如果进程出现问题死掉了,supervisor会自动尝试重启这个进程,这个对于线上环境来说非常重要。
Supervisor
是一个用 Python 写的进程管理工具,可以很方便地用来在 UNIX-like 系统(不支持Windows)下启动、重启(自动)和关闭进程。
以下是如何使用 Supervisor 托管 gunicorn 和 nginx 的步骤:
-
安装 Supervisor
在 Ubuntu/Debian 上,你可以通过 apt-get 来安装 Supervisor:
sudo apt-get install supervisor
-
创建 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
-
运行 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考试的人已经展示了他们在项目管理领域的知识和技能。然而,项目管理是一个不断发展和变化的领域,持续学习和进一步提升自己的能力是非常重要的。…...

科技资讯|苹果Vision Pro可通过手势ID检测不同用户
近日,美国专利局公布了苹果公司的一项专利申请,该专利申请涉及基于手部特征验证用户身份的技术。苹果指出,可能是多个家庭成员都想使用 Apple Vision Pro,系统必须识别不同的手势以控制 visionOS。在另一个示例中,苹果…...

CUDA编程模型- 层次结构
层次结构的划分 在GPU上,为了满足其大规模并行处理的特性,执行模型采用了大量并行化的轻量级线程。当我们谈到CUDA编程模型时,我们首先要考虑的是其线程执行层次结构。这种层次结构起始于一个被称为kernel的函数,当它在GPU上执行…...

国际站阿里云服务器无法安装程序怎么办?
阿里云服务器是阿里云推出的一种云核算产品,它能够帮助企业和个人快速建立、扩展和管理网络服务。可是,有时候在运用阿里云服务器时,或许会遇到无法装置程序的问题。本文将具体介绍如何处理这个问题。 阿里云服务器无法装置程序或许是由多种原…...

基于Vue+webpack之H5打包资源优化
前言 基于公司的业务以及今年接触到的项目大部分都是APP混合开发,即原生Android/ios H5页面开发APP。项目从产品需求的评审到方案的评审再到开发提测...这一套流程下来让我收货颇多。总想找个时间好好记录一番,大概还是自己懒惰了,一直拖到现…...

C#中DataAdapter对象
目录 一、DataAdapter对象概述 二、Fill()方法填充数据集DataSet 1.举例 2.源码 3.生成效果 三、Update()方法 1.Update()方法更新数据源 2.设置数据库主键 3.源码 4.生成效果 一、DataAdapter对象概述 DataAdapter对象是一个数据适配器对象,是DataSet与…...

Nginx正向代理,反向代理,负载均衡
Nginx正向代理,反向代理,负载均衡 Nginx当中有两种代理方式: 七层代理(http协议) 四层代理(tcp/udp流量转发) 七层代理:七层代理,代理的是http的请求和响应 客户端请求…...

安防视频监控平台EasyCVR出现视频流播放卡顿情况,如何优化?
视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…...

VRRP基础
1.VRRP概述 VRRP( Virtual Router Redundancy Protocol,虚拟路由器冗余协议)既能够实现网关的备份,又能解决多个网关之间互相冲突的问题,从而提高网络可靠性。 通过把几台路由设备联合组成一台虚拟的“路由设备”&…...

虚实融合 智兴百业 | 赵捷副市长莅临拓世科技集团筹备展台指导,本月19号!拓世科技集团与您相约世界VR产业大会
新时代科技革命中,虚拟现实技术、5G和“元宇宙”概念崛起,助力全球范围内的数字经济和产业转型。我国也正迈向高质量发展攻坚阶段,在中部腹地的江西,政府结合全球技术趋势和自身发展需求,选择虚拟现实为新的经济增长点…...

2000-2023年省市县人工智能企业数量数据
2000-2023年省市县人工智能企业数量数据 1、时间:2000-2023年7月 2、指标:所属年度、所属省份、所属城市、所属区县、人工智能企业数量(省人工智能企业数量、地级市人工智能企业数量、区县人工智能企业数量) 3、来源࿱…...