Это не работает для меня, и я использую
ающая обстановка: Ubuntu 16.04 (с системой Python в 2.7.12) работает в Vagrant / Virtualbox на хосте Windows 10
Настройка Python: Системный python проверяется с помощью python -V без активации virtualenv. Python 3.5 также установлен, и я сделалpipenv --three
создать virtualenv для этого проекта. Делаем python -V в активированном virtualenv (pipenv shell
активировать) показывает Python 3.5.2.
Дополнительный фон: Я разрабатываю приложение Wagtail 2. Wagtail 2 требует Django 2, который, конечно, требует Python 3. У меня есть другие приложения Django на этой машине, которые были разработаны в Django 1.11 / Python 2.7 и обслуживаются Apache. Мы переходим к Django 2 / Python 3 для дальнейшего развития и переходим к nginx / uWSGI для обслуживания приложений.
Я прошел много уроков / итераций. Все сопоставления портов Vagrant настроены нормально, nginx обслуживает мультимедийные / статические файлы и передает запросы к приложению Django на сокете unix, но это приводит к ошибке 502 Gateway not found, поскольку uWSGI не будет работать правильно. Поэтому сейчас я просто запускаю следующую команду из командной строки, чтобы попытаться запустить uWSGI:uwsgi --ini /etc/uwsgi/sites/my_site.com.ini
, Этот файл содержит:
[uwsgi]
uid = www-data
gid = www-data
plugin = python35
# Django-related settings
# the base directory (full path)
chdir=/var/sites/my_site
# Django's wsgi file
wsgi-file = my_site.wsgi
# the virtualenv (full path)
virtualenv=/root/.local/share/virtualenvs/my_site-gmmiTMID
# process-related settings
# master
master = True
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe)
socket = /tmp/my_site.sock
# clear environment on exit
vacuum = True
Я попытался установить uWSGI следующими способами:
общесистемный сpip install uwsgi
также как иpip3 install uwsgi
с помощьюapt-get install uwsgi uwsgi-plugin-python3
Я гарантировал, что одновременно выполняется только одна установка, удалив все предыдущие установки uwsgi. Последний метод установки помещает uwsgi-core в usr / bin, а также в ярлыки usr / bin для uwsgi, uwsgi_python3 и uwsgi_python35.
В файле .ini я тоже пробовалplugin = python3
, Я также пытался из командной строки:
uwsgi_python3 --ini /etc/uwsgi/sites/my_site.com.ini
uwsgi_python35 --ini /etc/uwsgi/sites/my_site.com.ini
Я пытался выполнитьuwsgi ... .ini
Команды как из активированной виртуальной среды, так и с деактивированной virtualenv. Каждая из трех командных строкuwsgi ... .ini
казни (uwsgi ...
, uwsgi_python3 ...
а такжеuwsgi_python35 ...
) НЕОБХОДИМО, чтобы файл .ini был выполнен, но каждый раз я получаю следующую ошибку (последние две строки следующих операторов):
[uwsgi] implicit plugin requested python35
[uWSGI] getting INI configuration from /etc/uwsgi/sites/my_site.com.ini
*** Starting uWSGI 2.0.12-debian (64bit) on [Wed Mar 7 03:54:44 2018] ***
compiled with version: 5.4.0 20160609 on 31 August 2017 21:02:04
os: Linux-4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018
nodename: vagrant-ubuntu-trusty-64
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 2
current working directory: /vagrant/my_site
detected binary path: /usr/bin/uwsgi-core
setgid() to 33
setuid() to 33
chdir() to /var/sites/my_site
your processes number limit is 7743
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to UNIX address /tmp/my_site.sock fd 3
Python version: 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609]
Set PythonHome to /root/.local/share/virtualenvs/my_site-gmmiTMID
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
Если я захожу в командную строку Python в активированном virtualenv и делаюimport encodings
, он импортирует нормально (без сообщений - просто возвращается в командную строку). Поиск этой конкретной ошибки оказался бесполезным. Любая идея, почему появляется ImportError: Нет модуля с именем 'encodings'?
ОБНОВЛЕНИЕ - ПРОБЛЕМА ВСЕГО ПРОИСХОДИТ
Я использую pipenv, и он хранит отдельные virtualenvs в/home/username/.local/share/virtualenvs
папка. Хотя я смог запустить uWSGI из командной строки, выполнив файл конфигурации uWSGI от имени бродячего пользователя (см. Комментарий ниже), я все еще не смог запустить службу с/home/vagrant/.local/share/virtualenvs/my_venv
в конфигурационном файле uWSGI. Я попытался добавить пользователя vagrant в группу www-data и добавить пользователя www-data в группу vagrant. Я также поместил разрешение на чтение и выполнение для всего мира на весь путь (включая отдельный venv), но служба uWSGI все равно не запустится.
HACKISH WORKAROUND
Наконец-то я запустил сервис uWSGI, скопировав venv в/opt/virtualenvs/my_venv
, Затем я смог начать службу сsudo service uwsgi start
, Право собственности на весь этот путь - root: root.
ЕЩЕ ИЩЕТЕ РЕШЕНИЕ ...
Это решение не является оптимальным, так как сейчас я выполняю файл virtualenv, который необходимо будет обновить при обновлении virtualenv по умолчанию, поскольку это расположение не по умолчанию для pipenv, поэтому я все еще ищу ответы. Возможно, это ошибка разрешений Ubuntu, но я просто не могу найти проблему.