Python bottle与uwsgi/bottle和nginx/uwsgi/bottle的比较

11

我正在开发一个基于Python的应用程序(HTTP - REST或jsonrpc接口),将用于生产自动化测试环境中。这将连接到运行所有测试脚本的Java客户端。也就是说,除了测试应用程序本身外,不需要人类访问。

我们希望将其部署在Raspberry Pi上,因此我希望它相对快速且占用空间较小。它可能不会获得大量请求(在最大负载下,每秒可能只有几个),但应该能够长时间运行并保持稳定。

由于Bottle框架简单(只需一个文件),我已经决定使用它。这与Flask进行比较。如果有人认为Flask可能更好,请让我知道原因。

我有点不确定Bottle内置的HTTP服务器的稳定性,因此我正在评估以下三个选项:

  1. 仅使用Bottle - 作为http服务器+应用程序
  2. 在uwsgi之上使用Bottle - 使用uwsgi作为HTTP服务器
  3. 使用nginx / uwsgi与Bottle一起使用

问题:

  • 如果我除了Python / uwsgi之外没有做任何事情,是否有理由将nginx添加到混合物中?
  • uwsgi / bottle(或Flask)组合是否可以考虑为生产就绪?
  • 使用与Bottle内置的HTTP服务器不同的单独HTTP服务器可能会获得任何好处吗?
结果:

1. 如果我只是使用Python / uwsgi,没有理由将nginx添加到混合物中。

2. uwsgi / bottle(或Flask)组合可被视为生产就绪。

3. 使用与Bottle内置的HTTP服务器不同的单独HTTP服务器可能会提供一些好处。

3个回答

15

对于我来说,Flask和Bottle的区别在于以下几点。

  1. 应用程序有多简单。如果非常简单,那么我选择Bottle。否则,我就使用Flask。Bottle只是一个文件,因此只需将文件包含在源文件中,即可轻松部署。但是,Bottle只是一个文件这一事实应该很好地说明它没有实现完整的WSGI规范及其所有边缘情况。
  2. 应用程序要做什么。如果需要呈现除Python->JSON之外的任何内容,则我选择Flask,因为它内置了对Jinja2的支持。如果我需要进行身份验证和/或授权,则Flask已经拥有了很好的扩展来处理这些要求。如果我需要进行缓存,则Flask-Cache存在并且在最少的设置下表现出色。我不确定Bottle可以提供哪些扩展,因此可能值得一看。

使用Bottle内置服务器的问题在于它将是单进程/单线程,这意味着您一次只能处理一个请求。

要解决这个限制,可以按照以下任意顺序执行以下操作。

  1. Eventlet的WSGI封装bottle.app(单线程,非阻塞I/O,单进程)
  2. uwsgi或gunicorn(后者更简单),通常设置为单线程,多进程(工作者)
  3. nginx在uwsgi前面。

如果您有要提供的静态资源,则3最重要,因为您可以直接使用nginx提供这些资源。
2非常容易启动(特别是gunicorn),但我大多数情况下使用uwsgi,因为它具有更多的可配置性以处理我想要的一些事情。
1非常简单且表现良好...而且没有外部配置或命令行标志需要记住。


好的回答!谢谢。目前我的应用程序的结构应该很容易更改为Flask(或其他框架),所以我想我现在会继续使用bottle...我已经花了太多时间来使nginx在uwsgi之前工作/配置,但是迄今为止没有成功。因此,我想我会尝试使用尽可能少的配置同时尝试gunicorn和uwsgi,并且只有在uwsgi表现出非常明显的性能优势时才选择它;否则,gunicorn因其简单性而选用(我还有充足的时间更改所有这些设置)。 - BobIsNotMyName
快速记录:发现nginx无法工作,因为套接字文件在/tmp中,而这在Fedora上默认不起作用...除了这个问题,没有任何问题可以让这些选项工作。我认为我仍然会坚持使用gunicorn来方便部署。 - BobIsNotMyName
我想我会选择#2:uwsgi而不是nginx。没有必要让事情变得复杂,因为我认为我的简单应用程序不需要更快地提供静态文件服务。 - Tim Ludwinski
@sberry,既然Bottle已经支持WSGI协议(nginx也是),那我们为什么还需要uWSGI呢?这样Bottle就可以直接通过WSGI协议与nginx通信了。 - Bin
@Bin 我误读了你的评论,以为你在说要单独使用内置服务器(而不是nginx)。话虽如此,我认为内置的wsgi服务器并不适合生产环境,因为它是单线程的。请查看以下建议,以获取一个适用于生产环境的服务器:http://bottlepy.org/docs/dev/deployment.html#switching-the-server-backend - sberry
显示剩余2条评论

8

2017年更新 - 我们现在使用Falcon而不是Bottle

我仍然喜欢Bottle,但去年我们达到了一个点,它无法扩展以满足我们的性能需求(100k个请求/秒,<100ms)。特别是,我们遇到了Bottle使用线程本地存储的性能瓶颈。这迫使我们转向Falcon,自那以后我们再也没有回头。表现更好,API设计更美观。

我喜欢Bottle,但我也强烈推荐Falcon,尤其是在性能方面很重要的情况下。


大约一年前,我面临着类似的选择-需要一个网络微框架来构建服务器层。我发现这些幻灯片(和相应的讲座)在筛选各种选择方面非常有帮助:Web micro-framework BATTLE!

我选择了Bottle,并对此感到非常满意。它简单、轻量级(如果你在Raspberry Pis上部署,那就是一个加分项)、易于使用、直观、具有我需要的功能,并且每当我需要添加自己的功能时都非常易于扩展。有许多插件可用。

不要将Bottle内置的HTTP服务器用于除开发之外的任何事情。

我已经在生产中成功运行了Bottle;它在Apache/mod_wsgi上非常稳定。nginx/uwsgi“应该”可以类似使用,但我没有相关经验。


你是在使用bottle和gevent吗?我发现这样可以极大地提高性能。 - eatmeimadanish
当然可以。没有并发,你无法提供每秒10万个请求。 :) - ron rothman

2
我建议您考虑使用基于gevent.pywsgi服务器运行bottle。这个框架非常棒,安装简单,异步处理速度快。而且,bottle已经为其构建了适配器,更加方便易用。
我很喜欢bottle,认为它不适用于大型项目的说法是荒谬的。它是最高效和写得最好的框架之一,可以轻松地进行定制,无需太多的手工操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接