Вот минимальный сценарий 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
Установите для контекста безопасности файлов python доступность HTTPD:
# chcon -R --type=httpd_sys_content_t /srv/git/myproject/
В качестве альтернативы, если файлы python находятся ниже $ HOME, вы можете использовать логические значения SELinux, чтобы HTTPD имел к ним доступ:
# setsebool -P httpd_enable_homedirs on