Python

同一個uwsgi Emperor下的不同Python版本?

  • April 13, 2020

我正在執行一個帶有各種 Vassal 的 uwsgi Emperor,每個 Vassal 都為來自不同 virtualenv 的特定 Python 應用程序提供服務。由於 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 上的這個答案,解決這個問題的正確方法是使用不同的 Python 解釋器編譯 uwsgi 作為可載入模組。在我採用這種方法之前,我想知道如何將我的 Vassals 配置為每個使用另一個解釋器外掛。

現在我有一個從我的 /etc/rc.local 啟動的 Emperor 並具有以下設置:

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

然後我有一堆帶有這樣的ini文件的Vassal:

[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。

好吧,由於我並沒有完全被回复所淹沒,所以這是我自己想出的解決方案:

首先,我使用 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

現在有一個 uwsgi Emperor 正在執行,它使用 Python 3 解釋器作為它的附庸。它不會干擾另一個已經在執行並使用 Python 2.7 解釋器的 uwsgi Emperor。

我知道這不是最優的,因為我沒有使用文件中解釋的可插入解釋器架構(感謝 roberto!我不知道我怎麼能忽略這一點)。但是,它執行完美,我不必碰我現有的為大量生產應用程序提供服務的 uwsgi 安裝。

引用自:https://serverfault.com/questions/633437