跳转到主要内容

Rust实现的WSGI服务器。

项目描述

Pyruvate WSGI服务器

https://gitlab.com/tschorr/pyruvate/badges/main/pipeline.svg https://codecov.io/gl/tschorr/pyruvate/branch/main/graph/badge.svg http://img.shields.io/pypi/v/pyruvate.svg

Pyruvate是一个快速的多线程WSGI服务器,使用Rust编写。

特性

安装

如果您使用的是Linux且安装了较新的Python版本,

$ pip install pyruvate

可能只需要这样做。

二进制包

manylinux_2_17musllinux_1_1轮子在x86_64架构和活动的Python 3版本(目前3.8-3.12)中可用。

源代码安装

在macOS上或如果出于任何其他原因您想安装源tar包(例如使用 pip install –no-binary),您首先需要安装Rust

开发安装

  • 安装Rust

  • 安装并激活Python 3(>= 3.8)虚拟环境

  • 使用pip安装setuptools_rust

    $ pip install setuptools_rust
  • 安装Pyruvate,例如使用pip

    $ pip install -e git+https://gitlab.com/tschorr/pyruvate.git#egg=pyruvate[test]

在您的WSGI应用程序中使用Pyruvate

通过TCP端口使用Python

一个使用Pyruvate监听在127.0.0.1:7878并使用2个工作线程的hello world WSGI应用程序如下所示

import pyruvate

def application(environ, start_response):
    """Simplest possible application object"""
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers, None)
    return [b"Hello world!\n"]

pyruvate.serve(application, "127.0.0.1:7878", 2)

通过Unix套接字使用Python

一个使用Pyruvate监听在unix:/tmp/pyruvate.socket并使用2个工作线程的hello world WSGI应用程序如下所示

import pyruvate

def application(environ, start_response):
    """Simplest possible application object"""
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers, None)
    return [b"Hello world!\n"]

pyruvate.serve(application, "/tmp/pyruvate.socket", 2)

使用PasteDeploy

再次监听在127.0.0.1:7878并使用2个工作线程

[server:main]
use = egg:pyruvate#main
socket = 127.0.0.1:7878
workers = 2

配置选项

套接字

必需:Pyruvate应该绑定的TCP套接字。 Pyruvate 也支持 systemd套接字激活 如果您将套接字值指定为 NonePyruvate 将尝试获取由 systemd 绑定的套接字。

工作线程

必需:要使用的工作线程数量。

异步日志记录

可选:使用专用线程异步记录日志。默认为 True

分块传输

可选:如果没有Content-Length头,是否使用分块传输编码。默认为 False

保持连接超时

可选:指定保持连接的超时时间(以整数秒为单位)。在超时后,持久连接将被关闭。默认为60秒。

最大头部数量

可选:将解析的最大请求数量。如果请求包含比配置更多的头部,则请求处理将停止,并显示一个错误,指示请求不完整。默认为32个头部。

最大重用次数

可选:指定多久重用一次现有连接。将此参数设置为0将有效地禁用保持连接。这是默认值。

qmon警告阈值

可选:请求队列中请求数量的警告阈值。如果队列中的请求数量达到此值,将记录一条警告。该值必须是正整数。默认为 None,这将禁用队列监控。

发送超时

可选:在EAGAIN后等待客户端连接可用于写入的时间(以秒为单位)。在此时间内没有收到数据的连接将被关闭。该值必须是正整数。默认为60秒。

日志记录

Pyruvate使用标准的 Python日志设施。记录器名称为 pyruvate。有关配置选项,请参阅Python文档(logginglogging.config)。

示例配置

Django

在您的Django虚拟环境中安装Pyruvate后,创建或修改您的 wsgi.py 文件(一个工作线程监听在127.0.0.1:8000)

import os
import pyruvate

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_django_application.settings")

application = get_wsgi_application()

pyruvate.serve(application, "127.0.0.1:8000", 1)

现在您可以使用以下命令启动Django + Pyruvate

$ python wsgi.py

根据需要使用 DJANGO_SETTINGS_MODULE 环境变量覆盖设置。已测试与 Django 4.1.x, 3.2.x, 2.2.x

MapProxy

首先根据 MapProxy部署文档 创建基本的WSGI配置。然后修改 config.py 以使用Pyruvate(2个工作线程监听在127.0.0.1:8005)

import os.path
import pyruvate

from mapproxy.wsgiapp import make_wsgi_app
application = make_wsgi_app(r'/path/to/mapproxy/mapproxy.yaml')

