Проблема с решением проблемы "Нет модуля с именем '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>