Развертывание Django + pipenv + Apache + mod_wsgi в Ubuntu без загрузки модулей - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь развернуть проект django на сервере Ubuntu, используя apache и mod_wsgi.

Я использую python3 и pipenv для управления venv.

Переменная окружения PIPENV_VENV_IN_PROJECT=True, чтобы venvсозданный pipenv находится в папке проекта.

Это структура проекта:

/srv/project
|
|-.venv # venv creted by pipenv
| |-bin
| |-...
|
|-Pipfile
|-Pipfile.lock
|
|-django_app
  |
  |-manage.py
  |-...
  |
  |-django_app
    |
    |-settings.py
    |-...
    |-wsgi.py

Конфигурация Apache VirtualHost (/etc/apache2/sites-available/000-default.conf):

<VirtualHost *:80>
    <Directory /srv/project/django_app/django_app>
            <Files wsgi.py>
                    Require all granted
            </Files>
    </Directory>

    WSGIDaemonProcess django_app python-home=/srv/project/.venv python-path=/srv/project/django_app
    WSGIProcessGroup django_app
    WSGIScriptAlias / /srv/project/django_app/django_app/wsgi.py

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Apacheработает нормально и отвечает правильно, пока я не добавлю часть конфигурации WSGI.Затем он перестает отвечать (все запросы ожидают обработки).

И то же сообщение об ошибке повторяется в журнале ошибок apache (/var/log/apache2/error.log) - даже когда запросы не отправляются на сервер:

Current thread 0x00007f300f446bc0 (most recent call first):
[Tue Jan 29 15:43:58.899091 2019] [core:notice] [pid 16407:tid 139844391300032] AH00051: child pid 22818 exit signal Aborted (6), possible coredump in /etc/apache2
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'

Кажется, что процесс не может загружать модули, возможно, из-за неправильной конфигурации venv (на самом деле не используется venv?).Но ничего, что я пробовал, не помогает.

Я также добавил этот код в wsgi.py, но это не помогло:

python_home = '/srv/project/.venv'

activate_this = python_home + '/bin/activate_this.py'
exec(open(activate_this).read(), dict(__file__=activate_this))

Идеи?Спасибо!

1 Ответ

0 голосов
/ 29 января 2019

Проблема решена.Я выполнил пару шагов, и я не уверен, какой именно из них был решающим:

  1. Я заметил, что версия Python в venv отличалась (3.7.2) от версии Python, установленной всистема (3.6.2).Поэтому я понизил требуемую версию в Pipfile до 3.6.7 - теперь она такая же, как и версия системного Python.
  2. Удалил .venv, удалив папку (.venv), затем запустив pipenv --rm
  3. Снова создал venv, запустив pipenv install.Конечно, этот недавно созданный venv был с пониженной версией Python
  4. Перезапущенный apache ... и voilà!

Кроме того, добавление в wsgi.py ненужно и не помог решить проблему:

python_home = '/srv/project/.venv'

activate_this = python_home + '/bin/activate_this.py'
exec(open(activate_this).read(), dict(__file__=activate_this))

Надеюсь, это кому-нибудь поможет.

...