Skip to content

Instantly share code, notes, and snippets.

@Khalmatov
Created March 3, 2021 11:35
Show Gist options
  • Save Khalmatov/1e86f0ee17cac8d9f2be8696b18f7285 to your computer and use it in GitHub Desktop.
Save Khalmatov/1e86f0ee17cac8d9f2be8696b18f7285 to your computer and use it in GitHub Desktop.
Настройка NGINX + Gunicorn + Django
Подготовка:
Установка всех пакетов:
sudo apt update
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl
Создание виртуальной среды:
sudo pip3 install virtualenv
mkdir ~/myprojectdir
cd ~/myprojectdir
virtualenv myprojectenv
Активация виртуальной среды:
source myprojectenv/bin/activate
Установка Django и Gunicorn в виртуальную среду:
pip install django gunicorn
Создание Django-проекта:
django-admin.py startproject myproject ~/myprojectdir
Разрешаем Django работать с нашим сайтом и указываем путь к статическим файлам:
nano ~/myprojectdir/myproject/settings.py
В файл seting.py:
...
ALLOWED_HOSTS = ['IP_вашего_сервера', 'доменное_имя_или_другой_IP', . . ., 'localhost']
...
import os
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
Сохраняем и закрываем файл настроек:
Ctrl+S, Ctrl+X
Создаем миграции:
python manage.py makemigrations
python manage.py migrate
Создаем администратора проекта:
python manage.py createsuperuser
Собираем статические файлы в папку static:
python manage.py collectstatic
Тестирование:
Тестируем работоспособность Django-сервера:
Освобожаем порт 8000:
sudo ufw allow 8000
Запускам сервер Django (сайт после должен быть доступен по адресу http://ваш.домен:8000 ):
python manage.py runserver 0.0.0.0:8000
Останавливаем работу Django:
Ctrl+C
Тестирование способности Gunicorn обслуживать проект:
Переходим в папку, где лежит файл wsgi:
cd ~/myprojectdir
Запускаем сервер:
gunicorn --bind 0.0.0.0:8000 myproject.wsgi
После этого сайт должен работать, но без статичных файлов
Останавливаем работу Gunicorn:
Ctrl+C
Тестирование окончено. Выходим из виртуальной среды:
deactivate
Создание файлов сокета и служебных файлов systemd для Gunicorn:
Создание файла сокета systemd для Gunicorn:
sudo nano /etc/systemd/system/gunicorn.socket
В самом файле прописываем:
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
Сохраняем и закрываем файл настроек:
Ctrl+S, Ctrl+X
Создание служебного файла systemd для Gunicorn:
sudo nano /etc/systemd/system/gunicorn.service
Расшифровка:
username - имя пользователя Linux
myprojectdir - папка, где лежит ваш Django-проект
myprojectenv - папка виртуальной среды
myproject - название вашего Django-проекта
myproject.wsgi - название файла wsgi, который лежит в одноименной с вашим проектом папке
В самом файле прописываем:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=username
Group=www-data
WorkingDirectory=/home/username/myprojectdir
ExecStart=/home/username/myprojectdir/myprojectenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
myproject.wsgi:application
[Install]
WantedBy=multi-user.target
Сохраняем и закрываем файл настроек:
Ctrl+S, Ctrl+X
Запускаем и активируем сокет Gunicorn:
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket
Тестирование Gunicorn:
Проверка состояния процесса, чтобы узнать, удалось ли его запустить:
sudo systemctl status gunicorn.socket
Проверка наличия файла gunicorn.sock в каталоге /run:
file /run/gunicorn.sock
При возникновении ошибок, проверьте журналы сокета Gunicorn:
sudo journalctl -u gunicorn.socket
Тестирование активации сокета:
Проверка механизма активации сокета:
curl --unix-socket /run/gunicorn.sock localhost
Проверка активности службы Gunicorn (должно быть "Active: active (running)"):
sudo systemctl status gunicorn
При наличии ошибок:
Проверьте журналы сокета Gunicorn:
sudo journalctl -u gunicorn
Проверьте файл /etc/systemd/system/gunicorn.service на наличие проблем:
Если вы внесли изменение в этот файл:
Перезагрузите демона:
sudo systemctl daemon-reload
Перезапустите процесс Gunicorn:
sudo systemctl restart gunicorn
Настройка Nginx как прокси для Gunicorn
Создание и настройка нового серверного блока в каталоге Nginx sites-available:
sudo nano /etc/nginx/sites-available/myproject
Расшифровка:
server_domain_or_IP - домен или IP вашего сайта (можно указать несколько через пробел)
location /static/ {...} - после root - путь к вашему проекту (там лежит папка со статикой)
location /media {...} - после alias - папка, где хранятся медиа-файлы
В самом файле прописываем:
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/username/myprojectdir;
}
location /media {
autoindex on;
alias /home/username/myprojectdir/media/;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
Сохраняем и закрываем файл настроек:
Ctrl+S, Ctrl+X
Активировация и привязавка файл конфигурация Nginx к каталогу sites-enabled:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
Тестирование файла конфигурации Nginx на ошибки синтаксиса:
sudo nginx -t
При отстутствии ошибок перезапускаем сервер Nginx:
sudo systemctl restart nginx
Удаляем правило и освобождаем порт 8000:
sudo ufw delete allow 8000
sudo ufw allow 'Nginx Full'
После всего этого ваше веб-приложение Django должен работать по IP-адресу вашего сервера!
Полезные файлы и команды:
Gunicorn:
Файл конфигурации Gunicorn:
sudo nano /etc/systemd/system/gunicorn.socket
Журналы сокета Gunicorn:
sudo journalctl -u gunicorn.socket
Журналы приложения Gunicorn:
sudo journalctl -u gunicorn
Перезапуск Gunicorn (при изменении приложения Django):
sudo systemctl restart gunicorn
Перезапуск демона и процесса Gunicorn (при изменении файла сокета или служебных файлов Gunicorn):
sudo systemctl daemon-reload
sudo systemctl restart gunicorn.socket gunicorn.service
Nginx:
Файл конфигурации Nginx:
sudo nano /etc/nginx/sites-available/church
Журналы процессов Nginx:
sudo journalctl -u nginx
Журналы ошибок Nginx:
sudo tail -F /var/log/nginx/error.log
Журналы доступа Nginx:
sudo less /var/log/nginx/access.log
Тестирование и перезапуск сервера Nginx (при изменении конфигурации Nginx):
sudo nginx -t && sudo systemctl restart nginx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment