与 Flask 捆绑在一起的服务器在生产中使用是不是安全?

Posted

技术标签:

【中文标题】与 Flask 捆绑在一起的服务器在生产中使用是不是安全?【英文标题】:Is the server bundled with Flask safe to use in production?与 Flask 捆绑在一起的服务器在生产中使用是否安全? 【发布时间】:2012-08-29 11:17:27 【问题描述】:

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

【问题讨论】:

这个answer 为这个问题提供了更广泛的背景,并解释了为什么不应该使用与 Flask 捆绑的服务器。 【参考方案1】:

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

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

Flask 使用 Werkzeug 的开发服务器,文档也这么说:

开发服务器不适用于生产系统。它专为开发目的而设计,在高负载下表现不佳。有关部署设置,请查看 Application Deployment 页面。

推荐的方法是use a production WSGI server 来运行您的 Flask 应用程序。文档中有一个专门用于部署的部分:Deployment Options。

部署您的应用程序就像安装 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。如果由于某种原因失败,它会自动重新启动服务器,保留日志并作为守护进程运行,以便您的服务在服务器启动时启动。

【讨论】:

我使用supervisor + gunicorn + nginx。它非常易于设置和维护。 “它一次不会处理多个请求” - 不正确,请参阅线程和处理参数:werkzeug.pocoo.org/docs/0.11/serving @HaveAGuess:已修改。但是,默认情况下,服务器不会是多线程的。 Flask 文档中的任何地方都没有提到这些论点,因此您必须查看 Werkzeug 的文档,我认为这比大多数人所做的工作要多。 @HaveAGuess:来自烧瓶部署doc:“Flask 的内置服务器不适合生产,因为它不能很好地扩展并且默认情况下一次只处理一个请求." @GreyLi:是的,两者都是 WSGI 服务器。这就是为什么您无需任何代码修改即可将开发服务器换成生产服务器的原因。【参考方案2】:

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

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

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

还有uWSGI 和FastCGI 选项可用

【讨论】:

能否在 2014 年更新此答案? “基本上不”是模棱两可的,因为 +ensnare 提出了两个问题。 更新了答案以消除歧义。其余的答案似乎仍然完全有效。链接仍然指向最新的烧瓶文档。【参考方案3】:

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

【讨论】:

以上是关于与 Flask 捆绑在一起的服务器在生产中使用是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Gunicorn 的 Flask App 在生产中给出错误:套接字挂断

Taiwlind CSS:样式在生产中不加载,在开发中工作。将 Next.js 与 MDX 一起使用

Flutter Firebase Google Auth 在生产中不起作用

您是不是需要在生产中使用应用内购买功能/授权才能让用户使用 SKStoreProductViewController 在 iTunes 上购买歌曲?

Node.js 在生产中是不是有永远和连接的 vhosts / nginx 替代方案?

如何修复在生产中失败的应用内购买?