Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Felix-Fenix/ce0d7b36cdf8a3a9df9eb9d4c16f1a2e to your computer and use it in GitHub Desktop.
Save Felix-Fenix/ce0d7b36cdf8a3a9df9eb9d4c16f1a2e to your computer and use it in GitHub Desktop.

Revisions

  1. @Khalmatov Khalmatov created this gist Mar 3, 2021.
    209 changes: 209 additions & 0 deletions config-nginx-gunicorn+django
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,209 @@
    Подготовка:

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