Как развернуть несколько приложений django на apache в Windows?
Я хочу развернуть несколько приложений django на apache в Windows, но знаю, как развернуть только одно.
Переопределяя localhost сервера Wamp, я могу развернуть приложение без проблем, но мне нужно развернуть больше и я не знаю как. Я видел виртуальные хосты и думаю, что это хорошо, но не знаю, как их настроить. Кто-нибудь знает, как я могу это сделать? Заранее спасибо.
Хостинг нескольких приложений django с Apache возможен с использованием виртуальных хостов (vhosts)
важно заботиться:
при настройке Apache я рекомендую запускать apache из командной строки как "httpd.exe", так как в XAMPP или WAMP вы не увидите некоторых сообщений об ошибках при первоначальном запуске в файлах error.log.
.вы можете использовать только 1 версию python даже в разных virt.env для каждого vhost, так как модуль apache mod_wsgi compilation должен соответствовать ему и загружается один раз при запуске apache
.
примерно следующее в файле httpd.conf (он уже должен быть у вас на месте, поскольку вы используете конфигурацию одного приложения):
LoadFile "c:/.../python/python38/python38.dll"
LoadModule wsgi_module "c:/..../mod_wsgi.cp38-win_amd64.pyd"
как установить путь к virt.env и папкам приложений:
при 1 хосте вы укажете путь к virt.env, установив WSGIPythonHome и WSGIPythonPath на папки приложений в httpd.conf:
.
WSGIPythonHome "d:/..../django_project/env_folder"
WSGIPythonPath "d:/..../django_project/app_name"
но: вы не можете поместить WSGIPythonHome/WSGIPythonPath внутри объявления VirtualHost в httpd-vhosts.conf .... это вызовет сообщение об ошибке
Решение: установить пути в wsgi.py динамически и удалить WSGIPythonHome/WSGIPythonPath из apache *.conf:
wsgi.py:
# replacement for WSGIPythonHome "d:/..../django_project/env_folder"
# choose one:
sys.path.append('d:/.../env_folder/lib/site-packages') # add individual virt.environment packages at the end of sys.path; global env packages have prio
sys.path.insert(0,'d:/.../env_folder/lib/site-packages') # add individual virt.environment packages at the beginning of sys.path; indiv. virt.env packages have prio over global env
# replacement WSGIPythonPath "d:/..../django_project/app_name"
sys.path.append('d:/.../django_project/app_name') # add indiv. app folder to search path
- вот пример для apache conf:
(почему фиктивный хост: есть (странное или баговое) поведение apache ... если ни одно из имен виртуальных хостов не соответствует запросу, то автоматически apache отправит запрос на первый vhost в конфиге - независимо от того, какое имя сервера определено. Это может привести к путанице, потому что будет вызвано совершенно неправильное приложение, и сообщения об ошибке наверняка появятся изнутри django, не указывая на то, что ошибка находится на уровне конфига Apache. Фиктивный хост с простым index.html и сообщением об ошибке может сделать это прозрачным)
httpd-vhost.conf:
<VirtualHost *:80>
ServerName Dumme_Host
DocumentRoot "d:/WEBSPACES/Dummy_Host"
<Directory d:/WEBSPACES/Dummy_Host>
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName xxxx1
WSGIScriptAlias / "d:/.... /wsgi.py" application-group=app_name1
Alias /media/ d:/.../media/
Alias /static/ d:/.../static/
<Directory d:/.../app_name1>
Require all granted
</Directory>
<Directory d:/.../media>
Require all granted
</Directory>
<Directory d:/.../static>
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName xxxx2
WSGIScriptAlias / "d:/.... /wsgi.py" application-group=app_name2
Alias /media/ d:/.../media/
Alias /static/ d:/.../static/
<Directory d:/.../app_name2>
Require all granted
</Directory>
.....
</VirtualHost>