NGINX, neste caso, funciona apenas como um proxy reverso e renderiza arquivos estáticos, não os arquivos dinâmicos , ele recebe as solicitações e os encaminha para o servidor de aplicativos, que seria UWSGI.
O servidor UWSGI é responsável por carregar seu aplicativo Flask usando a interface WSGI. Na verdade, você pode fazer o UWSGI ouvir diretamente as solicitações da Internet e remover o NGINX se desejar, embora seja usado principalmente por trás de um proxy reverso.
Dos documentos :
uWSGI suporta vários métodos de integração com servidores web. Ele também é capaz de atender a solicitações HTTP sozinho.
WSGI é apenas uma especificação de interface, em termos simples, diz a você quais métodos devem ser implementados para passar solicitações e respostas entre o servidor e o aplicativo. Ao usar frameworks como Flask ou Django, isso é tratado pelo próprio framework.
Em outras palavras, WSGI é basicamente um contrato entre aplicativos python (Flask, Django, etc) e servidores web (UWSGI, Gunicorn, etc). A vantagem é que você pode alterar os servidores da web com pouco esforço, porque você sabe que eles estão em conformidade com a especificação WSGI, que na verdade é um dos objetivos, conforme declarado no PEP-333 .
Python atualmente possui uma grande variedade de estruturas de aplicativos da web, como Zope, Quixote, Webware, SkunkWeb, PSO e Twisted Web - para citar apenas alguns 1 . Essa ampla variedade de opções pode ser um problema para novos usuários de Python, porque, de modo geral, a escolha da estrutura da Web limitará a escolha de servidores da Web utilizáveis e vice-versa.