Estou executando um Imperador uwsgi com vários vassalos, cada um atendendo a um aplicativo Python específico de um virtualenv diferente. Como o uwsgi foi compilado com seu próprio interpretador Python 2.7, tentar usar um virtualenv com o Python 3 produz o seguinte erro no vassal.log:
ImportError: No module named site
Acredito que a origem desse erro é que o uwsgi está usando seu interpretador Python 2.7 embutido, enquanto o diretório virtualenv em que está sendo executado suporta apenas intérpretes Python 3. De fato, quando eu uso outro uwsgi (simplesmente instalando-o pip install uwsgi
no mesmo virtualenv), o erro desaparece. No entanto, eu gostaria que um imperador governasse vários virtualenvs diferentes, portanto, instalar um uwsgi separado em cada um deles não é uma opção.
De acordo com esta resposta no Stackoverflow, o caminho certo para resolver isso é compilar o uwsgi com diferentes intérpretes Python como módulos carregáveis. Antes de me comprometer com essa abordagem, gostaria de saber como posso configurar meus Vassals para usar cada um outro plug-in de intérprete.
No momento, tenho um imperador iniciado no meu /etc/rc.local com as seguintes configurações:
[uwsgi]
uid = www-data
gid = www-data
master = true
emperor = /etc/uwsgi/vassals
daemonize = /var/log/uwsgi/emperor.log
Então eu tenho um monte de vassalos com arquivos ini como este:
[uwsgi]
master = false
single-interpreter = true
socket = /tmp/%n.sock
virtualenv = /home/user/.virtualenvs/djangoproject
chdir = /home/user/djangoproject
wsgi-file = project/wsgi.py
logto = /var/log/uwsgi/%n.log
Não tenho problema em compilar uma versão aprimorada do uwsgi com vários plugins de intérpretes, mas gostaria de saber o que preciso alterar na minha configuração para realmente usar esses intérpretes separados. Posso apenas dizer um vassal.ini:
plugin = python3.4
e em outro:
plugin = python2.7
?
Por favor, ajude-me a descobrir como combinar os virtualenvs Python 2.7 e Python 3 sob o mesmo Imperador uwsgi.
fonte
plugins=python3
ouplugins=python36
Respostas:
Bem, como eu não estava exatamente impressionado com as respostas, aqui está a solução que eu vim comigo:
Primeiro, criei um novo virtualenv com um intérprete Python 3:
Em seguida, instalei o uwsgi padrão do Pypi, que é compilado automaticamente com um intérprete Python 3:
Criei um diretório de configuração
/etc/uwsgi-python3
que contém o emperor.ini e um subdiretório vassals, contendo vassal.ini. Por fim, adicionei a seguinte linha ao/etc/rc.local
Agora há um Imperador uwsgi executando que usa o interpretador Python 3 para seus vassalos. Ele não interfere com outro uwsgi Emperor que já estava em execução e usa o interpretador Python 2.7.
Eu sei que não é o ideal, porque não estou usando a arquitetura de interpretador conectável que é explicada na documentação (obrigado roberto! Não sei como eu poderia ignorar isso). No entanto, ele funciona perfeitamente e eu não precisei tocar na instalação existente do uwsgi que atende a vários aplicativos de produção.
fonte
uwsgi
instalação global , segui essa abordagem. # 1./venv/bin/uwsgi --python-version
). Perfeito!Sob osx eu fiz assim. Desinstalei todos os uwsgi do meu sistema (da fermentação da pip etc.).
Depois disso, baixei em / usr / local o código fonte
depois de
Dessa forma, criei um executável sem plugins para python.
Depois disso, criei cada plugin para cada versão do meu sistema:
Agora eu tenho 3 plugins.
Nos meus arquivos ini para o imperador, especifiquei o diretório dos plugins e a versão do plug-in para cada arquivo
Liguei o binário uwsgi na minha pasta / usr / local
E depois de correr o imperador
E pronto, agora eu posso executar o projeto python26, python27 e python36 simultaneamente
fonte
uwsgi
compython 3.6
Outra solução possível é reutilizar o "imperador" em todo o sistema e substituir apenas o vassalo pela nova versão. Dessa forma, você não precisa inventar novas pastas
/etc
nem iniciar novos serviços norc.local
.uwsgi
viapip
em um virtualenv.Edite o
/etc/uwsgi/apps-enabled/your-app.ini
seguinte:plugins=...
linha (porque o compilado por pipuwsgi
não suporta plug-ins).Adicione a linha:
Isso forçará o imperador uWSGI a lançar seu próprio
uwsgi
binário como o vassalo.Recarregue seu aplicativo no imperador
service uwsgi restart your-app
.A última etapa relata uma falha ao reiniciar o servidor:
No entanto, na realidade, o novo vassalo começa bem, assim como todos os outros aplicativos. Não encontrei tempo para depurar isso.
fonte