Các phiên bản Python khác nhau dưới cùng một Hoàng đế uwsgi?


9

Tôi đang điều hành một Hoàng đế uwsgi với nhiều chư hầu khác nhau, mỗi người phục vụ một ứng dụng Python cụ thể từ một virtualenv khác nhau. Do uwsgi được biên dịch với trình thông dịch Python 2.7 của riêng nó, nên việc thử sử dụng virtualenv với Python 3 trong đó sẽ tạo ra lỗi sau trong vassal.log:

ImportError: No module named site

Tôi tin rằng nguồn gốc của lỗi này là uwsgi đang sử dụng trình thông dịch Python 2.7 tích hợp của nó, trong khi thư mục virtualenv mà nó đang chạy chỉ hỗ trợ trình thông dịch Python 3. Thật vậy, khi tôi sử dụng một uwsgi khác (đơn giản bằng cách cài đặt nó pip install uwsgitrong cùng một virtualenv), lỗi sẽ biến mất. Tuy nhiên, tôi muốn một Hoàng đế cai trị một số virtualenv khác nhau, vì vậy cài đặt một uwsgi riêng biệt trong mỗi không phải là một lựa chọn.

Dựa theo câu trả lời này trên Stackoverflow, The Right Way để giải quyết vấn đề này là biên dịch uwsgi với các trình thông dịch Python khác nhau dưới dạng các mô-đun có thể tải. Trước khi tôi cam kết với phương pháp này, tôi muốn biết làm thế nào tôi có thể định cấu hình cho các chư hầu của mình để mỗi người sử dụng một trình thông dịch khác.

Ngay bây giờ tôi có một Hoàng đế được bắt đầu từ /etc/rc.local với các cài đặt sau:

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

Sau đó, tôi có một loạt các chư hầu với các tệp ini như thế này:

