#python #docker #flask #mod-wsgi #paraview
#python #docker #flask #mod-wsgi #paraview
Вопрос:
У меня есть приложение flask, которое обслуживается через apache / mod_wsgi и запущено в контейнере Docker, который запущен на экземпляре сервера AWS-EC2 Ubuntu 16.04.
Ошибка, которую я получаю, заключается в:
[Wed Mar 27 10:08:55.430668 2019] [mpm_event:notice] [pid 6:tid 139857176496000] AH00489: Apache/2.4.18 (Ubuntu) mod_wsgi/4.6.5 Python/2.7 configured -- resuming normal operations
[Wed Mar 27 10:08:55.430783 2019] [core:notice] [pid 6:tid 139857176496000] AH00094: Command line: 'apache2 (mod_wsgi-express) -f /tmp/mod_wsgi-localhost:9090:999/httpd.conf -D MOD_WSGI_MPM_ENABLE_EVENT_MODULE -D MOD_WSGI_MPM_EXISTS_EVENT_MODULE -D MOD_WSGI_MPM_EXISTS_WORKER_MODULE -D MOD_WSGI_MPM_EXISTS_PREFORK_MODULE -D FOREGROUND'
[Wed Mar 27 10:08:55.443834 2019] [wsgi:error] [pid 8:tid 139857176496000] mod_wsgi (pid=8): Failed to exec Python script file '/tmp/mod_wsgi-localhost:9090:999/handler.wsgi'.
[Wed Mar 27 10:08:55.443868 2019] [wsgi:error] [pid 8:tid 139857176496000] mod_wsgi (pid=8): Exception occurred processing WSGI script '/tmp/mod_wsgi-localhost:9090:999/handler.wsgi'.
[Wed Mar 27 10:08:55.443886 2019] [wsgi:error] [pid 8:tid 139857176496000] Traceback (most recent call last):
[Wed Mar 27 10:08:55.443901 2019] [wsgi:error] [pid 8:tid 139857176496000] File "/tmp/mod_wsgi-localhost:9090:999/handler.wsgi", line 5, in <module>
[Wed Mar 27 10:08:55.443968 2019] [wsgi:error] [pid 8:tid 139857176496000] import time
[Wed Mar 27 10:08:55.443985 2019] [wsgi:error] [pid 8:tid 139857176496000] ImportError: No module named time
Это мой файл mod_wsgi:
#! /usr/bin/python2.7
import sys
import os
##Add this file path to sys.path in order to import settings
sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), '../..'))
sys.path = ['/usr/lib/python2.7', '/usr/local/lib/python2.7']
##Add this file path to sys.path in order to import app
sys.path.insert(0, "/home/niramai/application/")
##Create an application for our app
from postProcessing_flask import app as application
Это мои настройки конфигурации apache:
WSGIScriptAlias /postProcess /home/niramai/application/postProcessing_flask.wsgi
WSGIScriptReloading On
WSGIDaemonProcess website processes=2 threads=15 display-name=%{GROUP} python-path=/home/niramai/application/
<Directory /home/niramai/application>
Order allow,deny
Allow from all
</Directory>
Это мой файл Dockerfile, образ docker построен на образе paraview-osmesa, который cmakes paraview-osmesa:
ARG BASE_IMAGE=kitware/paraviewweb:pv-osmesa-v5.6.0
FROM ${BASE_IMAGE}
ENV DEBIAN_FRONTEND=noninteractive
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/paraview/install/lib/:/usr/lib/python2.7
USER root
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y
python2.7
python-pip
python2.7-dev
lsof
apache2
apache2-dev
vim
libapache2-mod-wsgi
# pip install necesary python packages
RUN pip2 install
Flask
flask-restful
boto3
requests
mod_wsgi
times
###################################################################################
# Start dumb_init as pid 1, to prevent any weird behaviour.
ADD https://github.com/Yelp/dumb-init/releases/download/v1.1.1/dumb-init_1.1.1_amd64 /usr/local/bin/dumb-init
RUN chmod x /usr/local/bin/dumb-init
# Default user is root, which could cause issues in case of a breakout.
RUN groupadd -r niramai amp;amp; useradd -m -r -g niramai niramai
COPY paraview-wsgi.conf /etc/apache2/conf-enabled/
RUN service apache2 restart
RUN mkdir -p /home/niramai/application
WORKDIR /home/niramai/application
RUN ln -fs /usr/lib/python2.7/plat-x86_64-linux-gnu/_sysconfigdata_nd.py /usr/lib/python2.7/
USER niramai
COPY --chown=niramai:niramai . .
EXPOSE 9090
CMD ["dumb-init", "mod_wsgi-express", "start-server", "postProcessing_flask.wsgi", "--port", "9090", "--socket-timeout", "600" ]
Я попытался добавить путь python к WSGIDaemonProcess, попытался добавить sys.path для включения библиотек python.
Попытался изменить разрешения для папок, установив setgid группы (в нижнем регистре «s») с помощью «chmod u s postProcessing_flask.wsgi».
Пытался добавить LD_LIBRARY_PATH и установить исключительно PYTHONPATH в mod_wsgi-express start-server command, но ни один из них не сработал.
Я новичок в этом домене, и любая помощь была бы с благодарностью принята.
Комментарии:
1. Хорошим первым шагом было бы попытаться воспроизвести ту же ситуацию за пределами Python. Можете ли вы запустить тот же скрипт, скажем, в gunicorn? Выдает ли это ту же ошибку? (Явная настройка
sys.path
мне кажется неправильной.)2. Спасибо за ваш комментарий и извините за очень поздний ответ. Благодаря Грэму Дамплтону я понял, что мне не хватало / потерял модуль расширения C, который содержал модуль time. Я обновил python 2.7 до python 3.6, и это решило проблему.