返回介绍

Python 应用服务器

发布于 2025-04-20 18:52:15 字数 2535 浏览 0 评论 0 收藏

Python 的 Web 框架(如 Flask、Django)自带 Web 服务器的目的是用于开发,而不是生产环境。那么,生产环境中有哪些应用服务器可以选择呢?

我们首先了解一下 WSGI 协议。

WSGI 协议

Web 框架和 Web 服务器之间需要进行通信,如果在设计时它们之间无法相互匹配,那么对框架的选择就会限制对 Web 服务器的选择,这显然是不合理的。这时候需要设计一套双方都遵守的接口。WSGI 是 Python Web Server Gateway Interface 的简称。WSGI 标准在 PEP 333 中定义并被许多框架实现,它规定了一种在 Web 服务器与 Web 应用程序/框架之间推荐的标准接口,以确保 Web 应用程序在不同的 Web 服务器之间具有可移植性。在后来的 PEP 3333 中添加了 Python 3 的支持和更多相关的说明。有了通用的 WSGI 协议,Web 开发者就能够任意选择适合自己的组合,而 Web 服务器和 Web 框架的开发者们也能够把精力集中到各自的领域。

常见的 WSGI 容器

WSGI 是一个同步接口,所以 Tornado 的 WSGI 容器是无法实现异步的。主流的选择是 Gunicorn 和 uWSGI。

Gunicorn

Gunicorn 易于配置,兼容性好,CPU 消耗很少,在豆瓣使用广泛。它支持多种 Worker 模式,推荐的模式有如下几种。

  • 同步 Worker:默认模式,也就是一次只处理一个请求。
  • 异步 Worker:通过 Eventlet、Gevent 实现的异步模式。
  • 异步 IO Worker:目前支持 gthread 和 gaiohttp 两种类型。

我们先安装它:

> pip install gunicorn

Gunicorn 的启动非常简单,语法如下:

> gunicorn [OPTIONS] MODULE_NAME:VARIABLE_NAME

我们看一个最简单的例子(app.py):

from flask import Flask
app=Flask(__name__)


@app.route('/')
def hello_world():
return 'Hello'


if__name__=='__main__':
    app.run(host='0.0.0.0', port=9000)

可以使用如下命令启用应用:

> gunicorn --workers=3 chapter6.section1.app:app-b 0.0.0.0:9000

chapter6.section1 是模块目录的名字,第一个 app 是模块文件名字,第二个 app 是文件中 Flask 实例的名字。

Worker 的数量并不是越多越好,推荐值是 CPU 的个数× 2+1,CPU 个数使用如下的方式获取:

> python-c 'import multiprocessing;print multiprocessing.cpu_count()'
1

虚拟机只有 1 个 CPU,可以启动 3 个 Worker(1*2+1)。

uWSGI

uWSGI 是使用 C 编写的,实现了自有的 uwsgi 协议的 Web 服务器。它自带丰富的组件,其中核心组件包含进程管理、监控、IPC 等功能,实现应用服务器接口的请求插件支持多种语言和平台,比如 WSGI、Rack、Lua WSAPI,网关组件实现了负载均衡、代理和路由功能。

我们先安装它:

> pip install uwsgi

它的启动命令要相对复杂一些,有非常多的选项:

> uwsgi--http 0.0.0.0:9000--wsgi-file chapter6/section1/app.py--callable app--
    processes 4--threads 2--stats 0.0.0.0:5000

上面的命令表示启动了 4 个进程,每个进程使用 2 个线程,而且开启了 5000 的 Web 接口,返回监控 uWSGI 的信息,以及不同进程和线程的详细使用情况。

使用 uWSGI 时,一定要先读一读官网的 Things to know (best practices and“issues”) READ IT !!! (http://bit.ly/2bd1ULz )。其中有两点非常重要:

  • --http-socket 和--http 其实是完全不同的两个选项。如果想直接裸跑 uWSGI,应该使用--http,它产生一个额外的进程将请求转发给 Workers,如果希望它被反向代理(比如和 Nginx 一起来用),应该使用--http-socket。
  • 合理的进程数和线程数不能简单地通过 CPU*2 来计算得出,需要不断尝试而找到最佳值。除了 uWSGI 提供的监控服务器,uwsgitop(http://bit.ly/2bo5z7s )也是一个非常好的帮助我们找到这个最佳值的工具。uwsgitop 接收的唯一参数就是对应的--stats 的参数(比如上面的 0.0.0.0:5000)或者 socket 文件的地址。

除此之外,Twisted Web 和 Gevent 也提供了 WSGI 容器,但不推荐在生产环境中使用。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。