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
Включаем необходимое нам ПО из предустановленного и выключаем то, что не планируем использовать - например, PHP и Apache.
В Ispmanager создаем базы данных
Соединяемся по ssh с правами root (например, через Putty)
Устанавливаем виртуальное окружение Python python -m venv myvenv выдается сообщение о том, что окружение не создано, можно сделать так: cd .. cd home apt install python3.10-venv Создаем окружение с названием site1env: python3 -m venv site1env Не имеет значения, где именно будет расположено виртуальное окружение по отношению к вашему проекту. Например, мне кажется удобной такая структура:
/home/user1/site1env/
/home/user2/site2env/ и т.д. Еще раз обращаю внимание, что в site1env будет теперь работать именно тот Python, с помощью которого это site1env было создано, независимо от того, сколько разных версий Python будет в системе. Впредь установка всех специфичных для проекта модулей Python и Djangо делается после активации venv Активируем venv: source site1env/bin/activate
При этом в начале коммандной строки появляется название нашего виртуального окружения в скобках как (site1env). 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)
и далее устанавливаем модули согласно требованиям проекта. 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 Пример содержания файла 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
В папке [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) После этого наши сайты должны быть видны в браузере по их именам. Установка Django + WSGI + Apache + MySQL на CentOSЭтот вариант на 2024 год остается вполне рабочим.Наша цель — запустить джанго-проект на CentOS + Apache + MySQL + Django WSGI (Web Server Gateway Interface) на данный момент является стандартом для запуска Django.
Для работы необходим ssh клиент. Я использую putty.
Для работы будет полезен 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 и посмотрите,
действительно ли все созданные вами папки находятся там, где им предполагается быть. Установка Django + modpythonНаша цель — запустить джанго-проект на freeBSD + Apache + modpython + MySQL + Django SVN (текущая версия из транка).Этот способ устарел и не применяется в современных системах. Установка SubversionSubversion — программа контроля версий. С её помощью мы далее установим Django и его модули и всегда сможем одной командой обновить их до последних версий.
Ставим из портов. 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". Установка Djangocd /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-pythonmysql-python — драйвер, реализующий доступ к MySQL из python.Ставим из портов. cd /usr/ports/databases/py-MySQLdb make install cleanОтмечаем единственную опцию [X] MYSQLCLIENT_R Use libmysqlclient_r (thread safe) Установка mod_pythonmod_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 Установка модулей Djangocd /home/myname/data/django-apps/myproject1/ svn co http://откуда ставить модульи т.д. Установка memcachedmemcached реализует кэширование страниц. Установка этого ПО опциональна и не влияет на работоспособность всего остального.Ставим из портов. cd /usr/ports/databases/memcached make install cleanОпцию REPCACHED не отмечаем Установка python библиотеки для memcachedcd /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 Теперь нужно создать папку 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.confhttpd.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> |