В 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
.
Если я попытаюсь исправить WSGIDaemonProces
s с использованием сценария .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
инструмент