Как настроить Django с помощью Postgres, Nginx и Gunicorn в Ubuntu 16.04

Вступление

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

В этом руководстве мы покажем, как установить и настроить некоторые компоненты в Ubuntu 16.04 для поддержки и обслуживания приложений Django. Мы будем настраивать базу данных PostgreSQL вместо использования базы данных SQLite по умолчанию. Мы настроим сервер приложений Gunicorn для взаимодействия с нашими приложениями. Затем мы настроим Nginx для обращения прокси к Gunicorn, предоставляя нам доступ к его функциям безопасности и производительности для обслуживания наших приложений.

Предпосылки и цели

Для выполнения этого руководства у вас должен быть свежий экземпляр сервера Ubuntu 16.04 с пользователем без полномочий root с настроенными привилегиямиsudo. Вы можете узнать, как это настроить, пройдя через нашinitial server setup guide.

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

После того, как мы запустим нашу базу данных и приложение, мы установим и настроим сервер приложений Gunicorn. Это будет служить интерфейсом для нашего приложения, переводя запросы клиентов в HTTP-вызовах Python, которые наше приложение может обрабатывать. Затем мы настроим Nginx перед Gunicorn, чтобы воспользоваться его высокопроизводительными механизмами обработки соединений и простыми в реализации функциями безопасности.

Давайте начнем.

Установите пакеты из репозитория Ubuntu

Чтобы начать процесс, мы загрузим и установим все нужные нам элементы из репозиториев Ubuntu. Мы будем использовать менеджер пакетов Pythonpip для установки дополнительных компонентов чуть позже.

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

Если вы используетеPython 2, введите:

sudo apt-get update
sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx

Если вы используете Django сPython 3, введите:

sudo apt-get update
sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx

Это установитpip, файлы разработки Python, необходимые для создания Gunicorn позже, систему базы данных Postgres и библиотеки, необходимые для взаимодействия с ней, а также веб-сервер Nginx.

Создайте базу данных PostgreSQL и пользователя

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

По умолчанию Postgres использует схему аутентификации, называемую «равноправная аутентификация» для локальных соединений. По сути, это означает, что если имя пользователя операционной системы пользователя совпадает с действительным именем пользователя Postgres, этот пользователь может войти без дальнейшей аутентификации.

Во время установки Postgres был создан пользователь операционной системы с именемpostgres, соответствующий пользователю с правами администратора PostgreSQLpostgres. Нам нужно использовать этого пользователя для выполнения административных задач. Мы можем использовать sudo и передать имя пользователя с опцией -u.

Войдите в интерактивную сессию Postgres, набрав:

sudo -u postgres psql

Вам будет выдан запрос PostgreSQL, где мы сможем настроить наши требования.

Сначала создайте базу данных для вашего проекта:

CREATE DATABASE myproject;

Note

[.note] # Каждый оператор Postgres должен заканчиваться точкой с запятой, поэтому убедитесь, что ваша команда заканчивается точкой, если у вас возникли проблемы.
#

Далее создайте базу данных пользователя для нашего проекта. Убедитесь, что вы выбрали безопасный пароль:

CREATE USER myprojectuser WITH PASSWORD 'password';

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

Мы устанавливаем кодировку по умолчанию в UTF-8, что ожидает Django. Мы также устанавливаем схему изоляции транзакции по умолчанию «read commit», которая блокирует чтение из незафиксированных транзакций. Наконец, мы устанавливаем часовой пояс. По умолчанию в наших проектах Django будет использоватьсяUTC. Это все рекомендацииthe Django project itself:

ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';

Теперь мы можем предоставить нашему новому пользователю доступ для управления нашей новой базой данных:

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

Когда вы закончите, выйдите из приглашения PostgreSQL, набрав:

\q

Создайте виртуальную среду Python для вашего проекта

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

Для этого нам сначала нужен доступ к командеvirtualenv. Мы можем установить это с помощьюpip.

Если вы используетеPython 2, обновитеpip и установите пакет, набрав:

sudo -H pip install --upgrade pip
sudo -H pip install virtualenv

