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

Python WSGI HTTP Server - Gunicorn

基本概念

Gunicorn,也称为“Green Unicorn”,是一个Python WSGI HTTP Server,用于运行Python Web应用程序。WSGI(Web Server Gateway Interface)是Python应用程序和Web服务器之间的一个接口,允许应用程序和服务器进行交互。Gunicorn常常与Django、Flask等Web框架一起使用,但它可以与任何WSGI兼容的应用程序一起工作。

以下是关于Gunicorn的详细介绍:

1. 主要特性:

  • 轻量级: 它是纯Python编写的,没有其他外部依赖。

  • 性能优化: 能够运行多个工作进程,充分利用多核CPU。

  • 兼容性: 它遵循WSGI标准,与大多数Python Web框架兼容。

  • 简单性: 配置和部署都很简单。

2. 工作方式:

Gunicorn使用一个主进程和多个工作进程的模型。主进程管理工作进程,工作进程处理到来的Web请求。每个工作进程是单线程的,并且完全独立,因此可以在多个CPU核心上并行运行。

3. 为什么选择Gunicorn?:

  • 并发: 利用多进程模型,可以有效地处理多个并发连接。

  • 简易的集成: 与NGINX或Apache等Web服务器一起工作效果很好。

  • 健壮性: 如果一个工作进程失败,其他进程仍然可以继续处理请求。

4. 使用和配置:

启动Gunicorn非常简单。例如,如果有一个Flask应用名为app.py,可以这样启动:

gunicorn app:app

在上述命令中,第一个app指的是文件名,而第二个app是文件内的Flask应用实例。

Gunicorn提供了很多命令行选项,允许我们调整工作进程数、绑定地址和端口、设置超时等。

5. 与其他WSGI服务器的比较:

虽然Gunicorn是WSGI服务器中的流行选择,但还有其他选项如uWSGI、mod_wsgi等。不同的项目可能更适合使用不同的服务器,取决于部署需求和个人/团队的喜好。

6. 注意事项:

  • 尽管Gunicorn可以直接面向公网,但建议将其放置在反向代理(如NGINX)后面,以提供额外的缓冲和安全性。

  • 定期检查Gunicorn的更新,并确保使用最新版本,以获得性能和安全性的改进。

  • 对于需要长时间运行的请求或WebSockets等特定用例,Gunicorn可能不是最佳选择,需要考虑其他解决方案。

总之,Gunicorn是一个在Python Web开发社区中广受欢迎的WSGI服务器,它结合了简单性、性能和健壮性。


常用启动命令

gunicorn -w 1 -b 0.0.0.0:5000 app:app --daemon

当运行上述的 gunicorn 命令,实际上是在启动一个 Gunicorn服务器,用于为Python web应用程序提供服务。让我们详细解析这个命令:

  1. gunicorn: 这是实际的命令,它启动了Gunicorn服务器。

  2. -w 1 or --workers 1: 这指定了工作进程的数量。在这种情况下,有一个工作进程来处理请求。在生产环境中,我们可能希望增加工作进程的数量,尤其是对于I/O密集型任务,使其与可用的CPU核心数相匹配(或稍微多一些)。

  3. -b 0.0.0.0:5000 or --bind 0.0.0.0:5000: 这告诉Gunicorn在哪里监听传入的请求。在这种情况下,它绑定到所有可用的IP地址 (0.0.0.0) 并在端口 5000 上监听。

    • 0.0.0.0: 表示Gunicorn应该监听来自任何IP地址的请求,这使得应用程序可以从任何机器上被访问。
    • 5000: 这是Gunicorn应该监听的端口号。
  4. app:app: 这指定了WSGI应用程序的位置。在这种情况下,它告诉Gunicorn在 app 模块(通常是 app.py 文件)中查找名为 app 的WSGI应用实例。

  5. --daemon: 这个参数告诉Gunicorn在后台运行,这意味着命令会立即返回,Gunicorn服务器将在后台进程中运行。

总结一下:这个命令使用一个工作进程在所有IP地址的端口5000上启动了Gunicorn服务器,并在后台运行它。服务器加载的WSGI应用程序位于名为 app 的模块中,并命名为 app


后台启动后如何查看日志

当使用 gunicorn 并使用 --daemon 标志来后台运行它时,进程会转到后台模式。在这种情况下,我们可能希望能够查看应用的日志。

以下是关于日志的一些建议:

  1. 指定日志文件: 可以使用 --access-logfile--error-logfile 参数来分别指定访问日志和错误日志的文件位置。

    gunicorn -w 1 -b 0.0.0.0:5000 app:app --daemon --access-logfile /path/to/access.log --error-logfile /path/to/error.log
    

    然后,可以使用 tail 命令来查看这些日志:

    tail -f /path/to/access.log
    

    tail -f /path/to/error.log
    
  2. 查看进程: 如果没有指定日志文件,可以使用以下命令查看与 gunicorn 相关的进程:

    ps aux | grep gunicorn
    

    但这只会显示进程信息,而不是实际的日志。

  3. 不使用守护模式: 如果只是在开发环境中,或者只是想快速查看日志,也可以考虑不使用 --daemon 标志来运行 gunicorn。这样,日志信息将直接输出到控制台。

  4. 集成日志系统: 对于生产环境,可能希望使用像 logrotate 这样的工具来管理我们的日志文件,以确保它们不会变得太大。也可以考虑使用日志集成服务,如 SentryDatadogLoggly,以便在集中位置管理和监控日志。

总的来说,要确保指定了日志文件位置,这样就可以很容易地查看和管理日志。

相关文章:

Python WSGI HTTP Server - Gunicorn

基本概念 Gunicorn,也称为“Green Unicorn”,是一个Python WSGI HTTP Server,用于运行Python Web应用程序。WSGI(Web Server Gateway Interface)是Python应用程序和Web服务器之间的一个接口,允许应用程序和…...

[论文笔记]GPT-2

引言 今天继续GPT系列论文, 这次是Language Models are Unsupervised Multitask Learners,即GPT-2,中文题目的意思是 语言模型是无监督多任务学习器。 自然语言任务,比如问答、机器翻译、阅读理解和摘要,是在任务相关数据集上利用监督学习的典型方法。作者展示了语言模型…...

第十三届蓝桥杯模拟赛第三期

A.填空题 问题描述 请问十六进制数 2021ABCD 对应的十进制是多少? 参考答案 539077581 import java.math.*; public class Main {public static void main(String[] args) {String strnew BigInteger("2021ABCD",16).toString(10);System.out.printl…...

代碼隨想錄算法訓練營|第四十四天|01背包问题 二维、01背包问题 一维、416. 分割等和子集。刷题心得(c++)

目录 01背包問題 - DP二維數組 01 背包問題描述 暴力解 動態規劃 確認DP數組以及下標的含意 確定遞推公式 01背包问题 一维 一维DP 数組(滾動数組) 動態規劃五部曲 定義DP数組以及其下標含意 遞推公式 初始化 遍歷順序 讀題 416. 分割等和子集 自己看到题目的第…...

【算法训练-回溯算法 零】回溯算法解题框架

抽象地说,解决一个回溯问题,实际上就是遍历一棵决策树的过程,树的每个叶子节点存放着一个合法答案。你把整棵树遍历一遍,把叶子节点上的答案都收集起来,就能得到所有的合法答案。站在回溯树的一个节点上,你…...

GAN.py

原代码地址:github.com/zqhang/MTGFLOW 目录 def ConvEncoder() def ConvDecoder() class CNNAE(torch.nn.Module): class R_Net(torch.nn.Module): class D_Net(torch.nn.Module): def R_Loss() def D_Loss(&#xff09…...

C语言动态内存管理

1.为什么要动态内存分配? int val 20; int a[10]{0};上面我们声明并定义了一个大小为4字节的整型变量,一个容量为10*4字节的整型数组。 开辟方式:我们在栈上开辟。 开辟空间的方式有两个特点: 1. 空间开辟 大小是固定 的。 2. 数组在申明…...

小红书商品详情API接口(商品详情页面数据接口)

小红书商品详情API接口(商品详情页面数据接口 小红书商品详情API接口(商品详情页面数据接口)代码对接如下: 1.公共参数 名称类型必须描述keystring是get请求方式拼接在url中,点击获取api_namestring是 api接口名称cachestrin…...

nginx配置文件的内容解释和简化方案

文章目录 配置文件内容理解配置文件精简nginx.confapp1.conf 配置文件内容理解 events {worker_connections 1024; }http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;client_max_body_size 50m;client…...

Java设计模式之访问者模式(Visitor Pattern)

访问者模式(Visitor Pattern)是一种行为型设计模式,它允许在不修改现有对象结构的情况下定义新的操作。该模式将操作封装在一个访问者对象中,使得可以在不改变被访问对象的类的前提下,通过访问者对象对被访问对象进行新…...

others-AppLovin广告接入

title: others-AppLovin广告接入 categories: Others tags: [广告, AppLovin] date: 2023-10-20 10:07:01 comments: false mathjax: true toc: true others-AppLovin广告接入 前篇 官方 - https://www.applovin.com/ Android sdk - https://github.com/AppLovin/AppLovin-MAX…...

ESP32集成开发环境Espressif-IDE安装 – Windows

陈拓 2023/10/15-2023/10/16 1. 概述 Espressif IDE是一个基于Eclipse CDT的集成开发环境(IDE),用于使用ESP-IDF框架开发物联网应用程序。这是一个专门为ESP-IDF构建的独立定制IDE。Espressif IDE附带了IDF Eclipse插件、重要的Eclipse CDT插…...

python之if else语句介绍

python之if else语句介绍 在Python中,if和else是两种重要的控制流语句,它们用于根据特定的条件来执行不同的代码块。以下是它们的用法和详细介绍: 1)if语句 if语句用于在满足某种条件时执行特定的代码块。它的基本语法如下&#…...

Java版ORM最初雏形

经过一个晚上的加班,终于把ORM初步结构工程搭好了。工程依赖有点难用,编辑器提示比VS差很多。 首先LIS.Core创建一个最初的容器雏形,先能反射得到对象给ORM获得数据库驱动 然后ORM创建数据库驱动差异接口,不同数据库实现接口后配…...

黎曼几何与切空间之间的投影

公式: 从黎曼空间投影到切空间,其中P为黎曼均值,也是切空间的参考中心点,Pi是要投影到切空间的点。 从切空间投影回来,其中Si为切空间中的向量。 function Tcov CovToTan(cov,Mcov)Cm12 Mcov^(-1/2);X_new logm(Cm…...

【Tomcat】为Tomcat服务配置本地Apr库以提升性能

关于 apr 和 apr-util 对 Tomcat 服务的性能提升的说明: 要测APR给tomcat带来的好处最好的方法是在慢速网络上(模拟Internet),将Tomcat线程数开到300以上的水平,然后模拟一大堆并发请求。如果不配APR,基本…...

普通人在当前大环境下——少看宏观,多看具体

前言 宏观叙事,简而言之,就是从宏观把握历史社会的发展,寻找其中永恒的共性。我们大概听过此类的话:贸易战导致本地经济下滑、气候变化是因为过去几十年的工业发展、大环境不行导致不赚钱。此类叙事方式,身边人聊的甚欢,在媒体、社交圈、日常社群交流中,随处可见。以前…...

用echarts在vue2中实现3d饼图

先看效果,再看文章: 一、安装插件 3d的图不仅用到echarts,还用到了echarts-gl,因此都需要安装一下哦~ npm install echarts npm install echarts-gl2.0.9 //可以指定版本,也可不指定二、在main.js中引入 import * …...

低代码助力软件开发

低代码开发工具正在日益变得强大,它正不断弥合着前后端开发之间的差距。对于后端来说,基于低代码平台开发应用时,完全不用担心前端的打包、部署等问题,也不用学习各种框架(Vue、React、Angular等等)&#x…...

C嘎嘎之类和对象上

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:掌握类的引用和定义,熟悉类成员函数的…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性&#xf…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​:Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...