Rust实现的WSGI服务器。
项目描述
Pyruvate WSGI服务器
Pyruvate是一个快速的多线程WSGI服务器,使用Rust编写。
特性
使用mio进行非阻塞读写
使用httparse进行请求解析
基于rust-cpython的Python接口
基于threadpool的worker池
PasteDeploy入口点
安装
如果您使用的是Linux且安装了较新的Python版本,
$ pip install pyruvate
可能只需要这样做。
二进制包
manylinux_2_17和musllinux_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套接字激活 如果您将套接字值指定为 None,Pyruvate 将尝试获取由 systemd 绑定的套接字。
- 工作线程
必需:要使用的工作线程数量。
- 异步日志记录
可选:使用专用线程异步记录日志。默认为 True。
- 分块传输
可选:如果没有Content-Length头,是否使用分块传输编码。默认为 False。
- 保持连接超时
可选:指定保持连接的超时时间(以整数秒为单位)。在超时后,持久连接将被关闭。默认为60秒。
- 最大头部数量
可选:将解析的最大请求数量。如果请求包含比配置更多的头部,则请求处理将停止,并显示一个错误,指示请求不完整。默认为32个头部。
- 最大重用次数
可选:指定多久重用一次现有连接。将此参数设置为0将有效地禁用保持连接。这是默认值。
- qmon警告阈值
可选:请求队列中请求数量的警告阈值。如果队列中的请求数量达到此值,将记录一条警告。该值必须是正整数。默认为 None,这将禁用队列监控。
- 发送超时
可选:在EAGAIN后等待客户端连接可用于写入的时间(以秒为单位)。在此时间内没有收到数据的连接将被关闭。该值必须是正整数。默认为60秒。
日志记录
Pyruvate使用标准的 Python日志设施。记录器名称为 pyruvate。有关配置选项,请参阅Python文档(logging,logging.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
Plone
使用 pip
在您的Plone虚拟环境中安装Pyruvate后,更改 zope.ini 文件中的 server 部分(如果使用 mkwsgiinstance 创建实例,则位于 instance/etc)
[server:main] use = egg:pyruvate#main socket = localhost:7878 workers = 2
使用 zc.buildout
使用 zc.buildout 和 plone.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)
1.2.1 (2022-12-22)
1.2.0 (2022-10-26)
1.1.4 (2022-04-19)
1.1.3 (2022-04-11)
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)
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)
初始版本。
项目详情。
pyruvate-1.3.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7debedaa98cb65858ddfff4193a115ca3b207aef803bdb09ef93f854d5ecfdba |
|
MD5 | b0334b28d7074cef1299343c4dfa8556 |
|
BLAKE2b-256 | 72e29050c8f85a55305b716967b75d69e377d355940cd2a05c9722135140232a |
pyruvate-1.3.0-cp312-cp312-musllinux_1_1_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 515cfa85863f793a9be72d95d2dce4c907a94af1fdfbfc24bfcf572907df8e18 |
|
MD5 | d490a5481b93ab1206b5ca92e6bcc436 |
|
BLAKE2b-256 | aa3831d84229c957a1ff0cf662f17ba496f4c1f24aa66a1bc8fd3021331b3aa1 |
pyruvate-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9904ff88213e1725a4fe8ae906fd602520e7e438ac13d4a9f18ceacbcbbd9bfb |
|
MD5 | fcd89339d9ccdc2ec2ff63308eda9a8a |
|
BLAKE2b-256 | 374a4ce29946b3633519f1f634f8988dd89bfeb14a7f41e8a3f7d54f24149177 |
pyruvate-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6eb4b60215d3bdf75cbcfc536a6d33cafb70f1d8136d284dfa0a0238cffb2de7 |
|
MD5 | 5fa5ac82a416c80d81548374a787d8c7 |
|
BLAKE2b-256 | 04cd2e67c6340412a9885c29f64d01fa1c95005702f3d7b5ba0bccb5ffbca9dc |
pyruvate-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0e87f507fad4d6eb16e8f9a07bf82bf107b0b09fbe582c8c579c6053cc0fdadd |
|
MD5 | d9c5dbce0f6fbd4ded1210872cbad3af |
|
BLAKE2b-256 | 2f175076a641591d161e52b39dc5dcb60f5abf8e4467695f95c158559088c3b4 |
pyruvate-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8dd809a6311e3f0255cb43853c5822176fc3bc9efe31876e9c562cbd4cae2dcc |
|
MD5 | 8864310c5f1622e5ba178b92482b39d6 |
|
BLAKE2b-256 | 449bd9f6dd29f3515eddde7aee779319b12ba000ef5c031eebcd2de23ed69b88 |
pyruvate-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6bb50688e4a71efff634efde67a0852b8a389e27ad5fe160d76f6202ffe2667b |
|
MD5 | a61bedc890c98c772ce961e133d7c638 |
|
BLAKE2b-256 | aa565fab2c5acef02a06c61dd2c3ec967ed0989f9ce49ee36e5b31bd0ff11a89 |
哈希值 用于 pyruvate-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 023203dc5d5260c527804aa59259dacbda0a794d8d367ed14a09a4f3b14f2910 |
|
MD5 | 761e3482dbcd182a63d8e5cd8cf57293 |
|
BLAKE2b-256 | 7ba32cadf846511ac5b87b353b9473f488e5e9806c4962856bee7b979915c570 |
哈希值 用于 pyruvate-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8dcbad094d1ca6bec8bc7083b8a9ab28fa879f9b6355433484b2f18cc53c4503 |
|
MD5 | ef73dde535cb028c3a230c2d606f1b3e |
|
BLAKE2b-256 | fd53c4f4ad06ee666c813a9c663bd413643d20620ca6765416c22c5c18347da9 |
哈希值 用于 pyruvate-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ebf7f880c71058d48c96634296412dd71e347372a4087b2ad73084d43c853253 |
|
MD5 | 13ed9907648968608a44ee81949bae86 |
|
BLAKE2b-256 | 2f02426249090c8a21a1506d46cc079c10a0a74f1b734cd5cd3aa14a76570e08 |
哈希值 用于 pyruvate-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a99ba7e6c9a02eb92ac383193bfff11e30b6015d6ed132510f826cdfb6fa8741 |
|
MD5 | 2d7dea2ba3d145102c1bedff58d4378f |
|
BLAKE2b-256 | df0a1c05eaf3328554fecd42513501ff36f0cce8661c6e3205645fce5a3bf764 |