Проблема с решением проблемы "Нет модуля с именем 'encodings'" в mod_wsgi

Прежде всего, я понимаю, что это распространенная проблема, но я думаю, что проблема заключается в том, что некоторые решения не работают, а я не являюсь экспертом в веб-серверах и впервые развертываю проект Django, поэтому я, вероятно, что-то упустил. Просто толчок в правильном направлении был бы очень полезен.

Проблема в основном связана с пакетом Apache mod_wsgi, который облегчает хостинг приложения Django, о котором здесь идет речь. Общесистемная установка на моем Red Hat Linux Enterprise (7) приводит к этой ошибке (рабочий сервер, к которому у меня есть sudo доступ). Ниже я привожу анонимизированный вывод системы и ошибок. Некоторые важные замечания:

  • Проект Django запущен в виртуальной среде /var/www.
  • В системе запущены оба Python 2.7 и Python 3.6.
  • .
  • В системе установлены как mod_wsgi, скомпилированный для Python 2, так и новейший mod_wsgi (установленный с помощью yum; python3-mod_wsgi.x86_64; включая httpd-devel, необходимый для APXS):
  • .
/usr/lib64/httpd/modules/mod_wsgi.so
/usr/lib64/httpd/modules/mod_wsgi_python3.so
  • Сначала загрузился первый, пропустив второй, поэтому я откомментировал соответствующую строку в /etc/httpd/conf.modules.d/10-wsgi.conf, после чего предупреждение исчезло. В файле /etc/httpd/conf.modules.d/10-wsgi-python3.conf у меня есть:
<IfModule !wsgi_module>
    LoadModule wsgi_module modules/mod_wsgi_python3.so
</IfModule>
  • На сервере была запущена прежняя итерация (демо) проекта, работающего на Python 2, который последний раз обновлялся в 2019 году (я думаю). Я скопировал и адаптировал его конфигурационный файл для текущего (Python 3) проекта. Его полное содержание приведено в конце поста.
  • .

Вывод ошибок Apache включает:

...
[Thu Mar 03 23:27:32.639052 2022] [core:notice] [pid 8125] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
[Thu Mar 03 23:27:32.640505 2022] [wsgi:info] [pid 8199] mod_wsgi (pid=8199): Python home /var/www/myproject/env.
[Thu Mar 03 23:27:32.640547 2022] [wsgi:info] [pid 8199] mod_wsgi (pid=8199): Initializing Python.
[Thu Mar 03 23:27:32.640758 2022] [wsgi:info] [pid 8200] mod_wsgi (pid=8200): Python home python-home=/var/www/myproject/env.
[Thu Mar 03 23:27:32.640796 2022] [wsgi:warn] [pid 8200] (2)No such file or directory: mod_wsgi (pid=8200): Unable to stat Python home python-home=/var/www/myproject/env. Python interpreter may not be able to be initialized correctly. Verify the supplied path and access permissions for whole of the path.
...
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'
  • Указанный путь существует и, насколько мне известно, является правильным.
  • Я использовал общесистемный Python 3.6 для создания virtualenv (virtualenv -p python3 env; python3.6 bin включен в env).
  • .
  • Разрешения доступа выглядят нормально. Папка проекта принадлежит мне и той же рабочей группе, к которой принадлежит демо. Я не могу установить ее на www-data, так как не существует фактической группы с таким именем. Однако каталог log/ внутри демонстрации принадлежит группе "apache", поэтому я установил его таким же в своем проекте. Я убедился, что "chmod g+s myproject-folder" и, для безопасности, "chmod o-rwx myproject-folder".

Поскольку демо-приложение имеет то же имя, что и основное приложение в новом проекте Django, я решил удалить конфигурационный файл демо-приложения для безопасности (он больше не нужен).

Предполагая, что демонстрационный конфигурационный файл был правильным (в конце концов, он работал), я изменил только соответствующие пути. В главном конфигурационном файле Apache (/etc/httpd/conf/httpd.conf) DocumentRoot имеет значение "/var/www/html". Он не установлен нигде в конфигурациях проекта.

Основываясь на советах в Интернете, я попробовал следующее:

  • Удалил virtualenv и заново установил все требования.
  • Убедился в своих путях в файле Apache project conf (см. ниже).
  • Попробовал настроить IPv6 согласно этой ссылке: https://geekflare.com/enable-ipv6-nginx-apache/
  • .

Последнее связано с тем, что хотя Apache работает, я не могу просмотреть конфигурацию или справочную информацию из-за синтаксической ошибки:

