私はそれぞれ異なる特定のPythonアプリを提供するさまざまなVassalsでuwsgi Emperorを実行しています。uwsgiは独自のPython 2.7インタープリターでコンパイルされているためPython 3でvirtualenvを使用しようとすると、vassal.logに次のエラーが発生します。
ImportError: No module named site
このエラーの原因は、uwsgiが組み込みのPython 2.7インタープリターを使用していることですが、実行されているvirtualenvディレクトリーはPython 3インタープリターしかサポートしていません。確かに、別のuwsgiを使用すると(単純に同じvirtualenvにpip install uwsgi
をインストールしてインストールした場合)、エラーが表示されなくなります。それぞれはオプションではありません。
Stackoverflowの this answer によると、これを解決する正しい方法は、さまざまなPythonインタプリタをロード可能なモジュールとしてuwsgiをコンパイルすることです。このアプローチに取り組む前に、 dそれぞれのVassalsが別のインタープリタープラグインを使用するように設定する方法を知りたい。
現在、私は/etc/rc.localから次の設定で起動された1つの皇帝を持っています。
[uwsgi]
uid = www-data
gid = www-data
master = true
emperor = /etc/uwsgi/vassals
daemonize = /var/log/uwsgi/emperor.log
それから私はこのようなiniファイルを持つVassalsの束を持っています:
[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
いくつかのインタープリタープラグインを使用して、調整されたバージョンのuwsgiをコンパイルしても問題ありませんが、実際にこれらの個別のインタープリターをuseに変更するために、何を変更する必要があるか知りたいのですが。 vassal.iniを1つだけ言ってください。
plugin = python3.4
そして別の:
plugin = python2.7
?
同じuwsgi皇帝の下でPython 2.7とPython 3 virtualenvsを組み合わせる方法を理解するのを助けてください。
まあ、私は正確に応答に圧倒されていなかったので、ここに私が自分で思いついた解決策があります:
最初に、Python 3インタープリターで新しいvirtualenvを作成しました:
mkvirtualenv -p /usr/bin/python3 python3env
次に、Pypiからストックuwsgiをインストールしました。これは、Python 3インタープリターで自動的にコンパイルされます。
pip install uwsgi
Emperor.iniを含む構成ディレクトリ/etc/uwsgi-python3
と、vassal.iniを含むサブディレクトリvassalsを作成しました。最後に、/etc/rc.local
に次の行を追加しました
/home/user/.virtualenvs/python3env/bin/uwsgi --ini /etc/uwsgi-python3/emperor.ini
これで、その家臣にPython 3インタープリターを使用するuwsgi Emperorが実行されています。これは、すでに実行されているPythonを使用する別のuwsgi Emperorに干渉しません= 2.7通訳。
ドキュメントに説明されている プラグイン可能なインタープリターアーキテクチャを使用していないため、最適ではないことがわかります (robertoに感謝します!方法がわかりません)見落としている可能性があります)。しかし、それは問題なく実行され、多くの製品アプリを提供している既存のuwsgiインストールに手を加える必要はありませんでした。
OSXの下で私はこのように作りました。私のシステムのすべてのuwsgiをアンインストールしました(bipからbrewなどから)。
その後、/ usr/localの下にソースコードをダウンロードしました
wget https://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar zxvf uwsgi-latest.tar.gz
後
cd uwsgi-2.0.17
make PROFILE=nolang
このようにして、Pythonのプラグインなしで実行可能ファイルを作成しました。
その後、システムの各バージョンの各プラグインを作成しました。
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"
今、私は3つのプラグインを持っています。
皇帝の私のiniファイルで、各ファイルのプラグインディレクトリとプラグインバージョンを指定しました
[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
...
/ usr/localフォルダにあるuwsgiバイナリをシンボリックリンクしました
ln -s /usr/local/uwsgi-2.0.17/uwsgi /usr/local/bin/uwsgi
そして皇帝を実行した後
uwsgi --emperor /PATH/TO/INI/FILES/FOLDER/
そして出来上がり、python26、python27、python36プロジェクトを同時に実行できます
別の可能な解決策は、システム全体の「皇帝」を再利用し、家臣だけを新しいバージョンで置き換えることです。これにより、/etc
の下に新しいフォルダーを作成したり、rc.local
に新しいサービスを起動したりする必要がなくなります。
uwsgi
をpip
経由でvirtualenvにインストールします。次のように/etc/uwsgi/apps-enabled/your-app.ini
を編集します。
plugins=...
行を削除します(pipでコンパイルされたuwsgi
はプラグインをサポートしていないため)。次の行を追加します。
unprivileged-binary-patch = /path/to/your/venv/bin/uwsgi
これにより、uWSGI皇帝が自分のuwsgi
バイナリを家臣として強制的に起動します。
皇帝service uwsgi restart your-app
にアプリをリロードします。
最後のステップで、サーバーの再起動に失敗したことが報告されました。
* Starting app server(s) uwsgi
...fail!
ただし、実際には、新しい家臣は他のすべてのアプリと同様に正常に起動します。これをデバッグする時間はありませんでした。