Подготовка: Установка всех пакетов: 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