$ apachectl configtest / apachectl --help / httpd -t (and some others)
AH00526: Syntax error on line 49 of /etc/httpd/conf.d/deb.conf:
SSLCertificateFile: file '/etc/letsencrypt/live/my.web.site/cert.pem' does not exist or is empty

Определенный файл сертификата существует и не является пустым, но при запуске подтверждается, что он устарел:

$ sudo openssl x509 -text -noout -in /etc/letsencrypt/live/my.web.site/cert.pem

Строка, о которой идет речь, следующая:

SSLCertificateFile /etc/letsencrypt/live/my.web.site/cert.pem

Если я закомментирую эту строку, следующее упоминание файла сертификата приводит к той же ошибке, например,

SSLCertificateKeyFile /etc/letsencrypt/live/my.web.site/privkey.pem

и аналогично, с chain.pem и fullchain.pem.

Я установил certbot и попытался использовать его, но кажется, что я не могу использовать IPv6 соединения, которые, кажется, являются тем, что требуют серверы:

$ sudo certbot renew --dry-run -v
...
Failed to renew certificate with error: Requesting acme-staging-v02.api.letsencrypt.org/directory: Network is unreachable

Это работает:

$ curl -Iv4 acme-staging-v02.api.letsencrypt.org/directory / https://google.com / ping -4 google.com

Это не так:

$ curl -Iv6 acme-staging-v02.api.letsencrypt.org/directory / https://google.com / ping -6 google.com

Я пока не знаю, что здесь делать.

Я читал следующий файл, предназначенный для проверки установки mod_wsgi: https://modwsgi.readthedocs.io/en/master/user-guides/checking-your-installation.html

На данный момент я не могу проверить информацию о сборке Apache из-за вышеупомянутой синтаксической ошибки.

Следующая страница, это статически загруженные модули:

$ httpd -l

Compiled in modules:
    core.c
    mod_so.c
    http_core.c

Я смог определить, что значение в моем LD_LIBRARY_PATH, независимо от того, установлено оно или нет, ничего не меняет, поэтому я оставил его как есть.

httpd -M (список статических и разделяемых модулей) приводит к той же синтаксической ошибке.

Далее, я не уверен, как протестировать различные сценарии WSGI в документе. Кажется, ничего не происходит, если я просто запускаю скрипт в своем virtualenv. Но я уверен, что я что-то упускаю.

Основной конфигурационный файл Apache по умолчанию включает все *.confs. Ниже приведен конфигурационный файл проекта. Кстати, порт 8000 недоступен, не уверен, что это имеет значение.

Если вы дочитали до этого момента, большое спасибо за ваше время!

###<VirtualHost *:*>
#    WSGIRestrictEmbedded On
    ServerName my.server.name
    WSGIDaemonProcess myproject user=apache group=apache threads=3 processes=1 inactivity-timeout=86400 display-name=myproject python-home=/var/www/myproject/env python-path=/var/www/myproject/myproject/project home=/var/www/myproject/myproject/project
    WSGIScriptAlias / /var/www/myproject/myproject/project/wsgi.py process-group=myproject
    WSGIPythonHome python-home=/var/www/myproject/env
    WSGIPythonPath /var/www/myproject/myproject
    #Since mod_wsgi 4.1.0:
    #WSGIPythonHashSeed random
    # for now, see /etc/systemd/system/httpd.service

    ErrorLog "/var/log/httpd/myproject-error.log"
    CustomLog "/var/log/httpd/myproject-access.log" combined
    LogLevel info


    <Directory /var/www/myproject/myproject/project>
        WSGIProcessGroup myproject
        WSGIApplicationGroup %{GLOBAL}
       <Files wsgi.py>
        Order deny,allow
        Allow from all
       </Files>
    </Directory>

    Alias /myproject/static/ /var/www/myproject/static/
    <Directory /var/www/myproject/static>
      Allow from all
      ExpiresActive on
      ExpiresDefault "access plus 4 hours"
      <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/css text/javascript image/svg+xml application/x-javascript application/javascript application/json application/x-font-ttf application/vnd.ms-fontobject image/x-icon
        #Don't compress content which is already compressed
        SetEnvIfNoCase Request_URI \.(gif|jpe?g|png|swf|woff|woff2) no-gzip dont-vary
        # Make sure proxies don't deliver the wrong content
                Header append Vary User-Agent env=!dont-vary
       </IfModule>
    </Directory>

###</VirtualHost>
Вернуться на верх