Вопрос или проблема
Я запускаю сервер apache2 на Ubuntu 14. Теперь я хочу настроить Apache для работы с mod_wsgi, чтобы запускать Django в подкаталоге домена, например, www.abc.com/lab, но у меня это не получается.
Кстати, я успешно установил Python. Я могу выполнить python --version
, что возвращает Python 2.7.3
. Вот мои шаги по настройке:
-
Я создаю папку pylab в /var/www, внутри которой находятся файлы init.py, init.pyc, manage.py, settings.py, settings.pyc и, наконец, urls.py
-
Затем я перехожу в
/etc/apache2/sites-available
и создаю файл lab со следующим содержимым:<VirtualHost *:80> ServerName /lab DocumentRoot /var/www/pylab <Directory /lab> Options All AllowOverride All Require all granted </Directory> Alias /static/ /var/www/pylab/static/ <Location "/static/"> Options -Indexes </Location> Alias /media/ /var/www/pylab/media/ <Location "/media/"> Options -Indexes </Location> WSGIScriptAlias / /var/www/pylab/wsgi.py WSGIDaemonProcess labapi python-path=/var/www/pylab processes=2 threads=15 display-name=Pylab WSGIProcessGroup pylab </VirtualHost>
Но когда я захожу на www.abc.com/lab, я вижу только ошибку 404. Что я сделал не так?
При размещении Python рекомендуется держать исходные файлы Python вне DocumentRoot
. У Apache есть модуль mod_wsgi, скомпилированный с некоторой версией Python. Вы можете найти эту версию Python в /var/log/apache2/error.log
(Примечание: возможно, вам потребуется использовать sudo для чтения этого файла).
... mod_wsgi/4.7.1 Python/3.8 ...
Установите Python
Вы должны использовать ту же версию Python в вашем проекте. Если вы хотите использовать другую версию Python, вам нужно скомпилировать Python и mod_wsgi из исходных кодов. Установите эти пакеты:
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget
Загрузите и скомпилируйте Python с как минимум включенными флагами optimizations и shared. Если вы не добавите --prefix
, тогда выполните make altinstall
вместо make install
, в противном случае это может перезаписать системный Python, что может быть фатально.
./configure --enable-optimizations --enable-shared --prefix=/opt/Python-3.8.2
make -j4
sudo make install
С j4
в make, будет использоваться 4 параллельных процесса для компиляции.
Установите WSGI
Кроме того, вам следует загрузить и скомпилировать mod_wsgi из исходных кодов. Установите apache(-dev):
sudo apt install apache2 apache2-dev
и скомпилируйте mod_wsgi с этими флагами.
export LD_LIBRARY_PATH=/opt/Python-3.8.2/lib:$LD_LIBRARY_PATH
./configure --with-python=/opt/Python-3.8.2/bin/python3
make -j4
sudo make install
Откройте
sudo vim /etc/apache2/mods-available/wsgi.load
и добавьте в начало
SetEnv LD_LIBRARY_PATH /opt/Python-3.8.2/lib
SetEnv LD_RUN_PATH /opt/Python-3.8.2/lib
перед
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
Настройте Apache
sudo a2enmod wsgi
sudo apachectl graceful
Теперь настроим Apache
sudo vim /etc/apache2/sites-available/000-default.conf
В секции VirtualHost напишите:
WSGIDaemonProcess sitename python-home=/path/to/project/venv python-path=/folder/containing/manage.py
WSGIProcessGroup sitename
#Статический контент
Alias /static /path/to/project/static
<Directory /path/to/project/static>
AllowOverride None
require all granted
</Directory>
#WSGI
WSGIScriptAlias / /path/to/wsgi.py. # путь включает wsgi.py
<Directory /path/containing/wsgi.py>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Наконец, включите сайт и перезапустите Apache плавно:
sudo a2ensite 000-default
sudo apachectl graceful
Посетите localhost
из любого браузера, и это должно работать.
Если вы хотите разместить его в подпапке ‘lab’, замените WSGIScriptAlias
в файле конфигурации apache на
SetEnv SCRIPT_NAME lab
WSGIScriptAlias /lab/ /path/to/wsgi.py. # путь включает wsgi.py
и снова плавно перезапустите Apache.
Ссылки:
Ответ или решение
Настройка Django на субдомене Apache на Ubuntu — это задача, требующая достаточно внимательного подхода, особенно если речь идет о старой версии Ubuntu 14.04, Python 2.7.3, как в вашем случае. В данном ответе мы подробно разберем основные шаги настройки с учетом возможных проблем и улучшений.
Теория
Цель заключается в интеграции вашего Django-приложения с Apache-сервером с использованием модуля mod_wsgi
. Django должен быть доступен по пути www.abc.com/lab
. Для этого потребуется правильно настроить Apache, сформировать WSGI-файл для запуска Django, а также убедиться в совместимости версий Python и mod_wsgi
.
Пример
-
Обновление системных пакетов и установление необходимых зависимостей:
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget apache2 apache2-dev
-
Установка Python и mod_wsgi:
Загрузите и установите Python с нужной версией (например, Python 3.8):
wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz tar -xf Python-3.8.2.tgz cd Python-3.8.2 ./configure --enable-optimizations --enable-shared --prefix=/opt/Python-3.8.2 make -j4 sudo make altinstall
Установите mod_wsgi:
cd /your/path/to/mod_wsgi export LD_LIBRARY_PATH=/opt/Python-3.8.2/lib:$LD_LIBRARY_PATH ./configure --with-python=/opt/Python-3.8.2/bin/python3 make -j4 sudo make install
-
Apache Configuration:
Откройте конфигурационный файл Apache и добавьте необходимые настройки в
<VirtualHost>
:<VirtualHost *:80> ServerName www.abc.com # Static content Alias /static/ /var/www/pylab/static/ <Directory /var/www/pylab/static/> Require all granted </Directory> # Media content Alias /media/ /var/www/pylab/media/ <Directory /var/www/pylab/media/> Require all granted </Directory> # WSGI configuration WSGIDaemonProcess pylab python-home=/path/to/venv python-path=/var/www/pylab WSGIProcessGroup pylab WSGIScriptAlias /lab /var/www/pylab/wsgi.py <Directory /var/www/pylab> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost>
-
Корректировка WSGI файла:
Убедитесь, что ваш
wsgi.py
файл правильно настроен для работы с Django:import os import sys sys.path.append('/var/www/pylab') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings') from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
-
Активация изменений и перезапуск Apache:
Активировать новую конфигурацию и перезапустить Apache:
sudo a2enmod wsgi sudo a2ensite your-config-file.conf sudo apachectl graceful
Применение
Настройка Django-сайта в подкаталоге Apache требует комплексного подхода, включающего обновление Python для совместимости с mod_wsgi
, а также грамотную настройку веб-сервера Apache. Убедитесь, что все пути (например, к статическим файлам и WSGI-файлу) и окружения настроены корректно. Использование виртуального окружения (venv
) для изоляции зависимостей Python также рекомендуется для минимизации конфликтов.
Таким образом, следуя данным шагам, вы сможете успешно развернуть Django-приложение в субдиректории на сервере Apache.