Flask是一个web框架,用它编写的任何应用程序都需要一个WSGI服务器来承载它。虽然您可以使用Flask内置开发人员服务器,但您不应该认为这不适用于生产系统。因此,您需要使用WSGI服务器,如uWSGI,gunicorn或mod_wsgi(mod_wsgi-express)。由于Web应用程序由WSGI服务器托管,因此它只能位于同一个容器中,但Flask没有单独的进程,它在Web服务器进程中运行。
无论你需要一个单独的网络服务器,如Nginx,然后取决于。在mod_wsgi的情况下,您不会使用Apache Web服务器,因此可以从中直接获益。当使用mod_wsgi-express时,它也已经设置为以最佳的基本配置运行,并且它如何避免需要一个单独的面向前端的web服务器,就像人们在使用uWSGI或gunicorn时经常使用nginx一样。
对于集装箱系统,其中平台已经提供了一个用于负载平衡的路由层,就像Kubernetes中的入口一样,在混合中使用nginx可能会增加额外的复杂度,而这些复杂度并不需要,可能会降低性能。这是因为您必须在同一容器中运行nginx,或者在同一个容器中创建单独的容器,并使用共享的卷类型允许它们仍然通过UNIX套接字进行通信。如果您不使用UNIX套接字并使用INET套接字,或者在完全不同的pod中运行nginx,那么当您为流量引入额外的跳跃时,这会有点毫无意义,而这将比密切关注它更昂贵使用UNIX套接字绑定。 uWSGI服务器在与nginx结合使用时通过INET接受请求时表现不佳,并且nginx位于单独的pod中,可能位于不同的主机上,可能会使情况更糟。
在前面使用nginx的部分原因是它可以保护您免受缓慢的客户端由于请求缓冲,以及其他潜在的问题。当使用入口时,你已经有了一个haproxy或nginx前端负载均衡器,可以在一定程度上保护你免受这种负载。所以这真的要取决于你在做什么,以确定在混合中是否引入了额外的nginx代理。将gunicorn或uWSGI直接放在负载平衡器的后面可能会更简单。
建议如下。
你的烧瓶app和uwsgi/gunicorn必须放在同一个容器中,nginx放在单独的容器中。 – johnharris85