같은 uwsgi 황제 아래 다른 파이썬 버전?


9

각기 다른 virtualenv에서 특정 Python 앱을 제공하는 다양한 Vassal을 사용하여 uwsgi Emperor를 실행하고 있습니다. uwsgi는 자체 Python 2.7 인터프리터로 컴파일되었으므로 Python 3과 함께 virtualenv를 사용하면 vassal.log에 다음 오류가 발생합니다.

ImportError: No module named site

이 오류의 원인은 uwsgi가 내장 Python 2.7 인터프리터를 사용하고 있지만 virtualenv 디렉토리는 Python 3 인터프리터 만 지원한다는 것입니다. 실제로 다른 uwsgi를 사용하면 (간단히 pip install uwsgi동일한 virtualenv 에 설치 하여) 오류가 사라집니다. 그러나 한 황제가 여러 가지 다른 가상 환경을 지배하고 싶기 때문에 각각에 별도의 uwsgi를 설치하는 것은 옵션이 아닙니다.

Stackoverflow 에 대한 이 답변 에 따르면 , 이것을 해결하는 올바른 방법은 다른 파이썬 인터프리터로 uwsgi를로드 가능한 모듈로 컴파일하는 것입니다. 이 방법을 사용하기 전에 다른 인터프리터 플러그인을 사용하도록 Vassal을 구성하는 방법을 알고 싶습니다.

현재 다음 설정으로 /etc/rc.local에서 시작된 황제가 하나 있습니다.

[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의 조정 버전을 컴파일하는 데 아무런 문제가 없지만 실제로 이러한 별도의 인터프리터를 사용하려면 구성에서 무엇을 변경 해야하는지 알고 싶습니다 . 하나의 vassal.ini를 말할 수 있습니까?

plugin = python3.4

그리고 또 다른 :

plugin = python2.7

?

동일한 uwsgi Emperor에서 Python 2.7과 Python 3 virtualenvs를 결합하는 방법을 알아낼 수 있도록 도와주세요.


다음 단락을 따라갈 수 있습니다 : uwsgi-docs.readthedocs.org/en/latest/…
roberto

이것은 uwsgi, paulox.net/2017/04/04/how-to-use-uwsgi-with-python3-6-in-ubuntu 용 Python 3.6 플러그인을 빌드하는 데 편리 했습니다. 당신이 원하는 버전에 따라 각 vassal plugins=python3또는plugins=python36
Dfranc3373

답변:


9

글쎄, 나는 반응에 압도 당하지 않았으므로 여기에 내가 생각해 낸 해결책이 있습니다.

먼저 Python 3 인터프리터를 사용하여 새로운 virtualenv를 만들었습니다.

mkvirtualenv -p /usr/bin/python3 python3env

그런 다음 Pypi에서 uwsgi를 설치했습니다 .Pypi는 Python 3 인터프리터로 자동 컴파일됩니다.

pip install uwsgi

/etc/uwsgi-python3emperor.ini 및 vassal.ini를 포함하는 하위 디렉토리 vassals를 포함 하는 구성 디렉토리 를 작성했습니다 . 마지막으로 다음 줄을 추가했습니다./etc/rc.local

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

이제 uwsgi Emperor가 실행 중이며 파이썬 3 해석기를 사용합니다. 이미 실행 중이고 Python 2.7 인터프리터를 사용하는 다른 uwsgi Emperor를 방해하지 않습니다.

설명서에 설명되어있는 플러그 가능한 인터프리터 아키텍처를 사용하지 않기 때문에 최적 이 아니라는 것을 알고 있습니다 (로버트 덕분입니다! 어떻게 간과했는지 알 수 없습니다). 그러나 완벽하게 실행되며 많은 프로덕션 앱을 제공하는 기존 uwsgi 설치를 만질 필요가 없습니다.


글로벌 uwsgi설치로 어려움을 겪고 나서이 접근법을 사용했습니다. Nice ... +1
nicorellius

@ 헤지 : 당신은 신이야! "감사합니다"라는 의견이 있으면 안됩니다. (이미 취소), 당신은 그것을 가치가 있습니다. 현지화 된 우분투에서 단일 Python 플러그인을 빌드하기위한 링크가 작동하지 않았지만 가상 환경에 설치된 uwsgi를 시작하면 올바른 Python 버전 ( ./venv/bin/uwsgi --python-version)으로 실행됩니다 . 완전한!
taffit

py 2.7.14에서 virtualenv와 동일한 문제가 발생하고 uwsgi가 py 2.7.5에 전 세계적으로 설치되었습니다. 여전히 모든 파이썬 2.7인데도 가져 오기 사이트 오류 발생
radtek

3

osx에서 나는 이렇게했다. 나는 내 시스템의 모든 uwsgi를 unistalled했습니다 (핍 등에서 추출한 것에서).

그 후 / 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=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/

그리고 voila는 이제 python26, python27 및 python36 프로젝트를 동시에 실행할 수 있습니다


이 많은 솔루션은 주위에 있지만,이 사람은 정말 내가 실행 한 문제 해결 uwsgipython 3.6
Evhz

0

또 다른 가능한 해결책은 시스템 전체의 "황제"를 재사용하고 새로운 버전으로 만 혈관을 대체하는 것입니다. 이렇게하면에 새 폴더를 만들 /etc거나에 새로운 서비스를 시작할 필요가 없습니다 rc.local.

  1. 설치 uwsgi를 통해 pipVIRTUALENV에.
  2. /etc/uwsgi/apps-enabled/your-app.ini다음과 같이 편집하십시오 .

    • plugins=...pip-compiled uwsgi는 플러그인을 지원하지 않기 때문에 행을 제거하십시오 .
    • 라인을 추가하십시오 :

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

      이것은 uWSGI 황제가 자신의 uwsgi바이너리를 속임수로 시작하게합니다 .

  3. 황제에 앱을 다시로드하십시오 service uwsgi restart your-app.

마지막 단계에서 서버를 다시 시작하지 못한 경우가 있습니다.

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

그러나 실제로 새로운 vassal은 다른 모든 앱과 마찬가지로 잘 시작됩니다. 이것을 디버깅 할 시간을 찾지 못했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.