通过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考试的人已经展示了他们在项目管理领域的知识和技能。然而,项目管理是一个不断发展和变化的领域,持续学习和进一步提升自己的能力是非常重要的。…...
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️⃣ 成功效果
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

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

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

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...