Установка Django на CentOS 8 с Nginx и Gunicorn

Что это и для кого
Django — это высокоуровневый web-фреймворк на Python для быстрой разработки безопасных и масштабируемых веб-приложений. Руководство рассчитано на системных администраторов и DevOps-инженеров, которые разворачивают Django в продакшн-среде на CentOS 8.
Ключевые цели: установить зависимости, создать проект, запустить Gunicorn как systemd‑сервис и настроить Nginx в качестве reverse proxy.
Предварительные требования
- Сервер с CentOS 8.
- Настроен root-доступ или пользователь с sudo.
Важно: в продакшне настоятельно рекомендуется запускать Django внутри виртуального окружения (venv) или контейнера, а не глобально через системный pip. В разделе «Альтернативные подходы» показано, как это сделать.
Установка необходимых пакетов
Django — Python-фреймворк, поэтому нужно установить Python и pip:
dnf install python36 python3-pip -yПосле установки пакетов можно продолжать.
Установка Django
Установим Django через pip:
pip3 install DjangoПроверим версию:
django-admin --versionПример ожидаемого вывода (версии могут отличаться):
3.0.3Создание проекта Django
Создадим проект в каталоге /opt:
cd /opt
django-admin startproject djangoprojectПрименим миграции и создадим структуры БД:
cd djangoproject
python3 manage.py migrateОжидаемый вывод миграций (сокращённо):
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
...Создадим суперпользователя для админки:
python3 manage.py createsuperuserСледуйте подсказкам (имя пользователя, email, пароль).
Запуск приложения для тестирования
По умолчанию development‑сервер Django слушает только локальные подключения. Для теста можно запустить его на всех интерфейсах:
cd /opt/djangoproject
python3 manage.py runserver 0.0.0.0:8000Пример сообщения о старте:
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
March 03, 2020 - 02:31:19
Django version 3.0.3, using settings 'djangoproject.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.Важно: development‑сервер не предназначен для продакшн‑использования. Для продакшна используйте WSGI‑сервер (Gunicorn, uWSGI) + прокси (Nginx).
Настройка SELinux и Firewalld
Разрешим порты 8000 и 80 через firewalld:
firewall-cmd --permanent --add-port=8000/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reloadРазрешим httpd-процедурам выход в сеть (нужно для проксирования через сокет/порт):
setsebool httpd_can_network_connect on -PПримечание: при использовании unix-сокета SELinux также может блокировать доступ к файлу сокета. В разделе «Усиление безопасности и SELinux» приведены рекомендации по меткам и разрешениям.
Доступ к приложению
Откройте в браузере: http://your-server-ip:8000

Админка: http://your-server-ip:8000/admin

После входа вы увидите панель управления:

Установка Nginx и Gunicorn
Установим Nginx:
dnf install nginx -yУстановим Gunicorn глобально (рекомендуется внутри виртуального окружения):
pip3 install gunicornЗапустим и добавим Nginx в автозагрузку:
systemctl start nginx
systemctl enable nginxИзменим владельца каталога проекта (в примере — nginx):
chown -R nginx:nginx /opt/djangoprojectПримечание: вместо смены владельца можно запускать Gunicorn под сервисным пользователем (например, django или gunicorn). Важно следить за правами доступа к static/media и сокету.
Создание systemd‑сервиса для Gunicorn
Создадим файл сервиса:
nano /etc/systemd/system/django.serviceДобавьте:
[Unit]
Description=django daemon
After=network.target
[Service]
User=nginx
Group=nginx
WorkingDirectory=/opt/djangoproject
ExecStart=/usr/local/bin/gunicorn --workers 3 --bind unix:/opt/djangoproject/djangoproject.sock djangoproject.wsgi:application
[Install]
WantedBy=multi-user.targetПерезагрузим systemd и запустим сервис:
systemctl daemon-reload
systemctl start django
systemctl enable djangoПроверим статус:
systemctl status djangoОжидаемый вывод (сокращённо):
? django.service - django daemon
Loaded: loaded (/etc/systemd/system/django.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2020-03-02 22:27:51 EST; 3min 32s ago
Main PID: 960 (django)
...Если Gunicorn установлен не в /usr/local/bin, укажите корректный путь (проверьте which gunicorn).
Конфигурация Nginx как обратного прокси
Создайте конфигурацию:
nano /etc/nginx/conf.d/django.confДобавьте:
server {
listen 80;
server_name your-server-ip
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /opt/djangoproject;
}
location / {
proxy_set_header Host $http_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;
proxy_pass http://unix:/opt/djangoproject/djangoproject.sock;
}
}Проверьте синтаксис nginx и перезапустите:
nginx -t
systemctl start nginx
systemctl status nginxТеперь приложение доступно по http://your-server-ip
Критерии приёмки
- Gunicorn работает как systemd‑сервис и слушает unix‑сокет.
- Nginx успешно проксирует запросы к сокету.
- Статические файлы доступны по /static/.
- SELinux/Firewalld не блокируют трафик или доступ к сокету.
Точки отказа и отладка
- Если
systemctl status djangoпоказывает ошибки — проверьте путь к gunicorn и права на рабочую папку. - Если Nginx возвращает 502 Bad Gateway — убедитесь, что сокет /opt/djangoproject/djangoproject.sock существует и пользователь nginx имеет к нему доступ.
- SELinux может блокировать доступ к unix‑сокету. Проверить аудиторные сообщения:
ausearch -m AVC -ts recentилиjournalctl -t setroubleshoot.
Типичные команды для диагностики:
journalctl -u django -b --no-pager
journalctl -u nginx -b --no-pager
ls -l /opt/djangoproject/djangoproject.sock
getenforce
semanage fcontext -l | grep djangoprojectУсиление безопасности
- Отключите DEBUG в settings.py:
DEBUG = False- Убедитесь, что SECRET_KEY не хранится в публичных репозиториях — используйте переменные окружения.
- Ограничьте ALLOWED_HOSTS правильными значениями (IP/доменами).
- Настройте HTTPS (Let’s Encrypt) и перенаправление 80→443 в Nginx.
- Для сокета используйте права и SELinux‑метки, либо используйте привязку на 127.0.0.1:8001 и разрешение httpd_can_network_connect.
Альтернативные подходы
- Виртуальное окружение (рекомендуется для изоляции):
python3 -m venv /opt/djangoproject/venv
source /opt/djangoproject/venv/bin/activate
pip install --upgrade pip
pip install django gunicornИзмените ExecStart в systemd на путь к gunicorn внутри venv, например /opt/djangoproject/venv/bin/gunicorn.
- Docker: упаковать приложение в контейнер, использовать docker-compose с сервисами web (gunicorn), nginx и БД.
- Использовать uWSGI вместо Gunicorn (имеет свои настройки и ini‑файлы).
Рекомендации по производительности
- Количество worker’ов Gunicorn: обычно 2×CPU + 1.
- Используйте кеширование (Redis/Memcached).
- Отдавайте статические файлы напрямую через Nginx.
- Настройте логирование и ротацию логов.
Role‑based чек-листы
DevOps / Системный администратор:
- Установить python3, pip, nginx.
- Настроить systemd‑юнит для gunicorn.
- Настроить SELinux/файрвол.
- Настроить HTTPS и мониторинг.
Разработчик:
- Подготовить settings.py для продакшна (DEBUG=False, ALLOWED_HOSTS, STATIC_ROOT).
- Собрать статические файлы:
python3 manage.py collectstatic. - Обеспечить миграции и миграционные скрипты.
Системный оператор/Dev:
- Проверить logs (journalctl, /var/log/nginx).
- Выполнить smoke‑tests (см. Кейс тестирования ниже).
Кейс тестирования и критерии приёмки
Тест 1 — Доступность приложения:
- Шаги: открыть http://your-server-ip.
- Ожидание: код ответа 200, страница загружается.
Тест 2 — Админка:
- Шаги: открыть /admin, войти под суперпользователем.
- Ожидание: успешный вход, отображение дашборда.
Тест 3 — Статические файлы:
- Шаги: запрос /static/<файл>.
- Ожидание: Nginx отдаёт файл напрямую без обращения к Gunicorn.
Мини‑методология развертывания (шаги)
- Установить системные пакеты.
- Создать/перейти в каталог проекта.
- Создать виртуальное окружение и установить зависимости.
- Настроить параметры Django для продакшн.
- Настроить Gunicorn systemd‑сервис.
- Настроить Nginx как reverse proxy.
- Настроить SELinux/Firewall и HTTPS.
- Провести smoke‑tests и настроить мониторинг.
Быстрая таблица конфигураций (шаблоны)
Systemd (шаблон):
[Unit]
Description=django daemon
After=network.target
[Service]
User=nginx
Group=nginx
WorkingDirectory=/opt/djangoproject
ExecStart=/opt/djangoproject/venv/bin/gunicorn --workers 3 --bind unix:/opt/djangoproject/djangoproject.sock djangoproject.wsgi:application
[Install]
WantedBy=multi-user.targetNginx (шаблон минимальный):
server {
listen 80;
server_name example.com;
location /static/ {
root /opt/djangoproject;
}
location / {
proxy_set_header Host $http_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;
proxy_pass http://unix:/opt/djangoproject/djangoproject.sock;
}
}Ментальные модели и подсказки
- Gunicorn = WSGI‑сервер для запуска вашего кода; Nginx = статические файлы + обратный прокси + TLS.
- Unix‑сокет быстрее и безопаснее, чем привязка к TCP порту локально, но требует корректных прав и SELinux‑меток.
- Виртуальное окружение изолирует зависимости проекта от системных пакетов.
Troubleshooting: быстрый план действий
- Проверить статус systemd:
systemctl status djangoиjournalctl -u django -b. - Проверить сокет:
ls -la /opt/djangoproject/djangoproject.sock(правообладание и mode). - Проверить SELinux:
getenforceиausearch -m AVC -ts recent. - Проверить конфигурацию nginx:
nginx -tиjournalctl -u nginx.
Примеры ошибок и решения
- 502 Bad Gateway: проверьте, запущен ли Gunicorn и доступен ли unix‑сокет; права доступа.
- Permission denied при попытке записи в каталог: проверьте владельца и права на /opt/djangoproject.
- SELinux блокирует доступ к сокету: либо назначьте правильный контекст, либо используйте tcp/127.0.0.1 и разрешите httpd_can_network_connect.
Короткая глоссарий строкой
- Gunicorn: WSGI‑сервер для запуска Django.
- Nginx: HTTP-сервер и обратный прокси.
- systemd: менеджер системных сервисов.
- unix‑сокет: файл для межпроцессного взаимодействия, часто используется для связи Nginx↔Gunicorn.
Заключение
В этом руководстве описаны шаги установки Django на CentOS 8, запуск приложения через Gunicorn как systemd‑сервис и настройка Nginx в качестве обратного прокси. После выполнения всех шагов приложение будет доступно через Nginx, а Gunicorn будет управляться systemd. Для продакшна дополнительно настройте HTTPS, мониторинг, ротацию логов и безопасность (DEBUG=False, безопасное хранение SECRET_KEY).
Важно: рассматривайте это как шаблон. Для каждого конкретного проекта могут потребоваться дополнительные шаги (БД, кэширование, очереди задач, бэкапы).
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента