Это схема создания сайта, который работает на боевом сервере с доменом mysitedomain.ru, используя Nginx для обработки запросов и Gunicorn для выполнения приложения Django.
1. Установка Django и создание проекта
Создадим виртуальное окружение, установим Django и создадим проект.
python3 -m venv venv source venv/bin/activate # активация окружения pip install django django-admin startproject mysite cd mysite python manage.py startapp main
2. Настройка базовой структуры
Добавим приложение main в INSTALLED_APPS в файле mysite/settings.py:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'main', # добавляем наше приложение ]
3. Создание базового шаблона
В папке main создайте директорию templates и в ней папку main. Создадим общий шаблон base.html в директории main/templates/main:
# main/templates/main/base.html:
# Этот шаблон содержит блоки для head, title, meta, header, content и footer, которые можно переопределять на каждой отдельной странице.
<!DOCTYPE html>
<html lang="ru">
<head>
{% block head %}
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Страница{% endblock %}</title>
{% block meta %}{% endblock %}
{% endblock %}
</head>
<body>
<header>
{% block header %}
<h1>Мой сайт</h1>
{% endblock %}
</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>
{% block footer %}
<p>© 2024 Мой сайт</p>
{% endblock %}
</footer>
</body>
</html>
4. Создание шаблонов для страниц
Теперь создадим шаблоны для наших трех страниц: home.html, about.html, и contact.html.
# home.html
# main/templates/main/home.html:
{% extends 'main/base.html' %}
{% block title %}Главная страница{% endblock %}
{% block meta %}
<meta name="description" content="Описание главной страницы.">
{% endblock %}
{% block content %}
<h2>Добро пожаловать на наш сайт!</h2>
<p>Это главная страница нашего сайта.</p>
{% endblock %}
# about.html
# main/templates/main/about.html:
{% extends 'main/base.html' %}
{% block title %}О нас{% endblock %}
{% block meta %}
<meta name="description" content="Описание страницы о нас.">
{% endblock %}
{% block content %}
<h2>О нас</h2>
<p>Мы — компания, которая делает интересные вещи.</p>
{% endblock %}
# contact.html
# main/templates/main/contact.html:
{% extends 'main/base.html' %}
{% block title %}Контакты{% endblock %}
{% block meta %}
<meta name="description" content="Описание страницы контактов.">
{% endblock %}
{% block content %}
<h2>Свяжитесь с нами</h2>
<p>Вы можете связаться с нами по адресу example@example.com</p>
{% endblock %}
5. Определение маршрутов
Добавим маршруты для наших страниц. В файле main/urls.py создадим маршруты:
# main/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('about/', views.about, name='about'),
path('contact/', views.contact, name='contact'),
]
6. Представления (views)
В файле main/views.py создадим представления для каждой страницы:
# main/views.py: from django.shortcuts import render def home(request): return render(request, 'main/home.html') def about(request): return render(request, 'main/about.html') def contact(request): return render(request, 'main/contact.html')
7. Подключение маршрутов
В файле mysite/urls.py подключим маршруты приложения main:
# mysite/urls.py:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('main.urls')),
]
8. Запуск проекта для отладки
Теперь можно запустить сервер разработки и проверить, как работают страницы:
# отладочный сервер python manage.py runserver # После этого, страницы будут доступны по следующим URL: # Главная страница: http://127.0.0.1:8000/ # О нас: http://127.0.0.1:8000/about/ # Контакты: http://127.0.0.1:8000/contact/
9. Запуск проекта на рабочем сервере с использованием домена
# Рекомендуем использовать Gunicorn в качестве WSGI сервера. Установим Gunicorn: pip install gunicorn # Запуск приложение с помощью Gunicorn, чтобы убедиться, что всё работает: gunicorn --workers 3 mysite.wsgi:application # Теперь Gunicorn будет слушать запросы на локальном сервере (по умолчанию на порту 8000). # Но для работы в продакшне нужно настроить его через Nginx.
9.1. Настройка Nginx для проксирования запросов
Nginx будет выполнять роль обратного прокси для Gunicorn. Он будет принимать запросы на домен mysitedomain.ru и перенаправлять их на Gunicorn.
# Если Nginx ещё не установлен, установим его: sudo yum install nginx sudo systemctl start nginx sudo systemctl enable nginx
Создадим конфигурационный файл для сайта:
sudo nano /etc/nginx/conf.d/mysitedomain.conf
# Добавим в файл следующие настройки:
server {
listen 80;
server_name mysitedomain.ru www.mysitedomain.ru;
location / {
# проксируем на Gunicorn
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
# путь к статическим файлам
alias /path/to/your/static/files;
}
location /media/ {
# путь к медиафайлам
alias /path/to/your/media/files;
}
}
nginx -t sudo systemctl restart nginx
9.2. Настройка домена
# В панели управления доменом настройте A-запись для вашего домена mysitedomain.ru, указывающую на IP-адрес вашего сервера: A mysitedomain.ru 123.123.123.123 # Настройка HTTPS # Установка Certbot sudo yum install certbot python3-certbot-nginx # Получение сертификата sudo certbot --nginx -d mysitedomain.ru -d www.mysitedomain.ru # Настройка автообновления сертификатов sudo crontab -e # И добавим строку для ежедневной проверки: 0 3 * * * /usr/bin/certbot renew --quiet
9.3. Настройка статических и медиа файлов
Перед тем, как развернуть сайт на боевом сервере, нужно собрать статические файлы:
# Статические файлы будут собраны в директорию, указанную в STATIC_ROOT в settings.py. Например: python manage.py collectstatic # STATIC_ROOT = '/var/www/mysitedomain/static/' # MEDIA_ROOT = '/var/www/mysitedomain/media/'
9.4. Настройка Gunicorn с systemd
# Создадим файл юнита/сервиса для Gunicorn: sudo nano /etc/systemd/system/gunicorn.service # Добавим следующие настройки: [Unit] Description=gunicorn daemon After=network.target [Service] User=www-data Group=www-data # Замените /path/to/your/project/mysite на путь к вашему проекту, # а /path/to/your/venv/ — на путь к виртуальному окружению. WorkingDirectory=/path/to/your/project/mysite ExecStart=/path/to/your/venv/bin/gunicorn --workers 3 --bind unix:/path/to/your/project/mysite.sock mysite.wsgi:application [Install] WantedBy=multi-user.target
После создания файла юнита, запустим и включим Gunicorn:
# Теперь Gunicorn будет запускаться автоматически при старте системы. sudo systemctl start gunicorn sudo systemctl enable gunicorn
10. Добавление в проект статики: css, js и изображений
Для добавления статики в Django проект, создайте директорию static внутри приложения. Внутри неё можно организовать папки для CSS, JS, и изображений.
main/
static/
main/
css/
style.css
js/
script.js
img/
logo.png
В файле settings.py добавьте или проверьте следующие строки:
# Путь для статики
STATIC_URL = '/static/'
# Путь для собранных статических файлов (после команды collectstatic)
STATIC_ROOT = '/var/www/mysitedomain/static/'
# Пути для пользовательской статики (внутри приложений)
STATICFILES_DIRS = [
BASE_DIR / "main/static",
]
Подключение CSS, JS и логотипа в шаблон
# необходимо сначала загрузить статику в шаблон с помощью тега {% load static %}.
# main/templates/main/base.html:
<!DOCTYPE html>
<html lang="ru">
<head>
{% load static %}
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Мой сайт{% endblock %}</title>
<link rel="stylesheet" href="{% static 'main/css/style.css' %}">
{% block meta %}{% endblock %}
</head>
<body>
<header>
<div class="logo">
<img src="{% static 'main/img/logo.png' %}" alt="Логотип">
</div>
{% block header %}
<h1>Мой сайт</h1>
{% endblock %}
</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>
{% block footer %}
<p>© 2024 Мой сайт</p>
{% endblock %}
<script src="{% static 'main/js/script.js' %}"></script>
</footer>
</body>
</html>
После добавления CSS, JS и изображений, на боевом сервере нужно собрать все статические файлы командой:
# Это переместит все файлы из директорий static в вашу папку, указанную в STATIC_ROOT (например, /var/www/mysitedomain/static/). python manage.py collectstatic
В продакшн-среде Django обычно требует выполнения команды collectstatic после каждого изменения в статических файлах (например, CSS, JS, изображениях). Это связано с тем, что в режиме продакшн Django не обслуживает статические файлы напрямую. Вместо этого Nginx или другой веб-сервер обслуживает их из специально выделенной директории, в которую Django копирует все статические файлы при помощи команды collectstatic.
В режиме разработки (при DEBUG = True) Django обслуживает статические файлы напрямую, и не нужно выполнять collectstatic после каждого изменения.
Комментарии
0Нашли ошибку или хотите дополнить материал?