web-dev-qa-db-ja.com

異なるPython同じuwsgi Emperorの下のバージョン?

私はそれぞれ異なる特定の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を組み合わせる方法を理解するのを助けてください。

8
hedgie

まあ、私は正確に応答に圧倒されていなかったので、ここに私が自分で思いついた解決策があります:

最初に、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インストールに手を加える必要はありませんでした。

8
hedgie

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プロジェクトを同時に実行できます

3

別の可能な解決策は、システム全体の「皇帝」を再利用し、家臣だけを新しいバージョンで置き換えることです。これにより、/etcの下に新しいフォルダーを作成したり、rc.localに新しいサービスを起動したりする必要がなくなります。

  1. uwsgipip経由でvirtualenvにインストールします。
  2. 次のように/etc/uwsgi/apps-enabled/your-app.iniを編集します。

    • plugins=...行を削除します(pipでコンパイルされたuwsgiはプラグインをサポートしていないため)。
    • 次の行を追加します。

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

      これにより、uWSGI皇帝が自分のuwsgiバイナリを家臣として強制的に起動します。

  3. 皇帝service uwsgi restart your-appにアプリをリロードします。

最後のステップで、サーバーの再起動に失敗したことが報告されました。

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

ただし、実際には、新しい家臣は他のすべてのアプリと同様に正常に起動します。これをデバッグする時間はありませんでした。

0
KT.