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

问题描述 投票:0回答:4

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

python flask werkzeug
4个回答
147
投票

。捆绑服务器是一个“开发”服务器。它的设计并未考虑生产环境。

默认情况下,它不会同时处理多个请求。
  • 如果您打开调试模式并弹出错误,它会打开一个 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。如果服务器由于某种原因失败,它会自动重新启动服务器,保留日志,并作为守护进程运行,以便您的服务在服务器启动时启动。


21
投票

内置的

开发

服务器就是为了这个目的。要在生产中使用,您应该遵循此处详细描述的步骤之一。 其中包括实现 WSGI 规范的不同服务器,例如

Apache/mod_wsgi

或这些独立 wsgi 服务器之一 http://flask.pocoo.org/docs/deploying/wsgi-standalone/ 还有

uWSGI

FastCGI选项可用


2
投票
http://flask.pocoo.org/docs/0.12/deploying/


0
投票
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

Flask 发出的此警告是为了阻止您在生产中使用开发服务器。事实上,它不是非常高效或安全,因为它包含一组用于开发和调试的功能(例如调试器和重新加载器)。您可以在

https://flask.palletsprojects.com/en/3.0.x/deploying/#
找到可以使用的 WSGI 服务器列表。我们将详细介绍如何使用 Waitress,这是一个非常易于设置且性能良好的解决方案: 首先,您需要在虚拟环境中安装 Waitress:

pip install waitress

然后您需要启动您的应用程序。这将取决于您的应用程序的创建位置。这通常是在靠近根目录的 Python 文件中完成的,其中包含如下行:

app = flask.Flask(__name__)

(你需要找到

Flask

在哪里被调用)

假设此行位于名为 

flask_app.py

的文件中,位置为:

/projects/flask_deployement/src/flask_app.py
使用

cd /projects/flask_deployement

移动到项目根目录,注意运行flask的变量名称是

app
,我们将应用程序的位置发送给Waitress,路径为:
src.flask_app:app
如果我们随后在服务器上的端口 5000 上运行 Waitress(这是一个示例,您可以使用任何可用端口),我们将运行以下命令:

waitress-serve --host 127.0.0.1 --port 5000 src.flask_app:app

您的应用程序现在正在端口 5000 上运行。如果您在根端点上有一个页面,您可以使用以下命令测试应用程序是否成功运行:

curl http://127.0.0.1:5000/

如果您需要在服务器上的生产环境中部署 Flask 应用程序的整个过程的帮助,我已经编写了完整的教程:

这里

© www.soinside.com 2019 - 2024. All rights reserved.