Назад | Перейти на главную страницу

mod_wsgi «Не удалось вызвать site.addsitedir ()» на платформе AWS Elastic Beanstalk Python 3.6.

В AWS Elastic Beanstalk, на платформе «64-битный Amazon Linux 2017.09 v2.6.0 с Python 3.6», похоже, есть проблема с mod_wsgi конфигурация. Я вижу это в /etc/httpd/conf.d/wsgi.conf:

WSGIDaemonProcess wsgi processes=1 threads=15 display-name=%{GROUP} \
  python-home=/opt/python/run/venv/ \
  python-path=/opt/python/current/app:/opt/python/run/venv/lib64/python3.6/site-packages:/opt/python/run/venv/lib/python3.6/site-packages user=wsgi group=wsgi \
  home=/opt/python/current/app

Однако я получаю это в /var/log/httpd/error_log:

[Mon Nov 20 19:54:44.565076 2017] [:error] [pid 32080] mod_wsgi (pid=32080): Call to 'site.addsitedir()' failed for '(null)', stopping.
[Mon Nov 20 19:54:44.565444 2017] [:error] [pid 32080] mod_wsgi (pid=32080): Call to 'site.addsitedir()' failed for '/opt/python/run/venv/lib64/python3.6/site-packages:/opt/python/run/venv/lib/python3.6/site-packages'.

Попытка получить доступ к сайту приводит к этой ошибке:

[Mon Nov 20 21:21:21.304605 2017] [:error] [pid 2886] [remote 71.236.217.102:39802] ModuleNotFoundError: No module named 'myappname'

Если я изменю WSGIDaemonProcess на следующее (таким образом удаляя пути, разделенные двоеточиями):

WSGIDaemonProcess wsgi processes=1 threads=15 display-name=%{GROUP} \
  python-home=/opt/python/run/venv/ \
  python-path=/opt/python/current/app user=wsgi group=wsgi \
  home=/opt/python/current/app

Тогда я больше не получаю ModuleNotFoundError.

Похоже, это та же ошибка, что и https://github.com/GrahamDumpleton/mod_wsgi/issues/92 что было исправлено в mod_wsgi 4.4.15. Однако AMI поставляется с предустановленной mod24_wsgi-python36.x86_64==3.5-1.24.amzn1.

Если я попытаюсь исправить WSGIDaemonProcess с использованием сценария .ebextensions, он не исправляется одним из встроенных обработчиков развертывания, и, в любом случае, запеченные значения по умолчанию по умолчанию не работают. Как я могу это исправить?

Сегодня я столкнулся с той же проблемой («64-битный Amazon Linux 2017.09 v2.6.0 с Python 3.6», ошибки mod_wsgi).

У меня есть обходной путь, хотя я не уверен, что это правильное или самое прямое решение.

Коротко

Установите последнюю mod_wsgi.

Более длинное объяснение ...

Проверить, что работает вручную

Сначала я сделал следующее вручную, чтобы проверить, работает ли он, затем написал сценарий, чтобы он не был уничтожен при более позднем развертывании.

Установка mod_wsgi будет нужно apxs, поэтому перейдите к экземпляру и найдите пакеты:

eb ssh
yum provides apxs

В моем случае их было 3. Самая старая работала на консоли ssh, поэтому я добавил .ebextensions/01_packages.config:

packages:
  yum:
    ...
    httpd24-devel-2.4.27-3.75.amzn1.x86_64: []

Затем в ssh я выполнил эту последовательность, чтобы протестировать вручную созданную версию od mod_wsgi (Я не мог получить yum пакет для работы - хотя, вероятно, это можно сделать).

sudo -s  # become root
cd /tmp
wget -q "https://github.com/GrahamDumpleton/mod_wsgi/archive/4.4.21.tar.gz"
tar -xzf '4.4.21.tar.gz'
cd ./mod_wsgi-4.4.21
./configure --with-python=/usr/bin/python3.6
make
make install

Предполагая, что пока все в порядке, перезапустите Apache:

service httpd restart

Тогда загляни в var/log/httpd/error_log и, надеюсь, вы увидите:

... [pid 2088] AH00163: Apache/2.4.27 (Amazon) mod_wsgi/4.4.21 Python/3.6.2 configured -- resuming normal operations

Я перезагрузил страницу приложения Python, и она работает (ну, у нее была другая ошибка, но mod_wsgi работает).

А теперь перейдем к этой части развертывания.

Сценарии

После нескольких итераций я остановился на этом в .ebextensions/... файл:

packages:
  yum:
    git: []
    gcc-c++: []
    httpd24-devel-2.4.27-3.75.amzn1.x86_64: []

files:
  "/tmp/update-wsgi.sh" :
    mode: "000755"
    owner: root
    group: root
    content: |
      # update mod_wsgi
      cd /tmp
      wget -q "https://github.com/GrahamDumpleton/mod_wsgi/archive/4.4.21.tar.gz" && \
      tar -xzf '4.4.21.tar.gz' && \
      cd ./mod_wsgi-4.4.21 && \
      sudo ./configure --with-python=/usr/bin/python3.6 && \
      sudo make && \
      sudo make install && \
      sudo service httpd restart

commands:
  mod_wsgi_update:
    command: /tmp/update-wsgi.sh
    cwd: /tmp

Некоторые примечания:

  • в gcc зависимость необходима для mod_wsgi строить
  • в httpd24-devel зависимость для apsx инструмент