Configuração de servidor mais limpa e rápida para Django [fechado]
Pergunta
Estou prestes a implantar um site de médio porte desenvolvido com Django.Eu tenho um servidor Ubuntu dedicado.
Estou realmente confuso sobre qual software de servidor usar.Então pensei comigo mesmo:por que não perguntar ao stackoverflow.
O que estou procurando é:
- Fácil de configurar
- Rápido e fácil em recursos
- Pode servir arquivos de mídia
- Capaz de servir vários djangosites no mesmo servidor
- Prefiro não instalar PHP ou qualquer outra coisa que sugue recursos e para a qual não tenho utilidade.
Já ouvi falar de mod_wsgi e mod_python no Apache, nginx e lighty.Quais são os prós e os contras disso e senti falta de alguém?
@Barry:De alguma forma, sinto que o Apache está muito inchado para mim.E as alternativas?
@BrianLy:Ok, vou dar uma olhada no mod_wsgi um pouco mais.Mas por que preciso do Apache se sirvo arquivos estáticos com lighty?Também consegui servir o próprio aplicativo Django com lighty.Isso é ruim de qualquer maneira?Desculpe por ser tão estúpido :-)
ATUALIZAR:E quanto ao lighty e ao nginx - quais são os casos de uso quando são a escolha perfeita?
Solução
Como estava procurando respostas mais aprofundadas, decidi pesquisar a fundo o assunto.Por favor, deixe-me saber se eu entendi mal alguma coisa.
Algumas recomendações gerais são usar um servidor web separado para lidar com mídia.Por separado, quero dizer um servidor web que não está executando o Django.Este servidor pode ser, por exemplo:
- Lighttpd (Lighty)
- Nginx (EngineX)
- Ou algum outro servidor leve
Então, para o Django, você pode seguir caminhos diferentes.Você também pode:
Servir Django via Apache e:
mod_python
Esta é a forma estável e recomendada/bem documentada.Contras:usa muita memória.
mod_wsgi
Pelo que entendi, mod_wsgi é uma alternativa mais recente.Parece ser mais rápido e mais fácil em termos de recursos.
mod_fastcgi
Ao usar FastCGI você está delegando o serviço do Django para outro processo.Como o mod_python inclui um interpretador python em cada solicitação, ele usa muita memória.Esta é uma forma de contornar esse problema.Também existem algumas preocupações de segurança.
O que você faz é iniciar seu servidor Django FastCGI em um processo separado e então configurar o Apache por meio de reescritas para chamar esse processo quando necessário.
Ou você pode:
Servir Django sem usar Apache mas com outro servidor que suporte FastCGI nativamente:
(A documentação menciona que você pode fazer isso se não tiver nenhuma necessidade específica do Apache.Acho que o motivo deve ser para economizar memória.)
- Lighttpd
Este é o servidor que executa o Youtube.Parece rápido e fácil de usar, mas tenho visto relatos de vazamentos de memória.
- nginx
Já vi benchmarks afirmando que este servidor é ainda mais rápido que o lighttpd.No entanto, está documentado principalmente em russo.
Outra coisa, devido às limitações do Python, seu servidor deve estar rodando em modo bifurcado, não encadeado.
Então esta é minha pesquisa atual, mas quero mais opiniões e experiências.
Outras dicas
estou a usar Cherokee.
De acordo com seus benchmarks (grão de sal com eles), ele lida com carga melhor que Lighttpd e nginx ...Mas não é por isso que eu uso.
Eu uso porque se você digitar cherokee-admin
, ele inicia um novo servidor no qual você pode fazer login (com uma senha de uso único) e configurar todo o servidor por meio de um webmin bem feito.Esse é um recurso matador.Já me salvou um muito de tempo.E está economizando muitos recursos para meu servidor!
Quanto ao Django, estou executando-o como um processo SCGI encadeado.Funciona bem.Cherokee também pode mantê-lo funcionando.Novamente, um recurso muito bom.
A versão atual do repositório do Ubuntu é muito antiga, então eu aconselho você a usar seu PPA.Boa sorte.
Como disse @Barry, a documentação usa mod_python.Não usei o Ubuntu como servidor, mas tive uma boa experiência com mod_wsgi no Solaris.Você pode encontrar documentação para mod_wsgi e Django no mod_wsgi site.
Uma rápida revisão de seus requisitos:
- Fácil de configurar Achei o Apache 2.2 bastante fácil de construir e instalar.
- Rápido e fácil em recursos Eu diria que isso depende do seu uso e tráfego.* Você pode não querer servir todos os arquivos usando Apache e usar LightTPD (lighty) para arquivos estáticos do servidor.
- Pode servir arquivos de mídia Presumo que você queira dizer imagens, arquivos flash?O Apache pode fazer isso.
- Vários sites no mesmo servidor Hospedagem de servidor virtual em Apache.
- Prefiro não instalar outras extensões Comente tudo o que você não deseja na configuração do Apache.
A maneira oficialmente recomendada de implantar um projeto Django é usar mod_python com Apache.Isto é descrito em a documentação. A principal vantagem disso é que é a forma mais bem documentada, mais suportada e mais comum de implantação.A desvantagem é que provavelmente não é o mais rápido.
A melhor configuração não é tão conhecida, eu acho.Mas aqui está:
- Use o nginx para atender solicitações (dinâmicas para o aplicativo, conteúdo estático diretamente).
- Use o servidor web python para servir conteúdo dinâmico.
Duas soluções mais rápidas para servidor web baseado em python são:
Você precisa procurar no Google para encontrar a melhor configuração atual para Django (ainda em desenvolvimento).
Estou a usar nginx (0.6.32 tirado de Sid) com mod_wsgi.Funciona muito bem, embora não possa dizer se é melhor do que as alternativas porque nunca experimentei nenhuma.Nginx tem memcached suporte integrado, que talvez possa interoperar com o middleware de cache do Django (na verdade, não o uso, em vez disso, preencho o cache manualmente usando python-memcache e o invalido quando as alterações são feitas), portanto, os acessos ao cache ignoram completamente o Django (meu desenvolvimento máquina pode atender cerca de 3.000 solicitações por segundo).
Uma advertência:nginx’ mod_wsgi
não gosta muito de locais nomeados (ele tenta passá-los SCRIPT_NAME
), então o óbvio 'error_page 404 = @django
’ causará numerosos erros obscuros.Eu tive que corrigir a fonte mod_wsgi para consertar isso.
Também estou lutando para entender todas as opções.Em esta postagem do blog Encontrei alguns benefícios do mod_wsgi em comparação com o mod_python explicados.
Vários sites de baixo tráfego em um VPS pequeno tornam o consumo de RAM a principal preocupação, e mod_python parece ser uma má opção nesse caso.Usando lighttpd e FastCGI, consegui reduzir o uso mínimo de memória de um site Django simples para 58 MiB virtuais e 6,5 MiB residentes (após reiniciar e atender uma única solicitação sem muita memória RAM).
Percebi que a atualização do Python 2.4 para 2.5 no Debian Etch aumentou o consumo mínimo de memória dos processos Python em alguns por cento.Por outro lado, o melhor gerenciamento de memória do 2.5 pode ter um efeito oposto maior em processos de longa execução.
Mantenha simples: Django recomenda Apache e mod_wsgi (ou mod_python).Se servir arquivos de mídia for uma grande parte do seu serviço, considere o Amazon S3 ou o Rackspace CloudFiles.
Na minha opinião, a pilha melhor/mais rápida é verniz-nginx-uwsgi-django.E estou usando com sucesso.
Se estiver usando lighthttpd, você também pode usar FastCGI para servir Django.Não tenho certeza de como a velocidade se compara ao mod_wsgi, mas se a memória funcionar corretamente, você obterá alguns dos benefícios que obteria com o mod_wsgi e que não obteria com o mod_python.A principal delas é que você pode dar a cada aplicativo seu próprio processo (o que é realmente útil para manter a memória de diferentes aplicativos separada, bem como para aproveitar as vantagens de computadores com vários núcleos.
Editar:Apenas para acrescentar em relação à sua atualização sobre o nginix, se a memória funcionar corretamente novamente, o nginix usará "greenlets" para lidar com a simultaneidade.Isso significa que talvez você precise ter um pouco mais de cuidado para garantir que um aplicativo não consuma todo o tempo do servidor.
Usamos nginx e FastCGI para todas as nossas implantações do Django.Isso ocorre principalmente porque geralmente implantamos no Slicehost e não queremos doar toda a nossa memória para o Apache.Acho que este seria o nosso "caso de uso".
Quanto às observações sobre a documentação ser principalmente em russo - encontrei a maior parte das informações no Wiki em inglês ser muito útil e preciso.Este site também possui exemplos de configurações para Django, a partir dos quais você pode ajustar sua própria configuração do nginx.
Existem muitas maneiras de fazer isso. Por esse motivo, recomendo ler atentamente o artigo relacionado ao processo de implantação no DjangoAdvent.com:Eric Florenzano - Implantando Django com FastCGI: http://djangoadvent.com/1.2/deploying-django-site-using-fastcgi/ Leia também:Mike Malone - Blog de Scaling Django Stocastictechnologies:A configuração perfeita do Django Mikkel Hoegh Blog:35% Mudança de melhoria do tempo de resposta-uwsgi-nginx
Cumprimentos
Tenho um aviso para usar o Cherokee.Quando você faz alterações no Django Cherokee mantém o processo ANTIGO, em vez de eliminá-lo e iniciar um novo.
No Apache, recomendo fortemente este artigo.
http://www.djangofoo.com/17/django-mod_wsgi-deploy-exampl
É fácil de configurar, fácil de eliminar ou redefinir após fazer alterações.
Basta digitar no terminal
sudo /etc/init.d/apache2 restart
e as mudanças são vistas instantaneamente.