我应该有单独的容器来装Flask、uWSGI和nginx吗?

2024-10-02 14:23:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我猜把它们作为单独的容器和独立的豆荚的好处是它们可以单独缩放?在

但是,烧瓶和uwsgi是否应该放在单独的容器中?(或者是烧瓶和古尼科恩,因为乌斯吉似乎与古尼科恩非常相似)


Tags: httpsiogithubflask烧瓶nginx教程blog
1条回答
网友
1楼 · 发布于 2024-10-02 14:23:51

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,要么在同一个pod中创建一个单独的容器,并使用sharedemptyDir卷类型来允许它们仍然通过UNIX套接字进行通信。如果您不使用UNIX套接字,而使用INET socket,或者在完全不同的pod中运行nginx,那么这有点毫无意义,因为您正在为流量引入一个额外的跃点,这将比使用UNIX套接字紧密绑定更昂贵。当与nginx耦合时,uWSGI服务器在接受INET上的请求时性能不太好,并且nginx位于单独的pod中(可能在不同的主机上),可能会使情况更糟。在

在前面使用nginx的部分原因是它可以保护您免受由于请求缓冲以及其他潜在问题而导致的客户端速度慢的问题。不过,在使用ingres时,您已经有了haproxy或nginx前端负载平衡器,可以在一定程度上保护您不受此影响。因此,这将取决于您正在做什么,以确定是否有必要在混合中引入额外的nginx代理。将gunicorn或uWSGI直接放在负载平衡器后面可以更简单一些。在

建议如下。在

  • 另请参阅mod帴wsgi-express。它是专门开发的集装箱系统,以使它更容易,可以是一个更好的选择,比uWSGI和gunicorn。

  • 用实际的应用程序测试不同的WSGI服务器和配置,而不是让它过载的基准测试。这一点很重要,因为基于Kubernetes的系统的动态特性,以及它的路由实现方式,意味着它的行为可能与您习惯的更传统的系统有很大的不同。

相关问题 更多 >