Поиск по сайту:

Как установить Django с Postgres, Nginx и Gunicorn на Rocky Linux 9


На этой странице

  1. Предпосылки
  2. Шаг 1. Настройка брандмауэра
  3. Шаг 2. Установите PostgreSQL и утилиты
  4. Шаг 3. Настройка PostgreSQL
  5. Шаг 4. Установите Django
    1. Установить с помощью pip
    2. Установите версию для разработчиков

    1. Запустите постоянный сервер Django с помощью nohup.
    2. Установить Гуникорн

    Django — это фреймворк Python, используемый для разработки динамических веб-сайтов и приложений. Он следует архитектуре MVC (Model-View-Controller). Использование Django ускоряет процесс разработки приложений, так как большинство основных задач выполняется им.

    В этом руководстве вы узнаете, как установить фреймворк Django на сервер Rocky Linux 9. Вы также создадите демонстрационный проект и протестируете его.

    Предпосылки

    • A server running Rocky Linux 9.

    • A non-root user with sudo privileges.

    • A fully qualified domain name (FQDN) pointing to your server. For our purposes, we will use django.example.com as the domain name.

    • Make sure everything is updated.

      $ sudo dnf update
      
    • Install basic utility packages. Some of them may already be installed.

      $ sudo dnf install wget curl nano unzip yum-utils -y
      

    • SELinux отключен.

    Шаг 1. Настройте брандмауэр

    Первым шагом является настройка брандмауэра. Rocky Linux использует Firewalld Firewall. Проверьте состояние брандмауэров.

    $ sudo firewall-cmd --state
    running
    

    Брандмауэр работает с разными зонами, и мы будем использовать публичную зону по умолчанию. Перечислите все службы и порты, активные на брандмауэре.

    $ sudo firewall-cmd --permanent --list-services
    

    Он должен показать следующий вывод.

    cockpit dhcpv6-client ssh
    

    Для работы Django необходимы порты HTTP и HTTPS. Откройте их.

    $ sudo firewall-cmd --add-service=http --permanent
    $ sudo firewall-cmd --add-service=https --permanent
    

    Перезагрузите брандмауэр, чтобы применить изменения.

    $ sudo firewall-cmd --reload
    

    Шаг 2 — Установите PostgreSQL и утилиты

    Rocky Linux 9 поставляется с более старой версией PostgreSQL. Мы установим Postgres 14 для нашего руководства.

    Установите RPM-репозиторий для PostgreSQL.

    $ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    

    Установите сервер PostgreSQL 14.

    $ sudo dnf install -y postgresql14-server postgresql14-contrib postgresql14-devel python3-psycopg2
    

    Инициализировать базу данных.

    $ sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
    

    Включите и запустите службу PostgreSQL.

    $ sudo systemctl enable postgresql-14 --now
    

    Проверить статус услуги.

    $ sudo systemctl status postgresql-14
    ? postgresql-14.service - PostgreSQL 14 database server
         Loaded: loaded (/usr/lib/systemd/system/postgresql-14.service; enabled; vendor preset: disabled)
         Active: active (running) since Mon 2022-09-12 01:17:24 UTC; 2s ago
           Docs: https://www.postgresql.org/docs/14/static/
        Process: 87995 ExecStartPre=/usr/pgsql-14/bin/postgresql-14-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
       Main PID: 88000 (postmaster)
          Tasks: 8 (limit: 5915)
         Memory: 16.5M
            CPU: 60ms
         CGroup: /system.slice/postgresql-14.service
                 ??88000 /usr/pgsql-14/bin/postmaster -D /var/lib/pgsql/14/data/
                 ??88001 "postgres: logger "
                 ??88003 "postgres: checkpointer "
                 ??88004 "postgres: background writer "
                 ??88005 "postgres: walwriter "
                 ??88006 "postgres: autovacuum launcher "
                 ??88007 "postgres: stats collector "
                 ??88008 "postgres: logical replication launcher "
    
    Sep 12 01:17:24 board.example.com systemd[1]: Starting PostgreSQL 14 database server...
    

    Давайте установим некоторые дополнительные утилиты, которые нам потребуются для работы Django.

    $ sudo dnf install -y python3 python3-devel python3-pip gcc
    

    Чтобы устранить любые будущие ошибки, связанные с тем, что pg_config не найден, вам необходимо добавить путь к папке bin PostgreSQL. Откройте файл .bashrc для редактирования.

    $ nano ~/.bashrc
    

    Добавьте следующую строку в конец файла.

    export PATH=$PATH:/usr/pgsql-14/bin	
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Шаг 3 — Настройте PostgreSQL

    Войдите в оболочку PostgreSQL.

    $ sudo -i -u postgres psql
    

    Создайте новую базу данных для Django.

    postgres=# CREATE DATABASE djangoapp;
    

    Создайте нового пользователя базы данных с надежным паролем.

    postgres=# CREATE USER djangouser WITH ENCRYPTED PASSWORD 'dbpassword';
    

    Предоставьте пользователю права на использование базы данных.

    postgres=# GRANT ALL PRIVILEGES ON DATABASE djangoapp TO djangouser;
    

    Выйдите из оболочки Postgres.

    postgres=# \q
    

    Шаг 4 — Установите Джанго

    Существует несколько способов установки Django. Решение о том, какой из них лучше всего подходит для вас, зависит от того, как вы хотите настроить свою среду разработки и от ваших потребностей. У каждого метода есть свой набор плюсов и минусов. Давайте пройдемся по всем этим методам.

    Установить с помощью пипа

    Это самый распространенный способ установки Django. Рекомендуемый способ сделать это — создать виртуальную среду Python. Это позволяет вам устанавливать пакеты Python, не затрагивая систему.

    Давайте создадим каталог демонстрационного проекта.

    $ mkdir ~/sampleproject
    $ cd ~/sampleproject
    

    Создайте виртуальную среду с помощью следующей команды. Замените sample_env именем, которое вы хотите назвать своей виртуальной средой.

    $ python3 -m venv sample_env
    

    Это установит переносимую версию Python, pip в каталог вашего проекта. Чтобы установить какие-либо пакеты в проект, вам необходимо активировать среду с помощью следующей команды.

    $ source sample_env/bin/activate
    

    Приглашение вашей оболочки изменится, чтобы отразить виртуальную среду.

    (sample_env) :~/sampleproject$
    

    Теперь, когда виртуальная среда активирована, используйте pip для установки Django. Выполните следующую команду, чтобы установить Django.

    (sample_env) $ pip install django
    

    Проверьте установку.

    (sample_env) $ django-admin --version
    4.1.2
    

    В зависимости от требований вашего проекта вы можете установить другую версию Django следующим образом.

    (sample_env) $ pip install django==3.2.1
    

    Проверьте установку.

    (sample_env) $ django-admin --version
    3.2.1
    

    Как видите, этот метод устанавливает более новую версию Django, чем версия, полученная из репозитория Rocky Linux.

    Чтобы выйти из виртуальной среды, выполните следующую команду.

    (sample_env) $ deactivate
    

    Установить версию для разработчиков

    Вы также можете использовать pip для установки разрабатываемой версии Django. Для этого мы возьмем версию для разработки из репозитория Djangos Github.

    Клонируйте репозиторий в каталог ~/django-dev, используя следующую команду.

    $ git clone https://github.com/django/django ~/django-dev
    

    Перейдите во вновь созданный каталог.

    $ cd ~/django-dev
    

    Создайте виртуальную среду.

    $ python3 -m venv dev_django_env
    

    Активируйте среду.

    $ source dev_django_env/bin/activate
    

    Установите Django с помощью pip. Флаг -e устанавливает его в редактируемом режиме, который требуется, если вы устанавливаете из системы управления версиями.

    (dev_django_dev) $ pip install -e ~/django-dev
    

    Проверьте установку.

    (dev_django_dev) $ django-admin --version
    4.2.dev20221012095013
    

    Как видите, приведенная здесь версия является последней разрабатываемой версией. Версия Django для разработки не подходит для производственных сред.

    Шаг 5 — Создайте пример проекта

    Давайте создадим пример проекта Django. Создайте каталог для примера проекта.

    $ mkdir ~/dj-sample
    $ cd ~/dj-sample
    

    Создайте виртуальную среду Python.

    $ python3 -m venv sample_proj
    

    Активируйте среду.

    $ source sample_proj/bin/activate
    

    Установите пакет «Колесо».

    (sample_proj) $ pip install wheel
    

    Установите Django и необходимые пакеты.

    (sample_proj) $ pip install django psycopg2 psycopg2-binary
    

    Чтобы построить проект, нам нужно использовать команду startproject. Эта команда создает другой каталог, который включает в себя:

    • Сценарий управления manage.py, используемый для администрирования задач, специфичных для Django.
    • Каталог с тем же именем, что и у проекта, содержащий код проекта.

    Мы создадим каталог проекта в нашем текущем рабочем каталоге. Для этого используйте символ точки (.) в конце следующей команды.

    (sample_proj) $ django-admin startproject demoproject .
    

    Django использует переменную SECRET_KEY для предоставления криптографической подписи. Он генерирует значение по умолчанию во время установки. Вы должны заменить его безопасным значением. Выполните следующую команду, чтобы сгенерировать ключ и скопировать его на будущее.

    (sample_proj) $ python3 -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
    

    Вы получите следующий вывод с ключом.

    wm#dzb^ymuo3s3tza=f5cx^kan!$4sch1!b-q=v%)=d0pb(jqf
    

    Первым шагом является настройка параметров проекта. Откройте файл настроек для редактирования.

    (sample_proj) $ nano demoproject/settings.py
    

    Замените текущее значение переменной SECRET_KEY сгенерированным ключом.

    SECRET_KEY = 's)3m=4s&!a=p#$8(z6e+u8(^tkpw28qyj0t#8ku2'
    

    Измените настройки раздела DATABASES следующим образом.

    DATABASES = {
        'default': {
    		'ENGINE': 'django.db.backends.postgresql_psycopg2',
    		'NAME': 'DATABASE_DB',
    		'USER': 'DATABASE_USER',
    		'PASSWORD': 'DATABASE_PASSWORD',
    		'HOST': 'DATABASE_HOST',
    		'PORT': 'DATABASE_PORT',
    	},
    }
    

    Затем перейдите в конец файла и добавьте параметр для размещения статических файлов. Это важно для работы Nginx и обработки запросов на эти файлы. Добавьте следующую строку над переменной STATIC_URL.

    STATIC_ROOT = os.path.join(BASE_DIR, "static/")
    

    Поскольку переменная STATIC_ROOT использует модуль os, нам нужно его импортировать, так как он не импортируется по умолчанию. Добавьте следующую строку над строкой from pathlib import Path.

    import os
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Проверьте настройки базы данных.

    (sample_proj) $ python manage.py check --database default
    

    Вы должны получить следующий вывод.

    System check identified no issues (0 silenced).
    

    Далее нам нужно перенести базу данных с помощью команды migrate. Миграции в Django распространяют изменения, которые вы вносите в свои модели, в схему вашей базы данных.

    (sample_proj) $ python manage.py makemigrations
    (sample_proj) $ python 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
      Applying admin.0001_initial... OK
      Applying admin.0002_logentry_remove_auto_add... OK
      Applying admin.0003_logentry_add_action_flag_choices... OK
      Applying contenttypes.0002_remove_content_type_name... OK
      Applying auth.0002_alter_permission_name_max_length... OK
      Applying auth.0003_alter_user_email_max_length... OK
      Applying auth.0004_alter_user_username_opts... OK
      Applying auth.0005_alter_user_last_login_null... OK
      Applying auth.0006_require_contenttypes_0002... OK
      Applying auth.0007_alter_validators_add_error_messages... OK
      Applying auth.0008_alter_user_username_max_length... OK
      Applying auth.0009_alter_user_last_name_max_length... OK
      Applying auth.0010_alter_group_name_max_length... OK
      Applying auth.0011_update_proxy_permissions... OK
      Applying auth.0012_alter_user_first_name_max_length... OK
      Applying sessions.0001_initial... OK
    

    Затем создайте пользователя с правами администратора для доступа к интерфейсу администратора Djangos.

    (sample_proj) $ python manage.py createsuperuser
    

    Вам будет предложено ввести имя пользователя, адрес электронной почты и пароль.

    Username (leave blank to use 'navjot'):
    Email address: 
    Password:
    Password (again):
    Superuser created successfully.
    

    Скопируйте статические файлы в статический каталог. При появлении запроса введите yes.

    (sample_proj) $ python manage.py collectstatic
    130 static files copied to '/home/navjot/dj-sample/static'.
    

    Шаг 6. Протестируйте сервер разработки

    Пришло время протестировать приложение. Для этого вам нужно изменить директиву ALLOWED_HOSTS в настройках Django. Эта директива определяет список IP-адресов и доменных имен, которым предоставляется доступ к приложению Django.

    Откройте файл настроек с помощью следующей команды.

    (sample_proj) $ nano demoproject/settings.py
    

    Найдите следующую запись.

    ALLOWED_HOSTS = []
    

    Введите IP-адрес вашего сервера в квадратных скобках. Каждая запись должна быть заключена в кавычки, а несколько записей должны быть разделены запятыми. Ввод www.example.com будет точно соответствовать. Однако .example.com будет соответствовать example.com и www.example.com, а также любым другой поддомен example.com. Поэтому рекомендуется использовать знак точки для префикса доменного имени, чтобы оно соответствовало ему и его поддоменам.

    ALLOWED_HOSTS = ['<yourserver_ip_address>']
    

    Мы использовали IP-адрес для соответствия нашему серверу. Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Прежде чем тестировать сервер разработки, вам необходимо настроить брандмауэр, чтобы Django работал. Django по умолчанию использует порт 8000. Откройте порт с помощью простого брандмауэра (UFW).

    (sample_proj) $ sudo firewall-cmd --add-port=8000/tcp --permanent
    (sample_proj) $ sudo firewall-cmd --reload
    

    Запустите сервер разработки.

    (sample_proj) $ python manage.py runserver 0.0.0.0:8000
    

    Запустите URL-адрес http://:8000 в своем браузере, и вы увидите следующий экран.

    Вы можете получить доступ к интерфейсу администратора, перейдя по URL-адресу http://:8000/admin/, и вы увидите следующий экран входа в систему.

    Введите учетные данные, созданные ранее, чтобы войти в панель администратора, показанную ниже.

    Когда вы закончите работу с демонстрационным проектом, вы можете закрыть сервер, нажав Ctrl + C в своем терминале.

    Шаг 7 — Установите и протестируйте Gunicorn

    Запустите постоянный сервер Django, используя nohup

    Пока служба Djangos не является постоянной. Чтобы сделать службу постоянной, есть два метода. Первый метод предполагает использование утилиты nohup. nohup — это команда POSIX, которая означает отсутствие разрыва связи. Он используется для выполнения команд таким образом, который не останавливается, даже когда пользователь выходит из системы.

    Убедитесь, что вы вышли из сервера из терминала, нажав Ctrl + C.

    Выполните следующую команду, чтобы запустить сервер разработки Djangos.

    (sample_proj) $ nohup python manage.py runserver 0.0.0.0:8000 &
    

    Теперь ваш сервер Django будет продолжать работать, пока вы не выключите его вручную. Команда даст вам идентификатор процесса и выведет другую команду.

    [1] 42595
    (sample_proj) $ nohup: ignoring input and appending output to 'nohup.out'
    ^C
    

    Нажмите Ctrl + C, чтобы выйти. Исходный сервер Django продолжит работу. Вы можете проверить, открыв URL-адрес в браузере.

    Как только вы закончите, вам нужно убить процесс. Команда nohup дает вам один идентификатор процесса. Но на самом деле запускаются два процесса. Чтобы найти идентификаторы для обоих процессов, выполните следующую команду.

    (sample_proj) $ ps aux | grep manage.py
    navjot    153474  1.6  3.9  46264 39016 pts/0    S    04:15   0:00 python manage.py runserver 0.0.0.0:8000
    navjot    153475  3.0  4.4 196060 43500 pts/0    Sl   04:15   0:00 /home/navjot/dj-sample/sample_proj/bin/python manage.py runserver 0.0.0.0:8000
    navjot    153483  0.0  0.2   6420  2248 pts/0    S+   04:15   0:00 grep --color=auto manage.py
    

    Как видите, запущены два процесса, один с идентификатором 153474, а другой с идентификатором 153475.

    Выполните следующую команду, чтобы закрыть сервер, используя идентификаторы процессов, которые вы получили выше.

    (sample_proj) $ sudo kill -9 153474 153475
    

    Установить Гуникорн

    Второй способ запуска постоянного сервера Django требует установки веб-серверов Gunicorn и Nginx. Gunicorn — это HTTP-сервер Python WSGI. Он будет взаимодействовать с приложением Django, а затем Nginx будет выступать в качестве обратного прокси-сервера для Gunicorn. Дополнительным преимуществом этого метода является обеспечение безопасности и производительности, которые обеспечиваются при использовании Nginx.

    Установите Гуникорн.

    (sample_proj) $ pip install gunicorn
    

    Прежде чем продолжить, нам нужно проверить способность Gunicorns обслуживать проект. Выполните следующую команду, чтобы запустить Gunicorn.

    (sample_proj) $ gunicorn --bind 0.0.0.0:8000 demoproject.wsgi:application
    

    Это запустит Gunicorn на том же интерфейсе, на котором работал Django. Для проверки откройте URL-адрес http://:8000 в своем браузере, и вы получите ту же домашнюю страницу Django. Это означает, что Gunicorn работает отлично.

    Когда вы закончите тестирование, нажмите Ctrl + C на терминале, чтобы выйти из Gunicorn.

    Деактивируйте виртуальную среду, чтобы вернуться к своей обычной оболочке.

    (sample_proj) $ deactivate
    

    Шаг 8 — Создайте сокет и служебный файл для Gunicorn

    Первый шаг — создать файл сокета Gunicorn. Сокет Gunicorn будет создан во время загрузки и прослушивать подключения. Когда происходит соединение, systemd автоматически запускает процесс Gunicorn для его обработки.

    Создайте и откройте файл сокета Gunicorn для редактирования.

    $ sudo nano /etc/systemd/system/gunicorn.socket
    

    Вставьте в него следующий код.

    [Unit]
    Description=gunicorn socket
    
    [Socket]
    ListenStream=/run/gunicorn.sock
    
    [Install]
    WantedBy=sockets.target
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Затем создайте и откройте служебный файл Gunicorn для редактирования.

    $ sudo nano /etc/systemd/system/gunicorn.service
    

    Вставьте в него следующий код.

    [Unit]
    Description=django gunicorn daemon
    Requires=gunicorn.socket
    After=network.target
    
    [Service]
    User=navjot
    Group=nginx
    WorkingDirectory=/home/navjot/dj-sample
    ExecStart=/home/navjot/dj-sample/sample_proj/bin/gunicorn \
              -t 3000 \
              --access-logfile - \
              --workers 3 \
              --bind unix:/run/gunicorn.sock \
              demoproject.wsgi:application -w 2
    
    [Install]
    WantedBy=multi-user.target
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса. Замените navjot именем пользователя вашей системы. Группа nginx позволит серверу Nginx взаимодействовать с Django.

    Перезагрузите системный демон, чтобы обновить файлы systemd.

    $ sudo systemctl daemon-reload
    

    Включите и запустите файл сокета Gunicorn.

    $ sudo systemctl start gunicorn.socket
    $ sudo systemctl enable gunicorn.socket
    

    Проверьте состояние сокета Gunicorn.

    $ sudo systemctl status gunicorn.socket
    

    Вы получите аналогичный результат.

    ? gunicorn.socket - gunicorn socket
         Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor preset: disabled)
         Active: active (listening) since Thu 2022-10-13 04:19:28 UTC; 14s ago
          Until: Thu 2022-10-13 04:19:28 UTC; 14s ago
       Triggers: ? gunicorn.service
         Listen: /run/gunicorn.sock (Stream)
         CGroup: /system.slice/gunicorn.socket
    
    Oct 13 04:19:28 django.nspeaks.xyz systemd[1]: Listening on gunicorn socket.
    

    Служба Gunicorn все еще не работает, как вы можете проверить.

    $ sudo systemctl status gunicorn.service
    ? gunicorn.service - django gunicorn daemon
         Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
         Active: inactive (dead)
    TriggeredBy: ? gunicorn.socket
    

    Чтобы проверить механизм активации сокета, выполните следующую команду.

    $ curl --unix-socket /run/gunicorn.sock localhost
    

    Вы получите HTML-вывод домашней страницы Django в своем терминале. Это также запускает Gunicorn для обслуживания приложения. Проверьте статус службы еще раз, и вы увидите, что она работает.

    $ sudo systemctl status gunicorn.service
    ? gunicorn.service - django gunicorn daemon
         Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: disabled)
         Active: active (running) since Thu 2022-10-13 06:13:55 UTC; 1min 34s ago
    TriggeredBy: ? gunicorn.socket
       Main PID: 157742 (gunicorn)
          Tasks: 4 (limit: 5915)
         Memory: 96.2M
            CPU: 1.198s
         CGroup: /system.slice/gunicorn.service
                 ??157742 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
                 ??157746 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
                 ??157747 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
                 ??157748 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
    .......
    

    Шаг 9 — Установите Nginx

    Последний шаг — установка и настройка Nginx. Rocky Linux поставляется со старой версией Nginx. Вам необходимо скачать официальный репозиторий Nginx, чтобы установить последнюю версию.

    Создайте и откройте файл /etc/yum.repos.d/nginx.repo для создания официального репозитория Nginx.

    $ sudo nano /etc/yum.repos.d/nginx.repo
    

    Вставьте в него следующий код.

    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Установите сервер Nginx.

    $ sudo dnf install nginx -y
    

    Проверьте установку.

    $ nginx -v
    nginx version: nginx/1.22.1
    

    Включите и запустите сервер Nginx.

    $ sudo systemctl enable nginx --now
    

    Проверьте состояние сервера.

    $ sudo systemctl status nginx
    ? nginx.service - nginx - high performance web server
         Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
         Active: active (running) since Thu 2022-10-13 06:17:24 UTC; 1s ago
           Docs: http://nginx.org/en/docs/
        Process: 157900 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
       Main PID: 157901 (nginx)
          Tasks: 2 (limit: 5915)
         Memory: 1.9M
            CPU: 18ms
         CGroup: /system.slice/nginx.service
                 ??157901 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
                 ??157902 "nginx: worker process"
    
    Oct 13 06:17:24 django.example.com systemd[1]: Starting nginx - high performance web server...
    

    Шаг 10 — Установите SSL

    Пока что ваше приложение Django обслуживается через HTTP-соединение с открытым текстом. Настоятельно рекомендуется защитить его с помощью SSL-сертификата. Для этого используйте инструмент Certbot с помощью инструмента Snapd. Для работы требуется репозиторий EPEL.

    $ sudo dnf install epel-release
    

    Мы будем использовать Snapd для установки Certbot. Установите Снапд.

    $ sudo dnf install snapd
    

    Включите и запустите службу Snap.

    $ sudo systemctl enable snapd.socket --now
    

    Создайте необходимые ссылки для работы Snapd.

    $ sudo ln -s /var/lib/snapd/snap /snap
    $ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
    

    Установите основной репозиторий Snapd.

    $ sudo snap install core
    $ sudo snap refresh core
    

    Установите Сертбот.

    $ sudo snap install --classic certbot
    $ sudo ln -s /snap/bin/certbot /usr/bin/certbot
    

    Сгенерируйте сертификат. Следующая команда также автоматически настроит Nginx.

    $ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m  -d django.example.com
    

    Приведенная выше команда загрузит сертификат в каталог /etc/letsencrypt/live/django.example.com на вашем сервере.

    Создайте групповой сертификат Диффи-Хеллмана.

    $ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
    

    Чтобы проверить, нормально ли работает обновление SSL, выполните пробный запуск процесса.

    $ sudo certbot renew --dry-run
    

    Если вы не видите ошибок, все готово. Ваш сертификат будет продлен автоматически.

    Шаг 11 — Настройте Nginx

    Создайте и откройте файл /etc/nginx/conf.d/django-gunicorn.conf для редактирования.

    $ sudo nano /etc/nginx/conf.d/django-gunicorn.conf
    

    Вставьте в него следующий код.

    # enforce HTTPS
    server {
      listen 80 default_server;
      server_name django.example.com;
      return 301 https://$server_name$request_uri;
    }
    
    server {
        listen 443 ssl http2;
        server_name django.example.com;
    
        access_log  /var/log/nginx/django.access.log;
        error_log   /var/log/nginx/django.error.log;
    
        http2_push_preload on; # Enable HTTP/2 Server Push
    
        ssl_certificate /etc/letsencrypt/live/django.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/django.example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/django.example.com/chain.pem;
        ssl_session_timeout 1d;
    
        # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
        ssl_protocols TLSv1.2 TLSv1.3;
    
        # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
        # prevent replay attacks.
        #
        # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
        ssl_early_data on;
    
        ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:50m;
    
        # OCSP Stapling ---
        # fetch OCSP records from URL in ssl_certificate and cache them
        ssl_stapling on;
        ssl_stapling_verify on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
    
        add_header X-Early-Data $tls1_3_early_data;
    
        location = /favicon.ico { access_log off; log_not_found off; }
        location /static/ {
            root /home/navjot/dj-sample;
        }
    
        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:/run/gunicorn.sock;
        }
    }
    
    # This block is useful for debugging TLS v1.3. Please feel free to remove this
    # and use the `$ssl_early_data` variable exposed by NGINX directly should you
    # wish to do so.
    map $ssl_early_data $tls1_3_early_data {
      "~." $ssl_early_data;
      default "";
    }
    

    Замените корневой каталог в указанном выше файле каталогом на вашем сервере.

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Откройте файл /etc/nginx/nginx.conf для редактирования.

    $ sudo nano /etc/nginx/nginx.conf
    

    Добавьте следующую строку перед строкой include /etc/nginx/conf.d/*.conf;.

    server_names_hash_bucket_size  64;
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Проверьте конфигурацию Nginx.

    $ sudo nginx -t
    

    Если вы не видите ошибок, значит, все в порядке.

    Вам также потребуется добавить доменное имя в директиву ALLOWED_HOSTS. Откройте файл settings.py.

    $ nano ~/dj-sample/demoproject/settings.py
    

    Измените значение переменной ALLOWED_HOSTS.

    ALLOWED_HOSTS = ['<yourserver_ip_address>','django.example.com']
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Перезапустите сокет и сервис Gunicorn.

    $ sudo systemctl restart gunicorn.socket
    $ sudo systemctl restart gunicorn.service
    

    Перезагрузите сервер Nginx.

    $ sudo systemctl reload nginx
    

    Откройте HTTP-порт. Вы также можете удалить порт 8000, если не собираетесь его больше использовать.

    $ sudo firewall-cmd --remove-port=8000/tcp --permanent
    $ sudo firewall-cmd --reload
    

    Проверьте, открыв URL-адрес http://django.example.com, и домашняя страница Django загрузится.

    Заключение

    На этом мы завершаем наше руководство, в котором вы узнали, как установить Django вместе с Gunicorn и Nginx на сервер Rocky Linux 9. Вы также установили SSL-сертификат для повышения безопасности вашего проекта Django. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.