Django хостинг
Здесь описано как дистанционно установить Django на хостинге, позволяющем это сделать.Я размещаю свои сайты на Django, в том числе и свой сайт стихов, и этот сайт здесь.
Это — виртуальный выделенный сервер (VDS) стоимостью примерно от трех сотен рублей в месяц. На нем можно разместить любой сайт, требующий установки любого программного обеспечения, в том числе Django сайт.
Что такое VDS? VDS — это практически полноценный выделенный сервер, на котором вы — полный хозяин: вы можете установить или удалить любое программное обеспечение, вы можете конфигурировать все, что угодно, под свои нужды, вы можете перезагружать сервер и запускать программы из командной строки или по расписанию. Большой выбор предустановленных операционных систем и программного обеспечения, Root доступ, отличная панель управления, возможность не только разместить множество собственных сайтов, но и перепродавать услуги хостинга, техническая поддержка.
При этом ваш сервер не является отдельной физической машиной, но реализован программно, разделяя один физический компьютер с рядом других таких же виртуальных выделенных серверов. Преимущества VDS: вы платите намного меньше, чем стоит аренда выделенного сервера, и при этом имеете полную свободу действий в ваших web-экспериментах.
Ограничения данной схемы: вы имеете в распоряжении не все ресурсы, имеющиеся в наличии, а только столько, сколько вы оплатили. Если ваш проект потребует больше ресурсов, их всегда можно добавить.
Далее описан процесс уcтановки Django на вышеуказанном хостинге.
Надеюсь, эта шпаргалка поможет вам устроиться на новом месте быстрее.
Установка Django + UWSGI + nginx на Ubuntu 22
Выбираем тариф на firstvds.ru, нажмимаем "купить" - нам будет предложен выбор ОС и других характеристик тарифа. У меня была задача обновить конфигурацию и минимизировать нагрузку. Я выбрал ОС Ubuntu из-за лучшей перспективы в смысле сроков её актуальности и ввиду наличия поддержки по умолчанию свежих версий MySQL/MariaDB, а также отказался от Apache в пользу более легкого nginx.В списке предустановленного ПО выбираем Ispmanager Lite. Это система управления нашим VDS, сильно упрощающая работу. Там можно мониторить потребляемые ресурсы, настраивать выполнение скриптов по расписанию, включать и выключать предустановленное ПО и многое другое. Lite варианта, поддерживающего до 10 сайтов, нам вполне достаточно. Если со временем мы сочтем его излишним и захотим сэкономить, от него можно будет отказаться. Через 5-10 минут после оплаты наш VDS появится в разделе "Виртуальные выделенные серверы" в нашем кабинете. Выделяем наш VDS и нажимаем сверху ссылку "Инструкция". Откроется страница, на которой нужно будет установить (и записать в надежное место) пароль для админа (root) нашего VDS. Там же есть ссылки на разные инструменты управления, включая Ispmanager, Dnsmanager, и другая полезная информация. Запомните, что там есть, чтобы потом не искать :)
У firstvds есть так называемые "рецепты", один из которых можно активировать при заказе VDS. Среди рецептов есть и django + uwsgi. Возможно, достаточно будет активировать этот "рецепт" и дальше ничего не читать. Я узнал об этой опции слишком поздно и всё настраивал вручную, как описано ниже.
Открываем Ispmanager
https://НАШ.IP.АДРЕС:1500/ispmgr
Включаем необходимое нам ПО из предустановленного и выключаем то, что не планируем использовать - например, PHP и Apache.
Ispmanager — Настройки — Конфигурация ПО
Отмечаем галочкой продукт, нажимаем "изменить", чтобы выбрать определенную версию, затем нажимаем "обновить".
Включаем Python нужной версии и сервер СУБД MySQL (там есть выбор между MySQL или MariaDB, я выбрал последнюю)
Видим, что теперь у нас есть MariaDB 10.6.16 (в Ispmanager отображается как MySQL 10.6.16) Идем на сайт Django проверить, поддерживается ли эта версия Django. Ок, поддерживается.
В Ispmanager создаем базы данных
Ispmanager — Базы данных — Создать базу данных
Там же создается пользователь БД (от его имени будет обращаться к БД наш Django проект).
Логично иметь отдельного пользователя и отдельную БД на каждый сайт.
Соединяемся по ssh с правами root (например, через Putty)
В Ispmanager есть аналог (Ispmanager — Администрирование — Shell-клиент), но Putty быстрее и удобнее.
Устанавливаем виртуальное окружение Python
Виртуальное окружение Virtual environment позволяет для каждого проекта устанавливать свой набор модулей Python/Django и свою версию самого Python. Строго говоря, разные версии Питона всё-таки будут стоять в системе, а в Virtual environment будут только ссылки на них, но это детали. Virtual environment рекомендуется использовать с самого начала. Сегодня у Вас один сайт, а через пару лет - несколько, и каждому из них могут быть нужны разные версии ПО - Virtual environment решает эту задачу. У меня стоит задача минимизировать нагрузку, поэтому я предпочел обновить код всех своих сайтов для совместимости с одной свежей версией Python, то есть во всех Virtual environment всех моих сайтов будет иметься ссылка на одну версию Python - ту, с помощью которой я устанавливал Virtual environment.
В версиях Python 3.3 и далее Virtual environment уже включен в поставку как venv, т.е. его не нужно устанавливать отдельно. Если версия Питон более ранняя и при попытке создать окружение командой
python -m venv myvenv
выдается сообщение о том, что окружение не создано, можно сделать так:
cd .. cd home apt install python3.10-venv Создаем окружение с названием site1env: python3 -m venv site1env
Не имеет значения, где именно будет расположено виртуальное окружение по отношению к вашему проекту. Например, мне кажется удобной такая структура:
/home/user1/site1env/
/home/user1/myproject1/
/home/user1/myproject1/myproject1
/home/user1/myproject1/myapp1
/home/user1/myproject1/templates
/home/user1/myproject1/manage.py
/home/user2/site2env/
/home/user2/myproject2/
/home/user2/myproject2/myproject2
и т.д.
Еще раз обращаю внимание, что в site1env будет теперь работать именно тот Python, с помощью которого это site1env было создано, независимо от того, сколько разных версий Python будет в системе.
Впредь установка всех специфичных для проекта модулей Python и Djangо делается после активации venv
Активируем venv:
source site1env/bin/activate
При этом в начале коммандной строки появляется название нашего виртуального окружения в скобках как (site1env).
Прежде всего обновляем pip до актуальной версии, затем с его помощью
устанавливаем mysqlclient (связь с БД), Django и нужные нам модули.
(Учитывайте совместимость версии Django с установленными версиями Python и БД)
python -m pip install --upgrade pip python -m pip install mysqlclientПолучаем сообщение об ошибке:
error: subprocess-exited-with-error
? Getting requirements to build wheel did not run successfully.
Поступаем согласно рекомедациям https://pypi.org/project/mysqlclient/:
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential pkg-config python -m pip install mysqlclient python -m pip install Django (или python -m pip install Django==4.2.8)
и далее устанавливаем модули согласно требованиям проекта.
После установки Django нужно создать аккаунт администратора:
python manage.py createsuperuser
Создаем Django проект myproject1:
django-admin startproject myproject1
Создаем приложение myapp:
cd myproject1 python manage.py startapp myapp
Редактируем settings.py для нашего проекта, не забывая настроить доступ к БД.
python manage.py migrate
проверяем
python manage.py runserver
Выход из venv выполняется командой
deactivate
Здесь мы опускаем собственно разработку django проекта и переходим к тому моменту, когда он готов и выложен на сервер.
Что мелочиться, дайте два!
Установка и настройка uwsgi в режиме emperor
Устанавливаем uWSGI, релизующий взаимодействие наших Django проектов и nginx.Предварительно потребуется установить pip для нашего глобального Питона (не из виртуального окружения):
apt install python3-pip pip install uwsgi
Далее в папке /etc/uwsgi/vassals/
создаём файлы конфигурации для каждого нашего сайта и изменяем права доступа для них на 666
myproject1.ini
myproject2.ini
Пример содержания файла myproject1.ini:
[uwsgi] chdir=/home/user1/myproject1 module=myproject1.wsgi:application # the virtualenv (full path) home=/home/user1/site1env master=true processes=3 max-requests=100 socket=/tmp/myproject1.sock chmod-socket=666 daemonize=/var/log/uwsgi/myproject1.log # clear environment on exit vacuum=true
В папке
/etc/system/system
создаем файл конфигурации uwsgi.service
следующего содержания:
[Unit] Description=uWSGI Emperor service After=syslog.target [Service] ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals Restart=always KillSignal=SIGQUIT Type=notify StandardError=syslog NotifyAccess=all [Install] WantedBy=multi-user.targetТеперь можно запустить uwsgi командой
sudo uwsgi --emperor /etc/uwsgi/vassalsПри этом должен быть выведен отчет о старте uwsgi в режиме emperor и список "вассалов".
Настройка nginx
Обычно для этого в/etc/nginx/sites-available/
создают кофигурационные файлы сайтов mywebsite1name.ru.conf и mywebsite2name.ru.conf подобного содержания:
server { listen 80; server_name mywebsite1name.ru www.mywebsite1name.ru; charset utf-8; access_log /var/www/httpd-logs/mywebsite1name.ru.access.log; error_log /var/www/httpd-logs/mywebsite1name.ru.error.log notice; location /static { alias /home/user1/myproject1/static; } # Finally, send all non-media requests to the Django server. location / { uwsgi_pass unix:/tmp/myproject1.sock; include /home/user1/myproject1/uwsgi_params; } }и затем создают символьные ссылки на них в папке /etc/nginx/sites-enabled:
sudo ln -s /etc/nginx/sites-available/myproject1.conf /etc/nginx/sites-enabledВ случае firstvds это не будет работать, т.к. здесь nginx ищет конфиги сайтов в папке
/etc/nginx/vhosts/www-root/
При создании сайтов через Ispmanager там были созданы соответствующие конфиги с именами mywebsite1name.ru.conf и mywebsite2name.ru.conf Нужно их подредактировать, убрав из них неактуальные для django инструкции и добавив всё то, что приведено в примере конфига выше. В итоге для каждого файла получился примерно такое содержание:
server { server_name mywebsite1name.ru www.mywebsite1name.ru; charset utf-8; include /etc/nginx/vhosts-includes/*.conf; include /etc/nginx/vhosts-resources/mywebsite1name.ru/*.conf; access_log /var/www/httpd-logs/mywebsite1name.ru.access.log; error_log /var/www/httpd-logs/mywebsite1name.ru.error.log notice; gzip on; gzip_comp_level 5; gzip_disable "msie6"; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml; location = /favicon.ico { access_log off; log_not_found off; } location /static { alias /home/myproject1/static; location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf|webp|woff|woff2)$ { expires 24h; } } location / { include uwsgi_params; uwsgi_pass unix:/tmp/myproject1.sock; } listen 80; } server { server_name mywebsite1name.ru www.mywebsite1name.ru; ssl_certificate "/var/www/httpd-cert/www-root/mywebsite1name.ru_le1.crt"; ssl_certificate_key "/var/www/httpd-cert/www-root/mywebsite1name.ru_le1.key"; ssl_ciphers EECDH:+AES256:-3DES:RSA+AES:!NULL:!RC4; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_dhparam /etc/ssl/certs/dhparam4096.pem; charset utf-8; include /etc/nginx/vhosts-includes/*.conf; include /etc/nginx/vhosts-resources/mywebsite1name.ru/*.conf; access_log /var/www/httpd-logs/mywebsite1name.ru.access.log; error_log /var/www/httpd-logs/mywebsite1name.ru.error.log notice; gzip on; gzip_comp_level 5; gzip_disable "msie6"; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml; location = /favicon.ico { access_log off; log_not_found off; } location /static { alias /home/myproject1/static; location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf|webp|woff|woff2)$ { expires 24h; } } location / { include uwsgi_params; uwsgi_pass unix:/tmp/myproject1.sock; } listen 443 ssl; }
Здесь не указан IP адрес в строке listen, т.к. два наших гипотетических сайта имеют один IP и других IP у нас нет. В ином случае оставьте так, как было в изначальных nginx конфигах сайтов - с явным указанием IP адресов. Самоподписанные SSL сертификаты были сгенерированы при создании сайтов в Ispmanager. Если есть другие сертификаты, нужно соответственно указать путь к ним. После внесения изменений в файлы uwsgi перезагружаем uwsgi и nginx:
systemctl restart uwsgi (или service uwsgi restart)systemctl restart nginx (или service nginx restart)
После этого наши сайты должны быть видны в браузере по их именам.
Установка Django + WSGI + Apache + MySQL на CentOS
Этот вариант на 2024 год остается вполне рабочим.Наша цель — запустить джанго-проект на CentOS + Apache + MySQL + Django
WSGI (Web Server Gateway Interface) на данный момент является стандартом для запуска Django.
Для работы необходим ssh клиент. Я использую putty.
Также установите sftp клиент (ftp через ssh). Я использую WinSCP. Обычный FTP не позволяет
входить с правами root.
Для работы будет полезен pip - менеджер пакетов Python.
Проверьте его наличие в системе командой
pipЕсли pip не найден, установить его можно, выполнив следующие команды:
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" python get-pip.py
Установка Django
Установка последней стабильной версии Django:pip install DjangoПри необходимости можно указать, какую именно версию устанавливать:
pip install django==1.8.2
Установка mod_wsgi
В веб-сервере Apache WSGI реализован через модуль mod_wsgi Проверим, установлен ли mod_wsgirpm -q mod_wsgiЕсли мы получим сообщение "package mod_wsgi is not installed", то модуль mod_wsgi требуется установить:
pip install mod_wsgiЕсли не получается (ошибка), то есть два пути: 1) Быть сильнее обстоятельств - погуглить, почему ошибка и как с ней бороться 2) Быть выше их - использовать другой менеджер пакетов. В CentOS есть yum (Yellowdog Updater), воспользуемся им:
yum install mod_wsgi
Установка MySQLdb
Для работы MySQL с Python потребуется драйвер MySQLdb, установим его:yum install MySQL-pythonЕсли при установке выводится сообщение об ошибке или если при попытке доступа к сайту получите сообщение "Error loading MySQLdb module: No module named MySQLdb", значит, MySQL-python не установлен/установлен не полностью. Поробуем так:
pip install MySQL-pythonТеперь работает? Прекрасно! Не работает? Странные жалобы на то, что "EnvironmentError: mysql_config not found"? Я решил эту проблему так:
yum install mariadb-develMariaDB - это свободая (GNU General Public License) версия MySQL. Наверное, есть более правильное решение проблемы, но я нашёл это и результат меня устроил.
Пример конфигурационного файла Apache для Django+WSGI
У вас в системе имеется главный конфигурационный файл Apache, путь к нему /etc/httpd/conf И пользовательские конфигурации ваших виртуальных хостов, путь к ним /etc/httpd/conf/vhosts/www-root Т.е. там есть файл с названием, например, mydomain.ru, который нужно будет отредактировать в соответствии с особенностями Django. Пример конфигурационного файла дан ниже.#user 'www-root' virtual host 'mydomain.ru' configuration file <VirtualHost xx.xxx.xx.xx:80> ServerName mydomain.ru ServerAlias www.mydomain.ru AssignUserID www-root www-root ServerAdmin webmaster@mydomain.ru WSGIDaemonProcess mydomain.ru python-path=/var/www/www-root/data/django-projects/myproject:/usr/lib/python2.7/site-packages Alias /robots.txt /var/www/www-root/data/django-projects/myproject/static/robots.txt Alias /favicon.ico /var/www/www-root/data/django-projects/myproject/static/favicon.ico Alias /static/ /var/www/www-root/data/django-projects/myproject/static/ <Directory /var/www/www-root/data/django-projects/myproject/static> Require all granted </Directory> WSGIScriptAlias / /var/www/www-root/data/django-projects/myproject/myproject/myproject.wsgi CustomLog /var/www/httpd-logs/mydomain.ru.access.log combined ErrorLog /var/www/httpd-logs/mydomain.ru.error.log LogLevel debug <Directory /var/www/www-root/data/django-projects/myproject/myproject> Require all granted </Directory> </VirtualHost>Перезапускаем сервер (это можно сделать из панели управления или командой аpachectl restart в коммандной строке). Если после перезагрузки в списке сервисов (см. в панели управления) нет ни одного процесса httpd — проверяем, что мы написали в конфигурационном файле и исправляем ошибки. Если httpd (один или несколько) есть в списке процессов — сервер работает нормально.
Не забывайте, что после любых изменений в конфигурационном файле и файлах django (кроме шаблонов) сервер необходимо перезагрузить.
Осталось набрать в браузере URL вашего сайта и посмотреть, что из всего этого получилось...
Если с первого раза не все идет гладко — не расстаивайтесь, внимательно пройдитесь
по всем моментам процесса настройки и разберитесь, что вы пропустили. Зайдите по FTP и посмотрите,
действительно ли все созданные вами папки находятся там, где им предполагается быть.
Я же благодарю всех, кто воспользовался вышеприведенными ссылками и желаю им удач
во всех web-начинаниях!
Установка Django + modpython
Наша цель — запустить джанго-проект на freeBSD + Apache + modpython + MySQL + Django SVN (текущая версия из транка).Этот способ устарел и не применяется в современных системах.
Установка Subversion
Subversion — программа контроля версий. С её помощью мы далее установим Django и его модули и всегда сможем одной командой обновить их до последних версий.
Ставим из портов.
Порты freeBSD — это стандартный набор ПО, тестированного на данной ОС.
Установка из портов - самый быстрый и надежный способ.
cd /usr/ports/devel/subversion make install cleanОтмечаем только эти 2 опции:
[X] MOD_DAV_SVN mod_dav_svn module for Apache 2.X
[X] NEON WebDAV/Delta-V repository access module
На втором появившемся экране настроек жмем "cancel".
Установка Django
cd /usr/local/lib/python2.5/site-packages svn co http://code.djangoproject.com/svn/django/trunk/ django-trunkСоздаем символическую ссылку, указывающую, что /django на самом деле нужно искать в /django-trunk/django
ln -s django-trunk/django /usr/local/lib/python2.5/site-packages/djangoДалее "подкладываем" ссылку на django-admin.py туда, где система может ее найти.
cd /usr/local/bin ln -s /usr/local/lib/python2.5/site-packages/django-trunk/django/bin/django-admin.py django-admin.pyЕсли вы ошиблись при создании ссылки и хотите, чтобы новая ссылка перезаписала уже существующую, используйте ключ f:
ln -fs ...
Установка mysql-python
mysql-python — драйвер, реализующий доступ к MySQL из python.Ставим из портов.
cd /usr/ports/databases/py-MySQLdb make install cleanОтмечаем единственную опцию
[X] MYSQLCLIENT_R Use libmysqlclient_r (thread safe)
Установка mod_python
mod_python — модуль python для ApacheСтавим из портов.
cd /usr/ports/www/mod_python3 make install clean
Создание папки для наших django проектов
Джанго-код рекомендуется хранить в местах, недоступных по http. В остальном место, куда вы его положите, принципиального значения не имеет. Предположим, ваш пользовательский эккаунт называется myname (существует пользователь myname).cd /home/myname/data/ mkdir django-appsСоздаем symlink, чтобы иметь отсюда доступ к django:
cd django-apps ln -s /usr/local/lib/python2.5/site-packages/django-trunk/django djangoпроверяем, доступен ли здесь django:
python import djangoесли сообщений об ошибке не появилось, выходим из коммандной оболочки python коммандой quit()
Если django недоступен, проверяем, имеется ли в папке django-apps ссылка django и действительно ли она ведет туда, куда мы ожидаем. Например, щелкните по ссылке в ftp — если появится ссобщение об ошибке ("файл не найден"), это значит, что ссылка неверна. В WinSCP можно получить окно редактирования символической ссылки, выделив ее и нажав Alt+F6.
Создание django проекта
В папке django-apps создаем папку проекта (например, myproject1) и переносим туда по FTP все имеющиеся у нас файлы и папки из папки нашего django-проекта.mkdir myproject1В эту папку мы переносим наши папки приложений, файлы urls.py, settings.py и т.д.
Чистый проект можно содать командой
python django-admin.py startproject myproject2Возможная ошибка: No module named django.core
Решение: возвращаемя к пункту "Если django недоступен"
python manage.py syncdb
Установка модулей Django
cd /home/myname/data/django-apps/myproject1/ svn co http://откуда ставить модульи т.д.
Установка memcached
memcached реализует кэширование страниц. Установка этого ПО опциональна и не влияет на работоспособность всего остального.Ставим из портов.
cd /usr/ports/databases/memcached make install cleanОпцию REPCACHED не отмечаем
Установка python библиотеки для memcached
cd /usr/ports/databases/py-memcached make install cleanПодробнее о конфигурировании и использовании Django + memcached см. на сайте Django.
Настройка settings.py
Для добавления пути к проекту в system path включите в начале settings.pyimport sys sys.path.append('/home/myname/data/django-apps/myproject1')Не забудьте, что данные доступа к БД на продакшн сервере скорее всего не такие, как на тестовом сервере.
После отладки проекта нужно будет отключить вывод подробных сообщений об ошибках:
DEBUG = FalseНастройте пути к медиа файлам (своим и админки Джанго):
MEDIA_ROOT = '/home/myname/data/www/mydomain.ru/files/' MEDIA_URL = 'http://mydomain.ru/files/' ADMIN_MEDIA_PREFIX = '/media/'Предполагается, что пути к медийным файлам (которые обрабатываются сервером, а не django), указаны в вашем коде как "/files/myimage.jpg", "/files/js/myscript.js" и т.п.
Теперь по URL
http://mydomain.ru/files/myimage.jpg или http://mydomain.ru/files/js/myscript.js
сервер будет выдавать соответственно файлы
/home/myname/data/www/mydomain.ru/files/myimage.jpg,
/home/myname/data/www/mydomain.ru/files/js/myscript.js
Теперь нужно создать папку files /home/myname/data/www/mydomain.ru/files и положить туда по FTP свои файлы и папки.
Чтобы админка django нашла свои медийные файлы, нужно будет создать ссылку, связывающую путь /media в URL файлов с их реальным расположением в папке django:
cd /home/myname/data/www/mydomain.ru ln -s /usr/local/lib/python2.5/site-packages/django-trunk/django/contrib/admin/media media
Настройка httpd.conf
httpd.conf — конфигурационный файл Apache, путь к нему:/usr/local/etc/apache22/httpd.conf
Рекомендую перед внесением изменений в httpd.conf сохранить его копию в тихом теплом месте. Если вы в нем допустите ошибку, Apache не будет работать и вам пригодится начальная копия для восстановления порядка.
Кстати, ISPmanager (панель управления) позволяет редактировать любые файлы, в том числе этот.
Итак, вносим в httpd.conf команду загрузки мод-питона:
LoadModule python_module libexec/apache22/mod_python.soДалее дополняем определение вашего виртуального хоста так, чтобы получилось похоже на это:
<VirtualHost 11.222.3.44:80> ServerName mydomain.ru DocumentRoot /home/myname/data/www/mydomain.ru SuexecUserGroup myname myname CustomLog /home/httpd-logs/mydomain.ru.access.log combined ErrorLog /home/httpd-logs/mydomain.ru.com.error.log ServerAlias www.mydomain.ru ServerAdmin webmaster@mydomain.ru AddDefaultCharset utf8 ...... #Этот блок определяет, что все url (/) обрабатываются mod-python, #устанавливает корневую папку нашего джанго-проекта, #включает вывод сообщений об ошибках mod-python и его рестарт при рестарте сервера, #добавляет пути к папке наших проектов и к Django в PythonPath <Location "/"> SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE myproject1.settings PythonOption django.root /myproject1 PythonAutoReload On PythonDebug On PythonPath "['/home/myname/data/django-apps', '/usr/local/lib/python2.5/site-packages/django'] + sys.path" </Location> #Этот блок определяет, что все пути, начинающиеся на /files, обрабатываются сервером. #В папке mydomain.ru/files/... хранятся все наши медиа файлы - картинки, css, js, pdf... <Location "/files"> SetHandler None </Location> #Этот блок определяет, что все пути, начинающиеся на /media, обрабатываются сервером. #В папке mydomain.ru/media/... как бы хранятся медиа файлы джанго-админ интерфейса. #На самом деле нет никакой надобности куда-то переносить сами файлы, достаточно #создать в mydomain.ru/ ссылку media, указывающую на действительное расположение файлов. <Location "/media"> SetHandler None </Location> #этот блок определяет, что все пути, кончающиеся .jpg .gif и т.д., обрабатываются сервером. <LocationMatch "\.(jpg|gif|pdf|zip|css|js|ico)$"> SetHandler None </LocationMatch> </VirtualHost>