[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

Tôi không gặp vấn đề gì khi biên dịch một phiên bản tinh chỉnh của uwsgi với một số bổ trợ trình thông dịch, nhưng tôi muốn biết những gì tôi phải thay đổi trong cấu hình của mình để thực sự sử dụng các trình thông dịch riêng biệt này. Tôi chỉ có thể nói một vassal.ini:

plugin = python3.4

và trong một:

plugin = python2.7

?

Xin hãy giúp tôi tìm ra cách kết hợp các ảo ảo Python 2.7 và Python 3 dưới cùng một Hoàng đế uwsgi.


bạn có thể theo dõi đoạn này: uwsgi-docs.readthedocs.org/en/latest/iêu
roberto

Điều này rất hữu ích để xây dựng plugin python 3.6 cho uwsgi, paulox.net/2017/04/04/how-to-use-uwsgi-with-python3-6-in-ub Ubuntu Tôi có thể chỉ định phiên bản nào sẽ sử dụng trong mỗi chư hầu tùy thuộc vào phiên bản bạn muốn plugins=python3hoặcplugins=python36
Dfranc3373

Câu trả lời:


9

Chà, vì tôi không thực sự bị choáng ngợp bởi các câu trả lời, đây là giải pháp tôi tự nghĩ ra:

Đầu tiên, tôi đã tạo một virtualenv mới với trình thông dịch Python 3:

mkvirtualenv -p /usr/bin/python3 python3env

Sau đó, tôi đã cài đặt stock uwsgi từ Pypi, được biên dịch tự động với trình thông dịch Python 3:

pip install uwsgi

Tôi đã tạo một thư mục cấu hình /etc/uwsgi-python3có chứa emaoh.ini và các chư hầu thư mục con, chứa vassal.ini. Cuối cùng, tôi đã thêm dòng sau vào/etc/rc.local

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

Bây giờ có một Hoàng đế uwsgi đang chạy sử dụng trình thông dịch Python 3 cho các chư hầu của nó. Nó không can thiệp vào một Hoàng đế uwsgi khác đang chạy và sử dụng trình thông dịch Python 2.7.

Tôi biết nó không tối ưu, vì tôi không sử dụng kiến ​​trúc trình thông dịch có thể cắm được giải thích trong tài liệu (cảm ơn roberto! Tôi không biết làm thế nào tôi có thể bỏ qua điều đó). Tuy nhiên, nó chạy hoàn hảo và tôi không phải chạm vào bản cài đặt uwsgi hiện có của mình, phục vụ rất nhiều ứng dụng sản xuất.


Sau khi vật lộn với uwsgicài đặt toàn cầu , tôi đã thực hiện phương pháp này. Đẹp ... 1
nicorellius

@hedgie: bạn là một vị thần! Tôi biết rằng không nên có bất kỳ bình luận nào chỉ với một câu "Cảm ơn!" (đã được nâng cấp), nhưng bạn xứng đáng với điều đó. Liên kết để xây dựng các trình cắm Python duy nhất không hoạt động với tôi trên Ubuntu đã bản địa hóa của tôi, nhưng bắt đầu uwsgi được cài đặt trong môi trường ảo chạy với phiên bản python chính xác ( ./venv/bin/uwsgi --python-version). Hoàn hảo!
taffit

Tôi gặp vấn đề tương tự với virtualenv trên py 2.7,14 và uwsgi được cài đặt trên toàn cầu trên py 2.7.5. Nhận được lỗi trang web nhập mặc dù tất cả vẫn là python 2.7
radtek

3

Theo osx tôi đã làm như thế này. Tôi đã mở tất cả uwsgi trên hệ thống của mình (từ brew từ pip, v.v.).

Sau đó tôi đã tải xuống dưới / usr / local mã nguồn

wget https://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar zxvf uwsgi-latest.tar.gz

sau

cd uwsgi-2.0.17
make PROFILE=nolang

Bằng cách này, tôi đã tạo ra một tệp thực thi mà không cần plugin cho python.

Sau đó tôi đã tạo từng plugin cho từng phiên bản trên hệ thống của mình:

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"

Bây giờ tôi có 3 plugin.

Trong các tập tin ini của tôi cho hoàng đế, tôi đã chỉ định các plugin dir và phiên bản plugin cho mỗi tệp

[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

...

Tôi đã liên kết nhị phân uwsgi trong thư mục / usr / local của tôi

ln -s /usr/local/uwsgi-2.0.17/uwsgi /usr/local/bin/uwsgi

Và sau khi chạy hoàng đế

uwsgi --emperor /PATH/TO/INI/FILES/FOLDER/

Và bây giờ tôi có thể chạy dự án python26, python27 và python36


Có rất nhiều giải pháp xung quanh, nhưng điều này thực sự giải quyết được vấn đề tôi đã chạy uwsgivớipython 3.6
Evhz

0

Một giải pháp khả thi khác là tái sử dụng "hoàng đế" toàn hệ thống, và chỉ thay thế chư hầu bằng phiên bản mới. Bằng cách này, bạn không cần phải phát minh ra bất kỳ thư mục mới nào /etccũng như không khởi chạy các dịch vụ mới rc.local.

  1. Cài đặt uwsgithông qua pipvào một virtualenv.
  2. Chỉnh sửa /etc/uwsgi/apps-enabled/your-app.ininhư sau:

    • Xóa plugins=...dòng (vì pip-comp uwsgikhông hỗ trợ plugin).
    • Thêm dòng:

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

      Điều này sẽ buộc hoàng đế uWSGI khởi động uwsginhị phân của riêng bạn làm chư hầu.

  3. Tải lại ứng dụng của bạn trong hoàng đế service uwsgi restart your-app.

Bước cuối cùng bằng cách nào đó báo cáo lỗi không khởi động lại máy chủ:

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

Tuy nhiên, trong thực tế, chư hầu mới bắt đầu tốt cũng như tất cả các ứng dụng khác. Tôi không tìm thấy thời gian để gỡ lỗi này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.