pyruvate.serve(application, "127.0.0.1:8005", 2)

从您的虚拟环境启动

$ python config.py

已测试与 Mapproxy 1.15.x, 1.13.x, 1.12.x

Plone

使用 pip

在您的Plone虚拟环境中安装Pyruvate后,更改 zope.ini 文件中的 server 部分(如果使用 mkwsgiinstance 创建实例,则位于 instance/etc

[server:main]
use = egg:pyruvate#main
socket = localhost:7878
workers = 2
使用 zc.buildout

使用 zc.buildoutplone.recipe.zope2instance,您可以使用 Pyruvate 的 PasteDeploy 入口点定义实例部分

[instance]
recipe = plone.recipe.zope2instance
http-address = 127.0.0.1:8080
eggs =
    Plone
    pyruvate
wsgi-ini-template = ${buildout:directory}/templates/pyruvate.ini.in

模板中提供的 wsgi-ini-template 选项的 server 部分,应如下所示(3个工作进程监听在 http-address 上,该地址在 buildout 的 [instance] 部分中指定)

[server:main]
use = egg:pyruvate#main
socket = %(http_address)s
workers = 3

在包的 示例目录 中有一个为 Plone 5.2 提供的最小 buildout 示例配置。

已在 Plone 6.0.x, 5.2.x 上测试。

Pyramid

使用 pip 在您的 Pyramid 虚拟环境中安装 Pyruvate

$ pip install pyruvate

修改您的 .ini 文件中的服务器部分,以使用 Pyruvate 的 PasteDeploy 入口点(监听在 127.0.0.1:7878 并使用 5 个工作进程)

[server:main]
use = egg:pyruvate#main
socket = 127.0.0.1:7878
workers = 5

使用 pserve 正常启动您的应用程序

$ pserve path/to/your/configfile.ini

已在 Pyramid 2.0, 1.10.x 上测试。

Radicale

您可以在包的 示例目录 中找到 Radicale 的示例配置。已在 Radicale 3.1.8 上测试。

Nginx 设置

与其他 WSGI 服务器一样,Pyruvate 应该位于反向代理之后,例如 Nginx

....
location / {
    proxy_pass http://localhost:7878;
    ...
}
...

Nginx 默认不使用 keepalive 连接,因此如果您想使用持久连接,您需要 修改您的配置

变更日志

1.3.0 (2024-07-04)

  • 切换回 rust-cpython (#29)

1.3.0-rc1 (2023-12-28)

  • 用 PyO3 (#28) 替换 rust-cpython

  • 添加对 Python 3.12 的支持

  • 停止对 Python 3.7 的支持

1.2.2 (2023-07-02)

  • 记录 Unix Domain Socket 的使用情况 (#27)

  • 提供传统的 manylinux 轮子名称 (#26)

1.2.1 (2022-12-22)

  • 跟踪并删除未完成但未产生错误的响应 (#23)

  • 构建 musllinux_1_1 轮子 (#24)

1.2.0 (2022-10-26)

  • 支持 Python 3.11,停止支持 Python 3.6,在构建轮子时切换到 manylinux2014 (#19)

  • 添加请求队列监控器 (#17)

  • 移除阻塞的工作进程 (#18)

  • 改进 Content-Length 标头的解析 (#20)

1.1.4 (2022-04-19)

  • 修复空列表响应的处理 (#14)

  • 支持套接字地址中的主机名 (#15)

1.1.3 (2022-04-11)

  • 简化响应写入并提高性能 (#12)

  • 改进信号处理 (#13)

1.1.2 (2022-01-10)

  • 迁移到 Rust 2021

  • 使用 codecov 二进制上传器

  • 添加 CONTRIBUTING.rst

  • 修复:当没有 Content-Length 标头时,wrk 基准测试工具可能导致 pyruvate 挂起 (#11)

1.1.1 (2021-10-12)

  • 支持 Python 3.10

1.1.0 (2021-09-14)

  • 重构 FileWrapper 并提高其性能

  • 增加默认最大头数

  • 添加 Radicale 示例配置

  • 更新开发状态

1.0.3 (2021-06-05)

  • HEAD 请求:不要对内容长度不匹配进行抱怨 (#4)

  • 客户端连接终止的更合适的日志级别 (#5)

  • 简化请求解析

1.0.2 (2021-05-02)

  • 在应用程序提供的Content-Length头中指定的实际内容长度小于Content-Length时,关闭连接并记录错误。

  • 修复readme文件。

1.0.1 (2021-04-28)

  • 修复包含非ASCII字符的URL的解码。

  • 当响应包含除字节字符串以外的对象时,引发Python异常,而不是简单地记录错误。

1.0.0 (2021-03-24)

  • 改进查询字符串处理。

0.9.2 (2021-01-30)

  • 更好地支持HTTP 1.1 Expect/Continue。

  • 改进文档。

0.9.1 (2021-01-13)

  • 改进GIL处理。

  • 将工作线程名称传播到Python日志记录。

  • 不要将broken pipe报告为错误。

  • PasteDeploy入口点:修复选项处理。

0.9.0 (2021-01-06)

  • 可重用连接。

  • 分块传输编码。

  • 支持macOS。

0.8.4 (2020-12-12)

  • 降低CPU使用率。

0.8.3 (2020-11-26)

  • 清理wheel构建目录。

  • 修复一些测试隔离问题。

  • 删除一个println。

0.8.2 (2020-11-17)

  • 修复sendfile情况的blocksize处理。

  • 格式化Unix流对等地址。

  • 使用最新的mio。

0.8.1 (2020-11-10)

  • 在非阻塞工作线程中,接收器在通道为空时不得阻塞。

0.8.0 (2020-11-07)

  • 日志重整。

  • 新的async_logging选项。

  • 一些性能改进。

  • 支持Python 3.9。

  • 切换到manylinux2010平台标签。

0.7.1 (2020-09-16)

  • 当套接字不可用时引发Python异常。

  • 在readme中添加Pyramid配置示例。

0.7.0 (2020-08-30)

  • 使用Python日志记录。

  • 在启动时显示服务器信息。

  • 修复Unix域套接字的socket激活。

0.6.2 (2020-08-12)

  • 改进日志记录。

  • PasteDeploy入口点现在默认也使用最多24个头。

0.6.1 (2020-08-10)

  • 改进请求解析。

  • 将默认最大头数增加到24。

0.6.0 (2020-07-29)

  • 支持Unix域套接字。

  • 改进sendfile使用。

0.5.3 (2020-07-15)

  • 修复EAGAIN情况下完成sendfile调用的测试。

0.5.2 (2020-07-15)

  • 修复EAGAIN情况下完成响应的测试。

  • Cargo更新。

0.5.1 (2020-07-07)

  • 修复处理读取事件。

  • 修复更改日志。

  • Cargo更新。

  • “中断”错误不是待办事项。

  • 删除未使用的代码。

0.5.0 (2020-06-07)

  • 添加对systemd套接字激活的支持。

0.4.0 (2020-06-29)

  • 添加一个执行非阻塞写入的新工作线程。

  • 添加默认参数。

  • 添加配置最大请求数据头的选项。

  • 添加Via头。

0.3.0 (2020-06-16)

  • 切换到rust-cpython。

  • 修复将TCP连接传递给工作线程。

0.2.0 (2020-03-10)

  • 添加了一些Python测试(使用pytest和tox)。

  • 改进HTTP头处理。

  • 使用sendfile时尊重内容长度头。

0.1.0 (2020-02-10)

  • 初始版本。

项目详情。


发布历史 发布通知 | RSS源

下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

pyruvate-1.3.0.tar.gz (61.0 kB 查看哈希值)

上传时间 源代码

构建分发版

pyruvate-1.3.0-cp312-cp312-musllinux_1_1_x86_64.whl (472.1 kB 查看哈希值)

上传时间 CPython 3.12 musllinux: musl 1.1+ x86-64

pyruvate-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (474.7 kB 查看哈希值)

上传时间 CPython 3.12 manylinux: glibc 2.17+ x86-64

pyruvate-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl (472.0 kB 查看哈希值)

上传时间 CPython 3.11 musllinux: musl 1.1+ x86-64

pyruvate-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (474.9 kB 查看哈希值)

上传时间 CPython 3.11 manylinux: glibc 2.17+ x86-64

pyruvate-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl (472.0 kB 查看哈希值)

上传时间 CPython 3.10 musllinux: musl 1.1+ x86-64

pyruvate-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (474.9 kB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.17+ x86-64

pyruvate-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl (472.0 kB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.1+ x86-64

pyruvate-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (474.8 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ x86-64

pyruvate-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl (472.0 kB 查看哈希值)

上传于 CPython 3.8 musllinux: musl 1.1+ x86-64

pyruvate-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (474.7 kB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.17+ x86-64

支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面