Diferentes versões do Python sob o mesmo uwsgi Emperor?

9

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 uwsgino 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.

hedgie
fonte
você pode seguir este parágrafo: uwsgi-docs.readthedocs.org/en/latest/…
roberto
Isso foi útil para criar um plugin python 3.6 para uwsgi, paulox.net/2017/04/04/how-to-use-uwsgi-with-python3-6-in-ubuntu Consegui especificar qual versão usar no cada vassalo dependendo de qual versão você quer plugins=python3ouplugins=python36
Dfranc3373

Respostas:

9

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:

mkvirtualenv -p /usr/bin/python3 python3env

Em seguida, instalei o uwsgi padrão do Pypi, que é compilado automaticamente com um intérprete Python 3:

pip install uwsgi

Criei um diretório de configuração /etc/uwsgi-python3que contém o emperor.ini e um subdiretório vassals, contendo vassal.ini. Por fim, adicionei a seguinte linha ao/etc/rc.local

/home/user/.virtualenvs/python3env/bin/uwsgi --ini /etc/uwsgi-python3/emperor.ini

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.

hedgie
fonte
Depois de lutar com uma uwsgiinstalação global , segui essa abordagem. # 1
nicorellius
@hedgie: você é um deus! Eu sei que não deve haver nenhum comentário com apenas um "Obrigado!" (já votado), mas você merece. O link para criar os plugins Python únicos não funcionou para mim no meu Ubuntu localizado, mas iniciar o uwsgi instalado no ambiente virtual é executado com a versão correta do python ( ./venv/bin/uwsgi --python-version). Perfeito!
Taffit # 6/16
Estou tendo o mesmo problema com o virtualenv no py 2.7.14 e o uwsgi instalado globalmente no py 2.7.5. Obtendo o erro do site de importação, apesar de ainda estar todo em python 2.7
radtek
3

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

wget https://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar zxvf uwsgi-latest.tar.gz

depois de

cd uwsgi-2.0.17
make PROFILE=nolang

Dessa forma, criei um executável sem plugins para python.

Depois disso, criei cada plugin para cada versão do meu sistema:

PYTHON=python3.6 ./uwsgi --build-plugin "plugins/python python36"
PYTHON=python2.7 ./uwsgi --build-plugin "plugins/python python27"
PYTHON=python2.6 ./uwsgi --build-plugin "plugins/python python26"

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

[uwsgi]
plugins-dir = /usr/local/uwsgi-2.0.17
plugin = python36

[uwsgi]
plugins-dir = /usr/local/uwsgi-2.0.17
plugin = python27

[uwsgi]
plugins-dir = /usr/local/uwsgi-2.0.17
plugin = python26

...

Liguei o binário uwsgi na minha pasta / usr / local

ln -s /usr/local/uwsgi-2.0.17/uwsgi /usr/local/bin/uwsgi

E depois de correr o imperador

uwsgi --emperor /PATH/TO/INI/FILES/FOLDER/

E pronto, agora eu posso executar o projeto python26, python27 e python36 simultaneamente

Giovanni Brescia
fonte
Há muitas soluções ao redor, mas este realmente resolveu o problema que tive correndo uwsgicompython 3.6
Evhz
0

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 /etcnem iniciar novos serviços no rc.local.

  1. Instale uwsgivia pipem um virtualenv.
  2. Edite o /etc/uwsgi/apps-enabled/your-app.iniseguinte:

    • Remova a plugins=...linha (porque o compilado por pip uwsginão suporta plug-ins).
    • Adicione a linha:

      unprivileged-binary-patch = /path/to/your/venv/bin/uwsgi
      

      Isso forçará o imperador uWSGI a lançar seu próprio uwsgibinário como o vassalo.

  3. Recarregue seu aplicativo no imperador service uwsgi restart your-app.

A última etapa relata uma falha ao reiniciar o servidor:

 * Starting app server(s) uwsgi
   ...fail!

No entanto, na realidade, o novo vassalo começa bem, assim como todos os outros aplicativos. Não encontrei tempo para depurar isso.

KT.
fonte