Mod_wsgi: "Нет модуля с именем 'django'".
Возможно, некоторый необходимый контекст:
Я установил python3.9 в каталог /opt/python39/
. Я скомпилировал mod_wsgi с этой версией python (как в этом посте) и смог провести тест, чтобы убедиться, что он работает правильно. Я не использую виртуальную среду.
Я пытаюсь перевести свой проект django в продакшн, поэтому, естественно, я следую django docs. Когда я использую конфигурации файлов по умолчанию в самом начале, т.е.:
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonHome /opt/python39/bin/python3.9
WSGIPythonPath /path/to/mysite.com
<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Он работает (по большей части - на странице не хватает ресурсов, но это для другого поста SO) как шарм.
Так что я продолжаю изучать документацию (которая теперь говорит мне, что я должен перевести его в "Daemon mode"):
"Daemon mode" - это рекомендуемый режим для запуска mod_wsgi (на не-Windows платформах). Чтобы создать необходимую группу процессов демона и делегировать экземпляр Django для запуска в ней, вам нужно будет добавить соответствующие директивы WSGIDaemonProcess и WSGIProcessGroup. Еще одно изменение, которое необходимо внести в приведенную выше конфигурацию, если вы используете режим демона, заключается в том, что вы не можете использовать WSGIPythonPath; вместо этого вы должны использовать опцию python-path в WSGIDaemonProcess, например:
Поэтому я изменяю свой файл так:
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
#WSGIPythonHome /opt/python39/bin/python3.9
#WSGIPythonPath /path/to/mysite.com
WSGIDaemonProcess mysite.com python-home=/opt/python39/bin/python3.9 python-path=/path/to/mysite.com
WSGIProcessGroup mysite.com
<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
затем запускаю sudo apachectl restart
, возвращаюсь в браузер, обновляю, показывает 500 внутреннюю ошибку сервера, проверяю логи, и "что вы знаете?". - ImportError: "No module named 'django'".
Я наткнулся на эту статью SO, которая, похоже, описывает мою проблему, но для виртуальных сред, и предлагает решение, но я все равно попробую:
WSGIProcessGroup mysite.com
WSGIDaemonProcess mysite.com python-home=/opt/python39 python-path=/path/to/mysite.com
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py process-group=iengravethat.com application-group=%{GLOBAL}
Я повторно запускаю sudo apachectl restart
, проверяю браузер - та же ошибка, проверяю логи - та же ошибка.
Я пробовал множество других конфигураций, но все они сводятся к этой ошибке. Есть ли у кого-нибудь идеи, как решить эту проблему?
Это неответ, пожалуйста, дайте мне знать, если это работает для вас, я добавлю больше деталей.
У меня следующая конфигурация:
ServerName ${SERVER_NAME}
ServerAdmin ${SERVER_ADMIN}
<IfModule unixd_module>
User ${APP_USER}
Group ${APP_USER}
</IfModule>
WSGIRestrictEmbedded On
WSGIPassAuthorization On
IncludeOptional /etc/apache2/conf.d/*.conf
Timeout 60
<VirtualHost *:80>
Redirect permanent / https://${SERVER_NAME}/
</VirtualHost>
<VirtualHost *:443>
Alias /media <media folder>
<Directory <media_folder> >
Options -Indexes
Require all granted
</Directory>
Alias /static <static_folder>
<Directory <static_folder> >
Options -Indexes
Require all granted
</Directory>
WSGIDaemonProcess <name> processes=1 threads=5 display-name=%{GROUP} home=<top_folder>
WSGIScriptAlias / <wsgi.py path> process-group=<name> application-group=%{GLOBAL}
... SSL config here ...
</VirtualHost>
Это не полный конфиг: логирование, SSL и WebSocket прокси выброшены.
<name>
- это любой псевдоним<top_folder>
- это папка сmanage.py
файлом<wsgi.py path>
это<top_folder>/something/wsgi.py
<media_folder>
и<static_folder>
- это пути к настройкамMEDIA_ROOT
иSTATIC_ROOT
.
Он развернут с помощью docker (установка пакетов на системном уровне от имени root, без виртуального окружения).
Попробуйте это
Попробуйте использовать
WSGIDaemonProcess mysite.com home=/path/to/mysite.com python-path=/opt/python39/site-packages
(я не уверен в расположении site-packages для этого питона, подкорректируйте его, если нужно)?