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 uwsgi
di 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.
sumber
plugins=python3
atauplugins=python36
Jawaban:
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:
Kemudian saya menginstal stock uwsgi dari Pypi, yang akan dikompilasi secara otomatis dengan interpreter Python 3:
Saya membuat direktori konfigurasi
/etc/uwsgi-python3
yang berisi emperor.ini dan subdirectory vassals, yang berisi vassal.ini. Akhirnya, saya menambahkan baris berikut ke/etc/rc.local
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.
sumber
uwsgi
instalasi global , saya pergi dengan pendekatan ini. Bagus ... +1./venv/bin/uwsgi --python-version
). Sempurna!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
setelah
Dengan cara ini saya membuat executable tanpa plugin untuk python.
Setelah itu saya membuat setiap plugin untuk setiap versi di sistem saya:
Sekarang saya punya 3 plugin.
Dalam file ini saya untuk kaisar saya tentukan dir plugin dan versi plugin untuk setiap file
Saya menghubungkan biner uwsgi di folder / usr / local saya
Dan setelah menjalankan kaisar
Dan voila sekarang saya dapat menjalankan proyek python26, python27 dan python36 secara bersamaan
sumber
uwsgi
denganpython 3.6
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
/etc
atau meluncurkan layanan barurc.local
.uwsgi
viapip
ke virtualenv.Edit
/etc/uwsgi/apps-enabled/your-app.ini
sebagai berikut:plugins=...
baris (karena pip-compileduwsgi
tidak mendukung plugins).Tambahkan baris:
Ini akan memaksa kaisar uWSGI meluncurkan
uwsgi
biner Anda sendiri sebagai pengikut.Muat ulang aplikasi Anda di kaisar
service uwsgi restart your-app
.Langkah terakhir melaporkan kegagalan untuk me-restart server:
Namun, pada kenyataannya, pengikut baru dimulai dengan baik dan juga semua aplikasi lainnya. Saya tidak menemukan waktu untuk men-debug ini.
sumber