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

Импорт модуля Python из сценария WSGI не удается на сервере RedHat

Вот минимальный сценарий WSGI, импортирующий настраиваемый модуль Python.

Он отлично работает в среде разработки (Mint 18.1, Apache 2.4.18, libapache2-mod-wsgi-py3), но не работает при развертывании на тестовом сервере (RHEL 8.0, Httpd / Apache 2.4.37, python3-mod_wsgi).

Вот блок конфигурации apache:

<VirtualHost *:80>
      ServerName localhost
      ServerAdmin admin@localhost
      WSGIDaemonProcess MyApp
      WSGIProcessGroup MyApp
      WSGIScriptAlias /test /var/www/wsgi/wsgiapp.wsgi
      <Directory /var/www/wsgi/>
         Require all granted
      </Directory>
      LogLevel warn
</VirtualHost>

Скрипт WSGI (/var/www/wsgi/wsgiapp.wsgi):

#!/usr/bin/python3
import sys 
path = '/srv/git/myproject/mymodule/'
if path not in str(sys.path):
   sys.path.insert(0, path)
from hellofunc import hello as application

Файл для импорта (/srv/git/myproject/mymodule/hellofunc.py):

def hello(environ, start_response):
   start_response('200 OK', [('Content-type', 'text/plain'),('Content-Length','6')])
   return [b'Hello']

Журнал ошибок Apache на сервере RedHat:

mod_wsgi (pid = 1060): не удалось запустить файл сценария Python '/var/www/wsgi/wsgiapp.wsgi'. mod_wsgi (pid = 1060): исключение при обработке сценария WSGI '/var/www/wsgi/wsgiapp.wsgi'. Traceback (последний вызов последним): файл "/var/www/wsgi/wsgiapp.wsgi", строка 7, из hellofunc импортировать привет как приложение ModuleNotFoundError: нет модуля с именем 'hellofunc'

Права доступа к файлам организованы таким образом, чтобы группы apache / www-data могли читать / выполнять файлы на каждом сервере. Использовались только пакеты дистрибутива. Ничего не построено из исходников и не установлено через Python pip.

На сервере RedHat по умолчанию включен SELinux. Подтверждено установкой разрешающего режима:

# setenforce 0

РЕДАКТИРОВАТЬ: настройки SELinux

Установите для контекста безопасности файлов python доступность HTTPD:

# chcon -R --type=httpd_sys_content_t /srv/git/myproject/

В качестве альтернативы, если файлы python находятся ниже $ HOME, вы можете использовать логические значения SELinux, чтобы HTTPD имел к ним доступ:

# setsebool -P httpd_enable_homedirs on