Если вы используетеPython 3, обновитеpip и установите пакет, набрав:

sudo -H pip3 install --upgrade pip
sudo -H pip3 install virtualenv

Установивvirtualenv, мы можем приступить к формированию нашего проекта. Создайте и перейдите в каталог, где мы можем хранить файлы нашего проекта:

mkdir ~/myproject
cd ~/myproject

В каталоге проекта создайте виртуальную среду Python, набрав:

virtualenv myprojectenv

Это создаст каталог с именемmyprojectenv в вашем каталогеmyproject. Внутри он установит локальную версию Python и локальную версиюpip. Мы можем использовать это для установки и настройки изолированной среды Python для нашего проекта.

Перед установкой требований Python для нашего проекта нам необходимо активировать виртуальную среду. Вы можете сделать это, набрав:

source myprojectenv/bin/activate

Ваше приглашение должно измениться, чтобы указать, что вы сейчас работаете в виртуальной среде Python. Это будет выглядеть примерно так:(myprojectenv)user@host:~/myproject$.

Активировав виртуальную среду, установите Django, Gunicorn и адаптер PostgreSQLpsycopg2 с локальным экземпляромpip:

Note

[.note] # Независимо от того, какую версию Python вы используете, когда виртуальная среда активирована, вы должны использовать командуpip (неpip3).
#

pip install django gunicorn psycopg2

Теперь у вас должно быть все программное обеспечение, необходимое для запуска проекта Django.

Создать и настроить новый проект Django

С нашими установленными компонентами Python мы можем создавать фактические файлы проекта Django.

Создать проект Django

Поскольку у нас уже есть каталог проекта, мы скажем Django установить файлы здесь. Он создаст каталог второго уровня с реальным кодом, который является нормальным, и поместит сценарий управления в этот каталог. Ключом к этому является то, что мы определяем каталог явно, а не позволяем Django принимать решения относительно нашего текущего каталога:

django-admin.py startproject myproject ~/myproject

На этом этапе каталог вашего проекта (в нашем случае~/myproject) должен иметь следующее содержимое:

  • ~/myproject/manage.py: сценарий управления проектом Django.

  • ~/myproject/myproject/: пакет проекта Django. Он должен содержать файлы__init__.py,settings.py,urls.py иwsgi.py.

  • ~/myproject/myprojectenv/: каталог виртуальной среды, который мы создали ранее.

Настройте параметры проекта

Первое, что мы должны сделать с нашими недавно созданными файлами проекта, это настроить параметры. Откройте файл настроек в вашем текстовом редакторе:

nano ~/myproject/myproject/settings.py

Начните с поиска директивыALLOWED_HOSTS. Это определяет список адресов сервера или доменных имен, которые могут использоваться для подключения к экземпляру Django. Любые входящие запросы с заголовкомHost, которого нет в этом списке, вызовут исключение. Django требует, чтобы вы установили это, чтобы предотвратить определенный класс уязвимости безопасности.

В квадратных скобках укажите IP-адреса или доменные имена, связанные с вашим сервером Django. Каждый элемент должен быть указан в цитатах с записями, разделенными запятой. Если вы хотите запросить весь домен и любые дочерние домены, добавьте точку к началу записи. В приведенном ниже фрагменте есть несколько закомментированных примеров, используемых для демонстрации:

~/myproject/myproject/settings.py

. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . .]

Затем найдите раздел, который настраивает доступ к базе данных. Он начнется сDATABASES. Конфигурация в файле предназначена для базы данных SQLite. Мы уже создали базу данных PostgreSQL для нашего проекта, поэтому нам нужно изменить настройки.

Измените настройки с помощью вашей базы данных PostgreSQL. Мы говорим Django использовать адаптерpsycopg2, который мы установили сpip. Нам нужно дать имя базы данных, имя пользователя базы данных, пароль пользователя базы данных, а затем указать, что база данных находится на локальном компьютере. Вы можете оставить параметрPORT как пустую строку:

~/myproject/myproject/settings.py

. . .

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

. . .

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

~/myproject/myproject/settings.py

