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 для этого питона, подкорректируйте его, если нужно)?

Вернуться на верх