Flask捆绑的服务器在生产环境中使用安全吗?

96

Flask自带的服务器是否安全可靠用于生产环境?如果不是,那么该如何在生产环境中部署Flask?


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

146
不可以。捆绑的服务器是一个开发服务器,它没有考虑生产环境的设计。
  • 默认情况下,它不能处理超过一个请求。
  • 如果您将调试模式保留在错误弹出时,它会打开一个 shell,允许在您的服务器上执行任意代码(例如os.system('rm -rf /'))。
  • 开发服务器不具备良好的扩展性。
Flask使用Werkzeug的开发服务器,文档也是这样说的:

开发服务器不适用于生产系统。它专为开发目的而设计,负载高时性能较差。有关部署设置,请查看应用程序部署页面。

推荐的方法是使用生产WSGI服务器来运行您的Flask应用程序。在文档中有一个专门的部分部署选项
部署您的应用程序就像安装一个WSGI服务器(例如uWSGI或gunicorn),并运行它而不是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。它会自动重新启动服务器,如果由于某些原因失败,保留日志,并作为守护程序运行,因此当服务器启动时,您的服务也会启动。

9
我使用 supervisor + gunicorn + nginx。这个组合非常容易设置和维护。 - Anton Egorov
9
“它一次只能处理一个请求”- 不准确,参见线程和进程参数:http://werkzeug.pocoo.org/docs/0.11/serving/ - HaveAGuess
1
@HaveAGuess:已更正。默认情况下,服务器不会是多线程的。这些参数在Flask文档中没有提到,因此您必须查看Werkzeug的文档,我认为这比大多数人要做的工作更多。 - Blender
2
@HaveAGuess:从Flask部署文档中可以看到:“Flask内置的服务器不适合生产环境,因为它无法很好地扩展,并且默认情况下一次只能处理一个请求。” - mvarge
1
@GreyLi:是的,两者都是WSGI服务器。这就是为什么你可以在不进行任何代码修改的情况下将开发服务器替换为生产服务器的原因。 - Blender
显示剩余7条评论

21

2

虽然Flask框架的内置服务器轻量且易于使用,但它不适合用于生产环境,因为它无法很好地扩展,并且默认情况下一次只能处理一个请求。

http://flask.pocoo.org/docs/0.12/deploying/

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