【问题标题】:Python bottle vs uwsgi/bottle vs nginx/uwsgi/bottlePython 瓶子 vs uwsgi/瓶子 vs nginx/uwsgi/瓶子
【发布时间】:2013-08-03 01:57:59
【问题描述】:

我正在开发一个基于 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 服务器,我是否会有所收获?

【问题讨论】:

    标签: python nginx uwsgi bottle


    【解决方案1】:

    2017 年更新 - 我们现在使用 Falcon 代替 Bottle

    我仍然喜欢 Bottle,但我们在去年达到了一个点,它无法扩展以满足我们的性能要求(100k 请求/秒,Falcon,从那以后我们再也没有回头。更好的性能和设计精美的 API。

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


    大约一年前,我面临一个类似的选择——需要一个 Web 微框架来构建我正在构建的服务器层。发现这些幻灯片(以及随附的讲座)对筛选选择领域非常有帮助:Web micro-framework BATTLE!

    我选择了 Bottle 并且对它非常满意。它简单、轻量(如果您在 Raspberry Pis 上部署,这是一个加分项)、易于使用、直观,具有我需要的功能,并且在我需要添加自己的功能时具有极高的可扩展性。 Many plugins 可用。

    不要将 Bottle 的内置 HTTP 服务器用于开发以外的任何东西。

    我在生产环境中运行 Bottle 并取得了很大的成功;它在 Apache/mod_wsgi 上非常稳定。 nginx/uwsgi“应该”工作类似,但我没有这方面的经验。

    【讨论】:

    • 你在 gevent 中使用了瓶子吗?我发现这会像疯了一样提高性能。
    • 是的,当然。如果没有并发,您无法提供 100,000 QPS。 :)
    【解决方案2】:

    我还建议您通过 gevent.pywsgi 服务器查看运行瓶。它很棒,设置超级简单,异步且非常快。

    Plus 瓶子已经为它内置了一个适配器,所以更容易。

    我喜欢瓶子,这种不适合大型项目的概念是荒谬的。它是最高效且编写良好的框架之一,无需大量手动操作即可轻松成型。

    【讨论】:

      【解决方案3】:

      Flask vs Bottle 对我来说归结为几件事。

      1. 应用程序多么简单。如果它非常简单,那么瓶子是我的选择。如果没有,那么我就选择了 Flask。瓶子是单个文件的事实使部署变得非常简单,只需将文件包含在我们的源代码中即可。但是,bottle 是单个文件这一事实应该很好地表明它没有实现完整的 wsgi 规范及其所有边缘情况。
      2. 应用程序做什么。如果它必须渲染除 Python->JSON 之外的任何东西,那么我会使用 Flask,因为它内置了对 Jinja2 的支持。如果我需要进行身份验证和/或授权,那么 Flask 已经有一些非常好的扩展来处理这些要求。如果我需要做缓存,Flask-Cache 存在并且用最少的设置做得很好。我不完全确定有什么可用于延长瓶子,所以这可能仍然值得一看。

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

      要解决该限制,您可以不按特定顺序执行以下任何操作。

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

      如果您有想要提供的静态资产,则 3 是最重要的,因为您可以直接使用 nginx 提供这些资产。
      2 真的很容易上手(尤其是 gunicorn)——尽管我大部分时间都使用 uwsgi,因为它具有更多的可配置性来处理我想要的一些事情。
      1 真的很简单而且性能很好……而且没有外部配置或命令行标志要记住。

      【讨论】:

      • 很好的答案!谢谢。目前,我的应用程序的结构使得如果需要,应该很容易更改为 Flask(或其他框架),所以我想我现在会坚持使用瓶子......我已经花了太多时间让 nginx 在 uwsgi 之前工作/配置,到目前为止还没有成功。所以我想我会以尽可能少的配置同时尝试 gunicorn 和 uwsgi,并且只有在表现出非常明显的性能优势时才选择 uwsgi;否则 gunicorn 因为它的简单性(我仍然有足够的时间来改变这一切)。
      • 快速说明:发现 nginx 不工作,因为套接字文件在 /tmp 中,并且默认情况下不适用于 Fedora... 除了那个问题,没有问题得到任何这些选项有效。认为我仍然会坚持使用 gunicorn 以便于部署。
      • 我想我会选择#2:没有 nginx 的 uwsgi。无需使事情复杂化,因为我认为我的简单应用不会因更快地提供静态文件而受益。
      • @sberry ,为什么我们需要uWSGI,因为瓶子已经支持WSGI协议(nginx也是),所以瓶子可以通过WSGI协议直接与nginx对话?
      • @Bin 这意味着您仍将通过瓶子提供静态资产。如果您不介意,那很好,但值得注意。
      猜你喜欢
      • 2012-11-28
      • 1970-01-01
      • 2015-09-18
      • 2018-02-02
      • 1970-01-01
      • 2013-09-01
      • 2017-11-16
      • 2014-04-30
      • 2019-09-29
      相关资源
      最近更新 更多