85

与 Flask 捆绑在一起的服务器是否可以安全地部署在生产环境中?如果没有,我应该使用什么来在生产中部署 Flask?

4

3 回答 3

125

没有。捆绑的服务器是开发服务器。它的设计并未考虑生产环境。

  • 默认情况下,它一次不会处理多个请求。
  • 如果您打开调试模式并弹出错误,它会打开一个外壳,允许在您的服务器上执行任意代码(想想os.system('rm -rf /'))。
  • 开发服务器不能很好地扩展。

Flask 使用 Werkzeug 的开发服务器,文档也说了同样的话:

开发服务器不打算在生产系统上使用。它专为开发目的而设计,在高负载下表现不佳。对于部署设置,请查看应用程序部署页面。

推荐的方法是使用生产 WSGI 服务器来运行您的 Flask 应用程序。文档中有一个专门用于部署的部分:部署选项

部署您的应用程序就像安装 uWSGI 或 gunicorn 之类的 WSGI 服务器并运行它而不是 Flask 的开发服务器一样简单:

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app

如果您提供任何静态资产(如图像或视频)、需要低级缓存或有更高的并发需求,建议使用像nginx这样的网络服务器并让它处理您的所有请求。

以蹩脚的 ASCII 形式:

                +----------+
                | Client 2 |
                +----------+
                      |
                      V 
+----------+      +-------+      +----------+
| Client 1 |----->| nginx |<-----| Client 3 |
+----------+      +-------+      +----------+
                      ^
                      |
                      V
           /--------------------\
           | useful nginx stuff |
           | like asset serving |
           | and rate limiting  |
           \--------------------/
                      |
                      V
               +-------------+
               | WSGI server |
               +-------------+

要实际运行WSGI 服务器进程,可以使用Supervisor。如果由于某种原因失败,它会自动重新启动服务器,保留日志并作为守护程序运行,以便您的服务在服务器启动时启动。

于 2012-09-04T19:16:26.793 回答
21

基本上,没有。内置的开发服务器在生产环境中部署并不安全。

内置的开发服务器就是为了这个。要在生产中使用,您应该遵循此处详述的步骤之一。

这些包括实现 WSGI 规范的不同服务器,例如Apache/mod_wsgi或这些独立 wsgi 服务器之一http://flask.pocoo.org/docs/deploying/wsgi-standalone/

还有uWSGIFastCGI选项可用

于 2012-09-04T18:49:29.590 回答
2

虽然轻量级且易于使用,但 Flask 的内置服务器不适合生产,因为它不能很好地扩展,并且默认情况下一次只服务一个请求。 http://flask.pocoo.org/docs/0.12/deploying/

于 2017-08-17T09:49:03.587 回答