当前位置: 首页 > 面试题库 >

我应该为Flask,uWSGI和nginx使用单独的容器吗?

黄昊英
2023-03-14
问题内容

我打算使用Kubernetes和Ingress进行负载平衡。我正在尝试学习如何设置Flask,uWSGI和Nginx。我看到本教程将所有三个安装在同一容器中,我想知道是否应该使用它。
https://ianlondon.github.io/blog/deploy-flask-docker-
nginx/

我猜测将它们作为单独的容器和单独的容器的好处是它们可以分别进行单独缩放?

但是,Flask和uwsgi是否应该放在单独的容器中?(或Flask和Gunicorn,因为uwsgi似乎与Gunicorn非常相似)


问题答案:

Flask是一个Web框架,用它编写的任何应用程序都需要WSGI服务器来托管。尽管您可以使用Flask内置的开发人员服务器,但您不应该这样做,因为它不适用于生产系统。因此,您需要使用WSGI服务器,例如uWSGI,gunicorn或mod_wsgi(mod_wsgi-
express)。由于Web应用程序由WSGI服务器托管,因此它只能位于同一容器中,但是Flask没有单独的进程,因此可以在Web服务器进程中运行。

然后,是否需要单独的Web服务器(例如nginx)。在使用mod_wsgi的情况下,您不使用Apache
Web服务器,因此可以从中直接受益。使用mod_wsgi-
express时,它也已经设置为以最佳基本配置运行,并且这样做避免了像使用uWSGI或gunicorn时人们经常使用nginx那样需要单独的前端Web服务器。

对于平台化已经提供了负载均衡路由层的容器化系统(例如Kubernetes中的入口),在混合中使用nginx可能会增加您不需要的额外复杂性并降低性能。这是因为您要么必须在同一容器中运行nginx,要么必须在同一容器中创建一个单独的容器并使用共享emptyDir卷类型,以允许它们仍然通过UNIX套接字进行通信。如果您不使用UNIX套接字,也不使用INET套接字,或者在完全不同的Pod中运行nginx,那么这是毫无意义的,因为您将为流量引入额外的跃点,这将比紧密地花费更多。使用UNIX套接字绑定。当与nginx耦合并通过INET接受请求时,uWSGI服务器的性能不佳,并且将nginx放置在单独的pod中(可能位于不同的主机上)会使情况变得更糟。

在前面使用nginx的部分原因是,它可以保护您免受由于请求缓冲以及其他潜在问题而导致的缓慢客户端的攻击。不过,在使用Ingress时,您已经拥有了haproxy或nginx前端负载均衡器,可以在某种程度上保护您免受此侵害。因此,实际上是否要在混合中引入其他nginx代理取决于您在做什么。只需将gunicorn或uWSGI直接放在负载均衡器的后面即可。

建议如下。

  • 另请参阅mod_wsgi-express。它是专门为容器化系统而开发的,旨在使其变得更容易,并且比uWSGI和gunicorn更好。

  • 使用实际的流量配置文件,而不是仅仅使它过载的基准测试,在您的实际应用中测试不同的WSGI服务器和配置。这一点很重要,因为基于Kubernetes的系统的动态特性以及其路由的实现方式意味着所有这些行为都可能与您惯用的传统系统大不相同。



 类似资料:
  • 问题内容: 我猜测将它们作为单独的容器和单独的容器的好处是它们可以分别单独缩放? 但是,Flask和uwsgi是否应该放在单独的容器中?(或Flask和Gunicorn,因为uwsgi似乎与Gunicorn非常相似) 问题答案: Flask是一个Web框架,使用它编写的任何应用程序都需要WSGI服务器来托管。尽管你可以使用Flask内置的开发人员服务器,但你不应该这样做,因为它不适用于生产系统。因

  • 我是否需要为我的复杂Web应用程序使用单独的Docker容器,或者我可以将所有必需的服务放在一个容器中?有人能解释一下为什么我应该将我的应用程序划分为许多容器(例如容器,容器,容器)当我能够在一个容器中安装和启动所有东西时?

  • Supported tags and respective Dockerfile links python3.9, latest (Dockerfile) python3.8, (Dockerfile) python3.7, (Dockerfile) python3.6 (Dockerfile) Discouraged tags python3.8-alpine (Dockerfile) To l

  • 到目前为止,我在Ubuntu18.04远程服务器上使用uwsgi和nginx运行了一个Flask应用程序。这个应用程序是由我的网站监听端口5002的子域服务的。我想添加一个新的Flask应用程序来监听端口5003,但我一定是做了一些错误的配置,然后一切都失控了。现在这两个应用程序都不起作用了。 app1的服务器块 null

  • 我写了以下代码: 我只使用了一个useState在一个对象中存储“name”、“link”、“error”等属性。因为我想将FormObj和ValidateLink的逻辑保持在一起。所有三个属性仅使用一个useEffect。因此,我认为最好将所有三个属性都保留在useState中,而不是创建3个不同的useState。 但是我的经理和技术架构师告诉我要为每个属性创建3个useState,一个use