Qual é o objetivo do uWSGI?


97

Estou olhando para a especificação WSGI e estou tentando descobrir como servidores como uWSGI se encaixam na imagem. Eu entendo que o objetivo da especificação WSGI é separar os servidores da web como o nginx de aplicativos da web como algo que você escreveria usando o Flask . O que eu não entendo é para que serve o uWSGI. Por que o nginx não pode chamar diretamente meu aplicativo Flask? O frasco não pode falar WSGI diretamente para ele? Por que o uWSGI precisa ficar entre eles?

Existem dois lados na especificação WSGI: o servidor e o aplicativo da web. De que lado está o uWSGI?

Respostas:


131

Ok, acho que entendi agora.

Por que o nginx não pode chamar diretamente meu aplicativo Flask?

Porque nginxnão suporta a especificação WSGI. Tecnicamente, o nginx poderia implementar a WSGIespecificação se quisesse, mas não o fez.

Sendo esse o caso, precisamos de um servidor da web que implemente a especificação, que é para que serve o uWSGIservidor.

Observe que uWSGIé um servidor http completo que pode funcionar bem por conta própria. Usei-o nesta capacidade várias vezes e funciona muito bem. Se você precisar de uma taxa de transferência super alta para conteúdo estático, terá a opção de permanecer nginxna frente do seu uWSGIservidor. Quando você fizer isso, eles se comunicarão por meio de um protocolo de baixo nível conhecido como uwsgi.

"O que o quê ?! Outra coisa chamada uwsgi ?!" você pergunta. Sim, é confuso. Quando você faz referência, uWSGIestá falando sobre um servidor http. Quando você fala sobre uwsgi(em letras minúsculas), você está falando sobre um protocolo binário que o uWSGI servidor usa para se comunicar com outros servidores nginx. Eles escolheram um nome ruim neste.

Para quem estiver interessado, escrevi um artigo no blog sobre o assunto com mais detalhes, um pouco de história e alguns exemplos.


4
É possível executar aplicativos Flask com Werkzeug como um servidor HTTP, mas não é uma configuração pronta para produção. uWSGI resolve vários problemas: * Análise HTTP (mais rápido em C) e interface com o aplicativo WSGI * lança o aplicativo em vários processos / threads para melhor simultaneidade * atua como um supervisor de aplicativos WSGI
Sergey Panfilov

@SergeyPanfilov o problema é que não sabemos como uwsgi lida com flask, cada processo / threads criou uma instância do aplicativo flask? Eu vi alguma implementação para tarefa em segundo plano em frasco como Flask-Executor e tem que ligar dentro de uma solicitação. Não pode ser colocado fora do contexto.
TomSawyer de

Leia a resposta de Hasan .. está perto da resposta correta ... os servidores http são em sua maioria escritos em C e eles não podem encaminhar as solicitações de http para backends python .... sua resposta fala apenas sobre a mecânica
overexchange

25

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.


20

Um servidor web tradicional não entende ou não tem como executar aplicativos Python. É por isso que o servidor WSGI entra. Por outro lado, o Nginx oferece suporte ao proxy reverso para lidar com solicitações e devolver respostas para servidores WSGI Python.

Este link pode ajudá-lo: https://www.fullstackpython.com/wsgi-servers.html


4
Existem três coisas aqui: nginx, uwsgi e flask. Como tudo isso se encaixa no contexto da especificação WSGI? O nginx é o servidor e o uwsgi é o aplicativo ou o uwsgi é o servidor e o flask é o aplicativo?
d512

uWSGI é o servidor e o flask é o app.
Rafiqul Hasan

Bem, se você não se importa, verifique minha resposta à minha própria pergunta e veja o que você acha.
d512

4
Por que um servidor da web não entende os aplicativos Python? Ele pode entender PHP, por que não Python ou outras linguagens?
jdogg

0

Em termos simples, pense em uma analogia onde você está executando um aplicativo CGI ou PHP com o servidor da web Nginx. Você usará os respectivos manipuladores como php-fpm para executar esses arquivos, uma vez que o servidor web, em sua forma nativa, não processa esses formatos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.