. . .

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

Сохраните и закройте файл, когда вы закончите.

Завершите начальную настройку проекта

Теперь мы можем перенести исходную схему базы данных в нашу базу данных PostgreSQL, используя скрипт управления:

~/myproject/manage.py makemigrations
~/myproject/manage.py migrate

Создайте административного пользователя для проекта, набрав:

~/myproject/manage.py createsuperuser

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

Мы можем собрать весь статический контент в каталог, который мы настроили, набрав:

~/myproject/manage.py collectstatic

Вам нужно будет подтвердить операцию. Затем статические файлы будут помещены в каталог с именемstatic в каталоге вашего проекта.

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

Создайте исключение для порта 8000, набрав:

sudo ufw allow 8000

Наконец, вы можете протестировать наш проект, запустив сервер разработки Django с помощью этой команды:

~/myproject/manage.py runserver 0.0.0.0:8000

В веб-браузере откройте доменное имя или IP-адрес вашего сервера, а затем введите:8000:

http://server_domain_or_IP:8000

Вы должны увидеть страницу индекса по умолчанию Django:

Django index page

Если вы добавите/admin в конец URL-адреса в адресной строке, вам будет предложено ввести имя пользователя и пароль администратора, которые вы создали с помощью командыcreatesuperuser:

Django admin login

После аутентификации вы можете получить доступ к стандартному интерфейсу администратора Django:

Django admin interface

Когда вы закончите исследование, нажмитеCTRL-C в окне терминала, чтобы выключить сервер разработки.

Тестирование способности Gunicorn служить проекту

Последнее, что мы хотим сделать перед тем, как покинуть нашу виртуальную среду, это протестировать Gunicorn, чтобы убедиться, что он может обслуживать приложение. Мы можем сделать это, войдя в каталог нашего проекта и используяgunicorn для загрузки модуля WSGI проекта:

cd ~/myproject
gunicorn --bind 0.0.0.0:8000 myproject.wsgi

Это запустит Gunicorn на том же интерфейсе, на котором работал сервер разработки Django. Вы можете вернуться и снова протестировать приложение.

[.note] #Note: В интерфейсе администратора не будет применен какой-либо стиль, так как Gunicorn не знает о статическом содержимом CSS, отвечающем за это.
#

Мы передали Gunicorn модуль, указав относительный путь к каталогу файлаwsgi.py Django, который является точкой входа в наше приложение, используя синтаксис модуля Python. Внутри этого файла определена функцияapplication, которая используется для связи с приложением. Чтобы узнать больше о спецификации WSGI, щелкнитеhere.

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

Теперь мы закончили настройку нашего приложения Django. Мы можем выйти из нашей виртуальной среды, набрав:

deactivate

Индикатор виртуальной среды в вашем приглашении будет удален.

Создать сервисный файл Gunicorn systemd

Мы проверили, что Gunicorn может взаимодействовать с нашим приложением Django, но мы должны реализовать более надежный способ запуска и остановки сервера приложений. Для этого мы создадим файл службы systemd.

Создайте и откройте служебный файл systemd для Gunicorn с правамиsudo в текстовом редакторе:

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

Начните с раздела[Unit], который используется для указания метаданных и зависимостей. Мы разместим здесь описание нашего сервиса и сообщим системе init, что запускать его нужно только после достижения цели сети:

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
After=network.target

Затем мы откроем раздел[Service]. Мы определим пользователя и группу, под которой мы хотим работать. Мы дадим право нашей учетной записи обычного пользователя на процесс, поскольку он владеет всеми соответствующими файлами. Мы передадим групповое владение группеwww-data, чтобы Nginx мог легко взаимодействовать с Gunicorn.

Затем мы наметим рабочий каталог и укажем команду для запуска сервиса. В этом случае нам нужно будет указать полный путь к исполняемому файлу Gunicorn, который устанавливается в нашей виртуальной среде. Мы свяжем его с сокетом Unix в каталоге проекта, поскольку Nginx установлен на том же компьютере. Это безопаснее и быстрее, чем при использовании сетевого порта. Мы также можем указать любые дополнительные настройки Gunicorn здесь. Например, мы указали 3 рабочих процесса в этом случае:

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application

