Гид по технологиям

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

6 min read DevOps Обновлено 27 Nov 2025
Установка Django на CentOS 8 с Nginx и Gunicorn
Установка Django на CentOS 8 с Nginx и Gunicorn

Иллюстрация фреймворка Django

Что это и для кого

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

Запущенное приложение Django

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

Страница входа в админку Django

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

Панель администратора Django

Установка 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.

Альтернативные подходы

  1. Виртуальное окружение (рекомендуется для изоляции):
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.

  1. Docker: упаковать приложение в контейнер, использовать docker-compose с сервисами web (gunicorn), nginx и БД.
  2. Использовать 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.

Мини‑методология развертывания (шаги)

  1. Установить системные пакеты.
  2. Создать/перейти в каталог проекта.
  3. Создать виртуальное окружение и установить зависимости.
  4. Настроить параметры Django для продакшн.
  5. Настроить Gunicorn systemd‑сервис.
  6. Настроить Nginx как reverse proxy.
  7. Настроить SELinux/Firewall и HTTPS.
  8. Провести 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.target

Nginx (шаблон минимальный):

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: быстрый план действий

  1. Проверить статус systemd: systemctl status django и journalctl -u django -b.
  2. Проверить сокет: ls -la /opt/djangoproject/djangoproject.sock (правообладание и mode).
  3. Проверить SELinux: getenforce и ausearch -m AVC -ts recent.
  4. Проверить конфигурацию 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).

Важно: рассматривайте это как шаблон. Для каждого конкретного проекта могут потребоваться дополнительные шаги (БД, кэширование, очереди задач, бэкапы).

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро