Versi Python yang berbeda di bawah Kaisar uwsgi yang sama?

9

Saya menjalankan Kaisar uwsgi dengan berbagai Vassal yang masing-masing melayani aplikasi Python spesifik dari virtualenv yang berbeda. Karena uwsgi dikompilasi dengan interpreter Python 2.7 sendiri, mencoba menggunakan virtualenv dengan Python 3 di dalamnya menghasilkan kesalahan berikut di vassal.log:

ImportError: No module named site

Saya percaya asal mula kesalahan ini adalah bahwa uwsgi menggunakan interpreter Python 2.7 bawaannya, sedangkan direktori virtualenv yang dijalankan hanya mendukung interpreter Python 3. Memang, ketika saya menggunakan uwsgi lain (hanya dengan menginstalnya pip install uwsgidi virtualenv yang sama), kesalahannya hilang. Namun, saya ingin satu Kaisar untuk memerintah beberapa virtualenv yang berbeda, jadi menginstal uwsgi terpisah di masing-masing bukan pilihan.

Menurut jawaban ini pada Stackoverflow, Cara yang Tepat untuk menyelesaikan ini adalah mengkompilasi uwsgi dengan interpreter Python yang berbeda sebagai modul yang dapat di-load. Sebelum saya berkomitmen pada pendekatan ini, saya ingin tahu bagaimana saya bisa mengonfigurasi Vassal saya untuk masing-masing menggunakan plugin juru bahasa lain.

Saat ini saya memiliki satu Kaisar yang dimulai dari /etc/rc.local saya dengan pengaturan berikut:

[uwsgi]
uid = www-data
gid = www-data
master = true
emperor = /etc/uwsgi/vassals
daemonize = /var/log/uwsgi/emperor.log

Lalu aku punya banyak pengikut dengan file ini seperti ini:

[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

Saya tidak punya masalah mengkompilasi uwsgi versi tweak dengan beberapa plugin juru bahasa, tetapi saya ingin tahu apa yang harus saya ubah dalam konfigurasi saya untuk benar - benar menggunakan penerjemah terpisah ini. Bisakah saya mengatakan satu vassal.ini:

plugin = python3.4

dan di tempat lain:

plugin = python2.7

?

Tolong bantu saya mencari tahu cara menggabungkan Python 2.7 dan Python 3 virtualenvs di bawah uwsgi Emperor yang sama.

hedgie
sumber
Anda dapat mengikuti paragraf ini: uwsgi-docs.readthedocs.org/en/latest/…
roberto
Ini berguna untuk membangun plugin python 3.6 untuk uwsgi, paulox.net/2017/04/04/how-to-use-uwsgi-with-python3-6-in-ubuntu saya dapat menentukan versi mana yang akan digunakan dalam masing-masing pengikut tergantung pada versi yang Anda inginkan plugins=python3atauplugins=python36
Dfranc3373

Jawaban:

9

Yah, karena saya tidak benar-benar kewalahan oleh tanggapan, inilah solusi yang saya buat sendiri:

Pertama, saya membuat virtualenv baru dengan juru bahasa Python 3:

mkvirtualenv -p /usr/bin/python3 python3env

Kemudian saya menginstal stock uwsgi dari Pypi, yang akan dikompilasi secara otomatis dengan interpreter Python 3:

pip install uwsgi

Saya membuat direktori konfigurasi /etc/uwsgi-python3yang berisi emperor.ini dan subdirectory vassals, yang berisi vassal.ini. Akhirnya, saya menambahkan baris berikut ke/etc/rc.local

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

Sekarang ada Kaisar uwsgi yang menggunakan interpreter Python 3 untuk pengikut-pengikutnya. Itu tidak mengganggu Kaisar uwsgi lain yang sudah berjalan dan menggunakan interpreter Python 2.7.

Saya tahu itu tidak optimal, karena saya tidak menggunakan arsitektur interpreter pluggable yang dijelaskan dalam dokumentasi (terima kasih roberto! Saya tidak tahu bagaimana saya bisa mengabaikan hal itu). Namun, ini berjalan dengan sempurna dan saya tidak perlu menyentuh instalasi uwsgi saya yang ada yang melayani banyak aplikasi produksi.

hedgie
sumber
Setelah berjuang dengan uwsgiinstalasi global , saya pergi dengan pendekatan ini. Bagus ... +1
nicorellius
@hedgie: kamu adalah dewa! Saya tahu bahwa seharusnya tidak ada komentar hanya dengan "Terima kasih!" (sudah dipilih), tetapi Anda layak mendapatkannya. Tautan untuk membuat plugin Python tunggal tidak berfungsi untuk saya di Ubuntu lokal saya, tetapi memulai uwsgi yang terinstal di lingkungan virtual berjalan dengan versi python yang benar ( ./venv/bin/uwsgi --python-version). Sempurna!
taffit
Saya mengalami masalah yang sama dengan virtualenv pada py 2.7.14 dan uwsgi diinstal secara global pada py 2.7.5. Mendapatkan kesalahan impor situs meskipun masih semua python 2,7
radtek
3

Di bawah osx saya membuat seperti ini. Saya membatalkan semua uwsgi di sistem saya (dari minuman dari pip dll).

Setelah itu saya unduh di bawah / usr / local kode sumber

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

setelah

cd uwsgi-2.0.17
make PROFILE=nolang

Dengan cara ini saya membuat executable tanpa plugin untuk python.

Setelah itu saya membuat setiap plugin untuk setiap versi di sistem saya:

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"

Sekarang saya punya 3 plugin.

Dalam file ini saya untuk kaisar saya tentukan dir plugin dan versi plugin untuk setiap file

[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

...

Saya menghubungkan biner uwsgi di folder / usr / local saya

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

Dan setelah menjalankan kaisar

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

Dan voila sekarang saya dapat menjalankan proyek python26, python27 dan python36 secara bersamaan

Giovanni Brescia
sumber
Ada banyak solusi sekitar, tapi yang satu ini benar-benar memecahkan masalah saya telah berjalan uwsgidenganpython 3.6
Evhz
0

Solusi lain yang mungkin adalah menggunakan kembali "kaisar" seluruh sistem, dan hanya mengganti pengikut dengan versi baru. Dengan cara ini Anda tidak perlu membuat folder baru di bawah /etcatau meluncurkan layanan baru rc.local.

  1. Instal uwsgivia pipke virtualenv.
  2. Edit /etc/uwsgi/apps-enabled/your-app.inisebagai berikut:

    • Hapus plugins=...baris (karena pip-compiled uwsgitidak mendukung plugins).
    • Tambahkan baris:

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

      Ini akan memaksa kaisar uWSGI meluncurkan uwsgibiner Anda sendiri sebagai pengikut.

  3. Muat ulang aplikasi Anda di kaisar service uwsgi restart your-app.

Langkah terakhir melaporkan kegagalan untuk me-restart server:

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

Namun, pada kenyataannya, pengikut baru dimulai dengan baik dan juga semua aplikasi lainnya. Saya tidak menemukan waktu untuk men-debug ini.

KT.
sumber