Наконец, мы добавим раздел[Install]. Это скажет systemd, с чем связать этот сервис, если мы включим его при загрузке. Мы хотим, чтобы эта служба запускалась, когда обычная многопользовательская система запущена и работает:

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application

[Install]
WantedBy=multi-user.target

На этом наш сервисный файл systemd завершен. Сохраните и закройте его сейчас.

Теперь мы можем запустить созданную нами службу Gunicorn и включить ее так, чтобы она запускалась при загрузке:

sudo systemctl start gunicorn
sudo systemctl enable gunicorn

Мы можем подтвердить, что операция прошла успешно, проверив наличие файла сокета.

Проверьте наличие файла сокета Gunicorn

Проверьте состояние процесса, чтобы узнать, удалось ли запустить его:

sudo systemctl status gunicorn

Затем проверьте наличие файлаmyproject.sock в каталоге вашего проекта:

ls /home/sammy/myproject
Outputmanage.py  myproject  myprojectenv  myproject.sock  static

Если командаsystemctl status указала, что произошла ошибка, или если вы не нашли файлmyproject.sock в каталоге, это означает, что Gunicorn не смог правильно запуститься. Проверьте журналы процесса Gunicorn, набрав:

sudo journalctl -u gunicorn

Посмотрите на сообщения в журналах, чтобы узнать, где у Ганикорна возникли проблемы. Есть много причин, по которым вы могли столкнуться с проблемами, но часто, если Gunicorn не смог создать файл сокета, это происходит по одной из следующих причин:

  • Файлы проекта принадлежат пользователюroot, а не пользователюsudo

  • ПутьWorkingDirectory в файле/etc/systemd/system/gunicorn.service не указывает на каталог проекта

  • Параметры конфигурации, данные процессуgunicorn в директивеExecStart, неверны. Проверьте следующие пункты:

    • Путь к двоичному файлуgunicorn указывает на фактическое расположение двоичного файла в виртуальной среде.

    • Директива--bind определяет файл, который необходимо создать в каталоге, к которому Gunicorn может получить доступ.

    • myproject.wsgi:application - это точный путь к вызываемому объекту WSGI. Это означает, что когда вы находитесь вWorkingDirectory, вы сможете достичь вызываемого объекта с именемapplication, заглянув в модульmyproject.wsgi (который переводится в файл с именем./myproject/wsgi.py)

Если вы вносите изменения в файл/etc/systemd/system/gunicorn.service, перезагрузите демон, чтобы перечитать определение службы и перезапустите процесс Gunicorn, набрав:

sudo systemctl daemon-reload
sudo systemctl restart gunicorn

Убедитесь, что вы устраняете любую из перечисленных проблем, прежде чем продолжить.

Настроить Nginx на Proxy Pass для Gunicorn

Теперь, когда Gunicorn настроен, нам нужно настроить Nginx для передачи трафика процессу.

Начните с создания и открытия нового серверного блока в каталоге Nginxsites-available:

sudo nano /etc/nginx/sites-available/myproject

Внутри откройте новый блок сервера. Начнем с указания, что этот блок должен прослушивать обычный порт 80 и что он должен отвечать на доменное имя или IP-адрес нашего сервера:

/etc/nginx/sites-available/myproject

server {
    listen 80;
    server_name server_domain_or_IP;
}

Далее мы скажем Nginx игнорировать любые проблемы с поиском значка. Мы также сообщим ему, где найти статические активы, которые мы собрали в нашем каталоге~/myproject/static. Все эти файлы имеют стандартный префикс URI «/ static», поэтому мы можем создать блок местоположения, соответствующий этим запросам:

/etc/nginx/sites-available/myproject

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/sammy/myproject;
    }
}

Наконец, мы создадим блокlocation / {} для соответствия всем остальным запросам. Внутри этого расположения мы включим стандартный файлproxy_params, включенный в установку Nginx, а затем передадим трафик в сокет, созданный нашим процессом Gunicorn:

