与Flask捆绑在一起的服务器在生产中可以安全使用吗?


72

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


这个答案为这个问题提供了更广阔的背景,并解释了为什么不应该使用与Flask捆绑在一起的服务器。
Basj

Answers:


103

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

  • 默认情况下,它一次不会处理多个请求。
  • 如果您保留调试模式并弹出错误,它将打开一个外壳程序,该外壳程序允许在您的服务器上执行任意代码(请参阅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。如果由于某种原因发生故障,它将自动重新启动服务器,保留日志并作为守护程序运行,以便在服务器启动时启动服务。


4
我用supervisor+ gunicorn+ nginx。设置和维护非常容易。
安东·埃格罗夫

5
“它一次不会处理一个以上的请求”-不正确,请参见线程并处理参数:werkzeug.pocoo.org/docs/0.11/serving
HaveAGuess

1
@HaveAGuess:已修改。但是,默认情况下,服务器不会是多线程的。Flask文档中的任何地方都没有提到这些参数,因此您必须查看Werkzeug的文档,我认为这比大多数人要做的工作还要多。
Blender

1
@HaveAGuess:从flask部署文档中:“ Flask的内置服务器不适合生产,因为它无法很好地扩展,并且默认情况下一次只能处理一个请求。
mvarge

1
@GreyLi:是的,它们都是WSGI服务器。这就是为什么无需任何代码修改就可以将dev服务器换成生产服务器的原因。
Blender

17

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

内置的开发服务器就是为此而设计的。在生产中使用时,应遵循此处详述的步骤之一

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

也有uWSGIFastCGI选项可用


4
是否有可能对此答案进行2014年更新?+ ensnare提出两个问题时,“基本上不”是模棱两可的。
root 11年

更新了答案以消除歧义。其余的答案似乎仍然完全有效。链接仍然指向最新的flask文档。
olly_uk 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.