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

时间:2017-06-13 23:07:58

标签: python nginx docker flask kubernetes

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

我猜测将它们作为单独的容器和单独的容器的好处是它们可以单独扩展吗?

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

1 个答案:

答案 0 :(得分:19)

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时,它也已经设置为在最佳基本配置中运行,以及它如何做到这一点,避免了使用单独的前置Web服务器,就像人们在使用uWSGI或gunicorn时经常使用nginx一样。

对于容器化系统,平台已经为负载平衡提供了路由层,就像Kubernetes中的入口一样,在混合中使用nginx只会增加您不需要的额外复杂性并且可能降低性能。这是因为您必须在同一容器中运行nginx,或者在同一个pod中创建一个单独的容器并使用共享的emptyDir卷类型来允许它们通过UNIX套接字进行通信。如果你不使用UNIX套接字,并使用INET套接字,或者在一个完全不同的pod中运行nginx,那么它就是一种毫无意义的,因为你要为流量引入额外的跳,这比使它更密集使用UNIX套接字绑定。当与nginx结合使用时,uSEGI服务器在接受INET请求时效果不佳,并且在可能位于不同主机上的单独pod中使用nginx会使情况变得更糟。

在前面使用nginx的部分原因是它可以保护您免受慢速客户端的请求缓冲以及其他潜在问题。使用入口时,您已经拥有一个haproxy或nginx前端负载均衡器,可以在一定程度上保护您免受此攻击。所以它真的取决于你在做什么,是否有一点在混合中引入额外的nginx代理。将gunicorn或uWSGI直接放在负载均衡器后面可能更简单。

建议如下。

  • 另请参阅mod_wsgi-express。它是专门为集装箱化系统开发的,旨在使其更容易,并且可以比uWSGI和gunicorn更好的选择。

  • 使用真实世界的流量配置文件测试不同的WSGI服务器和配置与实际应用程序,而不是仅仅超载它的基准测试。这一点很重要,因为基于Kubernetes的系统的动态以及它的路由可能如何实现,意味着它可能与您可能习惯的更传统的系统有很大的不同。