/etc/nginx/sites-available/myproject

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/sammy/myproject;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/sammy/myproject/myproject.sock;
    }
}

Сохраните и закройте файл, когда вы закончите. Теперь мы можем включить файл, связав его с каталогомsites-enabled:

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

Проверьте свою конфигурацию Nginx на наличие синтаксических ошибок, набрав:

sudo nginx -t

Если об ошибках не сообщается, перезапустите Nginx, набрав:

sudo systemctl restart nginx

Наконец, нам нужно открыть наш брандмауэр для нормального трафика через порт 80. Поскольку нам больше не нужен доступ к серверу разработки, мы можем также удалить правило, чтобы открыть порт 8000:

sudo ufw delete allow 8000
sudo ufw allow 'Nginx Full'

Теперь вы сможете перейти к домену или IP-адресу вашего сервера, чтобы просмотреть свое приложение.

Note

[.Примечание]##

После настройки Nginx следующим шагом должна стать защита трафика на сервере с использованием SSL / TLS. Это важно, потому что без него вся информация, включая пароли, отправляется по сети в виде простого текста.

Если у вас есть доменное имя, самый простой способ получить SSL-сертификат для защиты вашего трафика - это использовать Let Encrypt. Следуйтеthis guide, чтобы настроить Let's Encrypt с Nginx в Ubuntu 16.04.

Если у вас нет доменного имени, вы все равно можете защитить свой сайт для тестирования и обучения с помощьюself-signed SSL certificate.

Устранение неисправностей Nginx и Gunicorn

Если этот последний шаг не показывает ваше приложение, вам необходимо устранить неполадки при установке.

Nginx показывает страницу по умолчанию вместо приложения Django

Если Nginx отображает страницу по умолчанию, а не проксирует ваше приложение, это обычно означает, что вам нужно настроитьserver_name в файле/etc/nginx/sites-available/myproject, чтобы он указывал на IP-адрес или доменное имя вашего сервера.

Nginx используетserver_name, чтобы определить, какой блок сервера использовать для ответа на запросы. Если вы видите страницу Nginx по умолчанию, это признак того, что Nginx не смог явно сопоставить запрос с блоком sever, поэтому он возвращается к блоку по умолчанию, определенному в/etc/nginx/sites-available/default.

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

Nginx отображает ошибку 502 Bad Gateway вместо приложения Django

Ошибка 502 указывает, что Nginx не может успешно прокси-запрос. Широкий спектр проблем конфигурации выражается в ошибке 502, поэтому для правильного устранения неполадок требуется больше информации.

Основное место для поиска дополнительной информации - в журналах ошибок Nginx. Как правило, это скажет вам, какие условия вызвали проблемы во время события прокси. Следуйте журналам ошибок Nginx, набрав:

sudo tail -F /var/log/nginx/error.log

Теперь сделайте еще один запрос в вашем браузере, чтобы сгенерировать новую ошибку (попробуйте обновить страницу). Вы должны увидеть новое сообщение об ошибке, записанное в журнал. Если вы посмотрите на сообщение, оно должно помочь вам сузить проблему.

Вы можете увидеть некоторые из следующих сообщений:

connect () в unix: /home/sammy/myproject/myproject.sock не удалось (2: нет такого файла или каталога)

Это означает, что Nginx не смог найти файлmyproject.sock в указанном месте. Вы должны сравнить расположениеproxy_pass, определенное в файле/etc/nginx/sites-available/myproject, с фактическим расположением файлаmyproject.sock, созданного в каталоге вашего проекта.

Если вы не можете найти файлmyproject.sock в каталоге вашего проекта, это обычно означает, что процессgunicorn не смог его создать. Вернитесь кsection on checking for the Gunicorn socket file, чтобы выполнить действия по устранению неполадок Gunicorn.

connect () в unix: /home/sammy/myproject/myproject.sock не удалось (13: отказано в разрешении)

Это указывает на то, что Nginx не смог подключиться к сокету Gunicorn из-за проблем с разрешениями. Обычно это происходит, когда процедура выполняется с использованием пользователя root вместо пользователяsudo. Хотя процесс Gunicorn может создать файл сокета, Nginx не может получить к нему доступ.

Это может произойти, если в любой точке между корневым каталогом (/) и файломmyproject.sock существуют ограниченные права доступа. Мы можем увидеть разрешения и значения владения файла сокета и каждого из его родительских каталогов, передав абсолютный путь к нашему файлу сокета командеnamei:

namei -nom /home/sammy/myproject/myproject.sock
Outputf: /home/sammy/myproject/myproject.sock
 drwxr-xr-x root  root     /
 drwxr-xr-x root  root     home
 drwxr-xr-x sammy sammy    sammy
 drwxrwxr-x sammy sammy    myproject
 srwxrwxrwx sammy www-data myproject.sock

Выходные данные отображают разрешения каждого из компонентов каталога. Изучив разрешения (первый столбец), владельца (второй столбец) и владельца группы (третий столбец), мы можем выяснить, какой тип доступа разрешен к файлу сокета.

В приведенном выше примере файл сокета и каждый из каталогов, ведущих к файлу сокета, имеют общие разрешения на чтение и выполнение (столбец разрешений для каталогов заканчиваетсяr-x вместо---). Процесс Nginx должен иметь возможность успешного доступа к сокету.

Если какой-либо из каталогов, ведущих к сокету, не имеет разрешения на чтение и выполнение для всего мира, Nginx не сможет получить доступ к сокету, не предоставив разрешения на чтение и выполнение для всего мира или убедившись, что владение группой предоставлено группе, частью которой является Nginx. из. Для конфиденциальных мест, таких как каталог/root, оба вышеуказанных параметра опасны. Лучше переместить файлы проекта за пределы каталога, где вы можете безопасно контролировать доступ без ущерба для безопасности.

Django Is Displaying: «Не удалось подключиться к серверу: соединение отказано»

Одно сообщение, которое вы можете увидеть от Django при попытке доступа к частям приложения в веб-браузере:

OperationalError at /admin/login/
could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?

Это указывает на то, что Django не может подключиться к базе данных Postgres. Убедитесь, что экземпляр Postgres запущен, набрав:

sudo systemctl status postgresql

Если это не так, вы можете запустить его и включить автоматический запуск при загрузке (если он еще не настроен для этого), набрав:

sudo systemctl start postgresql
sudo systemctl enable postgresql

Если у вас по-прежнему возникают проблемы, убедитесь, что настройки базы данных, определенные в файле~/myproject/myproject/settings.py, верны.

Дальнейшее устранение неисправностей

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

Следующие журналы могут быть полезны:

  • Проверьте журналы процессов Nginx, набрав:sudo journalctl -u nginx

  • Проверьте журналы доступа Nginx, набрав:sudo less /var/log/nginx/access.log

  • Проверьте журналы ошибок Nginx, набрав:sudo less /var/log/nginx/error.log

  • Проверьте журналы приложения Gunicorn, набрав:sudo journalctl -u gunicorn

При обновлении конфигурации или приложения вам, вероятно, потребуется перезапустить процессы, чтобы приспособиться к вашим изменениям.

Если вы обновите приложение Django, вы можете перезапустить процесс Gunicorn, чтобы получить изменения, набрав:

sudo systemctl restart gunicorn

Если вы измените служебный файлgunicorn systemd, перезагрузите демон и перезапустите процесс, набрав:

sudo systemctl daemon-reload
sudo systemctl restart gunicorn

Если вы измените конфигурацию блока сервера Nginx, протестируйте конфигурацию, а затем Nginx, набрав:

sudo nginx -t && sudo systemctl restart nginx

Эти команды полезны для получения изменений при настройке конфигурации.

Заключение

В этом руководстве мы создали проект Django в собственной виртуальной среде. Мы настроили Gunicorn для перевода клиентских запросов, чтобы Django мог их обработать. После этого мы настроили Nginx в качестве обратного прокси-сервера для обработки клиентских подключений и предоставления правильного проекта в зависимости от запроса клиента.

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

Related