Django 5 для начинающих

Прогресс по курсу:  9/1004

9.2 Установка виртуального окружения, Gunicorn и списка зависимостей
5 из 16 шагов пройдено
0 из 33 баллов  получено

Настройка Gunicorn

 

Для начала, необходимо создать пользователя www под которым будет работать Gunicorn:

useradd www --gid www-data --shell /bin/false --no-create-home


Теперь перейдём в директорию /var/www/mysite_03/mysite и создадим конфиг для Gunicorn с именем gunicorn_config.py:

cd mysite
vi gunicorn_config.py


Со следующим содержимым:

command = '/var/www/mysite_03/env/bin/gunicorn'
python_path = '/var/www/mysite_03/mysite'
bind = '0.0.0.0:8001'
workers = 5
user = 'www'
raw_env = 'DJANGO_SETTINGS_MODULE=mysite.settings'

Примечание: если имя проекта отличается от mysite, необходимо изменить конфиг следующим образом:

command = '/var/www/your_project_dir/env/bin/gunicorn'
python_path = '/var/www/your_project_dir/your_project_name'
bind = '0.0.0.0:8001'
workers = 5
user = 'www'
raw_env = 'DJANGO_SETTINGS_MODULE=your_project_name.settings'

Не забываем сохранить файл(Нажимаем Esc и вводим :wq, нажимаем Enter. Если по каким-то причинам не нужно сохранять изменения в редактируемом файле вводим :q!. А если редактор использовался только для просмотра содержимого файла то тогда для выхода используем :q)


Теперь перейдём в директорию /var/www/mysite_03 и создадим скрипт для запуска Gunicorn с именем gunicorn.sh:

cd ..
vi gunicorn.sh


Со следующим содержимым:

#!/bin/bash
source /var/www/mysite_03/env/bin/activate
exec gunicorn -c "/var/www/mysite_03/mysite/gunicorn_config.py" mysite.wsgi

Примечание: если имя проекта отличается от mysite, необходимо изменить скрипт следующим образом:

#!/bin/bash
source /var/www/your_project_dir/env/bin/activate
exec gunicorn -c "/var/www/your_project_dir/your_project_name/gunicorn_config.py" your_project_name.wsgi

Сохраняем файл(нажимаем Esc и вводим :wq, нажимаем Enter).


Теперь устанавливаем права на запуск этого файла и проверяем:

chmod 755 gunicorn.sh
ls -la gunicorn.sh


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

Воспользуемся systemd для создания демон-процесса.
Для этого перейдём в директорию /etc/systemd/system и создадим файл с именем gunicorn.service:

cd /etc/systemd/system
vi gunicorn.service


Со следующим содержимым:

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

[Service]
User=www
Group=www-data
WorkingDirectory=/var/www/mysite_03
ExecStart=/var/www/mysite_03/gunicorn.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

Примечание: если имя проекта отличается от mysite, необходимо изменить этот файл следующим образом:

WorkingDirectory=/var/www/your_project_dir
ExecStart=/var/www/your_project_dir/gunicorn.sh

Сохраняем файл(нажимаем Esc и вводим :wq, нажимаем Enter).


Теперь устанавливаем права на запуск этого файла и проверяем:

chmod 755 gunicorn.service
ls -la gunicorn.service


Обновим список юнитов командой:

systemctl daemon-reload


Запускаем службу Gunicorn:

systemctl start gunicorn


И сразу проверяем её состояние:

systemctl status gunicorn

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


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

systemctl enable gunicorn


Теперь откроем наш сайт в браузере: http://<имя вашего домена>:8001:


Сайт заработал, но с ошибкой. Чтобы её устранить необходимо отредактировать файл настроек settings.py, это будет рассмотрено в следующем шаге.


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

ошибка, хотя все пути верны  

@Шамбер_Егор

@Шамбер_Егор

@Шамбер_Егор

@Шамбер_Егор

я нажимаю E и перехожу в редактирование 

@Шамбер_Егор, сохраните файл, такие файлы появляются если файл не был сохранён.

@Шамбер_Егор, в gunicorn_config.py ошибки, в путях должны быть начальные слеши, python_path должен быть таким:

/var/www/mysite_03/mysite/mysite

command = '/var/www/mysite_03/env/bin/gunicorn'
python_path = '/var/www/mysite_03/mysite/mysite'
bind = '0.0.0.0:8001'
workers = 5
user = 'www'
raw_env = 'DJANGO_SETTINGS_MODULE=mysite.settings'

@Дмитрий_Селезнев,  а как сохранить gunicorn.sh ? а то у меня уже два там файла других )

@Шамбер_Егор, проверьте содержимое файла gunicorn.service, оно должно быть таким:

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

[Service]
User=www
Group=www-data
WorkingDirectory=/var/www/mysite_03/mysite
ExecStart=/var/www/mysite_03/mysite/gunicorn.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

Если его отредактируете, то необходимо повторно выполнить команду:

systemctl daemon-reload

@Шамбер_Егор, удалите их, rm .gunicorn.sh.swo .gunicorn.sh.swp

Не забываем сохранить файл(Нажимаем Esc и вводим :wq, нажимаем Enter. Если по каким-то причинам не нужно сохранять изменения в редактируемом файле вводим :q!. А если редактор использовался только для просмотра содержимого файла то тогда для выхода используем :q)

 Нажимаем Esc перед вводом любых команд в vi.

Изменен Дмитрий Селезнев

@Шамбер_Егор,

@Дмитрий_Селезнев, я просто и нажимаю :wq поэтому странно, что они появились 

@Шамбер_Егор, в самой нижней строке должна быть видна команда, которую вводите.

@Дмитрий_Селезнев, ндаа, чот всё против меня, слеши поставил service вот: 

но ошибка та же самая со 127 статусом, может вам ещё что-то скинуть, чтобы вы проверили

@Шамбер_Егор, удалите файлы .gunicorn.sh.sw* если есть и сделайте скрины содержимого gunicorn.sh и gunicorn_config.py, мне не понятно текущее содержимое их.

@Дмитрий_Селезнев

@Шамбер_Егор, в обоих файлах ошибка в первой строке:

В пути /var/www/mysite_03/mysite/ удалите mysite, только в первой строке, в обоих файлах.

Ведь в директории /var/www/mysite_03 установлено виртуальное окружение, в ней директория env?

@Дмитрий_Селезнев, емае это я получается виртуалку не туда поставил, это сильно всё портит? я ведь должен был ставить виртуалку где у меня все приложения и тд или необязательно?

@Дмитрий_Селезнев, ЕС Я ВСЁ ПОЛУЧИЛОСЬ, БОЖЕ Я КОНЕЧНО ПОТРАТИЛ МНОГО ВРЕМЕНИ НО ТЕПЕРЬ Я ЗНАЮ КАК РАБОТАТЬ В ЭТОЙ ШТУКЕ, СПАСИБО ВАМ ОГРОМНОЙ, ВЫ ЛУЧШИЙ 

@Шамбер_Егор, нет, не портит, может конечно не совсем красиво выглядит.

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

cd /var/www/mysite_03

mv mysite mysite_tmp

mv mysite_tmp/{,.[^.]}* .

Но тогда придётся из всех путей в конфигах удалить по одному mysite.

@Дмитрий_Селезнев, хорошо, буду знать

Добрый вечер, возникла данная проблема, недоумеваю как решить

@Маркелов_Александр, скорее всего ошибка в файле gunicorn.sh, в строке:

exec gunicorn -c "/var/www/mysite_03/mysite/gunicorn_config.py" mysite.wsgi

Если меняли имя проекта(mysite) на что-то другое, то нужно исправить пути и заменить mysite.wsgi на имя_проекта.wsgi.

Изменен Дмитрий Селезнев

@Дмитрий_Селезнев, да, я создавал другое наименование проекту, но я вносил все изменения под свой проект, и все равно выдает такую ошибку

@Маркелов_Александр, сделайте скрины содержимого файлов gunicorn.sh и gunicorn_config.py(вывод команд vi gunicorn.sh и vi gunicorn_config.py), и скрин вывода команды ls -la /var/www/mysite_03.

@Дмитрий_Селезнев

@Дмитрий_Селезнев

@Маркелов_Александр, ещё нужны скрины вывода команд ls -la /var/www/mysite_03/blog_v1 и ls -la /var/www/mysite_03/blog_v1/mysite.
Почему размер gunicorn_config.py 1 байт? У меня 188 байт, тут должно быть примерно столько-же.

@Дмитрий_Селезнев

@Дмитрий_Селезнев

@Маркелов_Александр, выполните следующие команды:

cd /var/www/mysite_03

mv gunicorn_config.py gunicorn_config.py_old

mv gunicorn.sh gunicorn.sh_old

mv blog_v1 blog_v1_tmp

mv blog_v1_tmp/{,.[^.]}* .

mv gunicorn_config.py mysite

cd mysite

vi gunicorn_config.py

Вставляете это содержимое:

command = '/var/www/mysite_03/env/bin/gunicorn'
python_path = '/var/www/mysite_03/mysite'
bind = '0.0.0.0:8001'
workers = 5
user = 'www'
raw_env = 'DJANGO_SETTINGS_MODULE=mysite.settings'

И сохраняете файл.

Затем выполняете:

cd ..

vi gunicorn.sh

Вставляете это содержимое:

#!/bin/bash
source /var/www/mysite_03/env/bin/activate
exec gunicorn -c "/var/www/mysite_03/mysite/gunicorn_config.py" mysite.wsgi

И сохраняете файл.

Затем выполняете:

chmod 755 gunicorn.sh

ls -la gunicorn.sh

cd /etc/systemd/system

vi gunicorn.service

Вставляете это содержимое:

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

[Service]
User=www
Group=www-data
WorkingDirectory=/var/www/mysite_03
ExecStart=/var/www/mysite_03/gunicorn.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

Сохраняете файл, а затем выполните эти команды:

systemctl daemon-reload

systemctl start gunicorn

systemctl status gunicorn

Если запустился, то проверяете работу сайта.

Изменен Дмитрий Селезнев

@Дмитрий_Селезнев, все получилось, работает, спасибо большое, можете подсказать в чем была ошибка?

@Маркелов_Александр, лишняя директория blog_v1, нужно было архивировать без неё(на скрине этот момент показан, выделены файлы и директории проекта), или с ней распаковывать в /var/www, чтоб директория проекта стала /var/www/blog_v1.

Можно переименовать директорию проекта в blog_v1, только после переименования придётся удалить директорию виртуального окружения(env) и заново его установить вместе со списком зависимостей. И потом отредактировать во всех файлах пути.

@Дмитрий_Селезнев, Понял, спасибо)

Посмотрел в интернетах несколько вариантов настройки Gunicorn + django и практически везде присутвует файл gunicorn.socket. Подскажете почему в нашем варианте он не нужен?

@Alex, у нас связь Gunicorn и Nginx осуществляется через порт.

@Дмитрий_Селезнев, а можно подробнее? Почему решили через порт, какая разница?

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

@Дмитрий_Селезнев, большое спасибо за подробный ответ! А на продвинутом курсе это будет? Хочется максимально боевой проект сделать/посмотреть.

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

@Дмитрий_Селезнев, спасибо! Скажите, а есть еще какие-то места, моменты где используется исключительно учебные варианты и на проде так не делают? я планировал небольшой REST сервер запустить на проде, после прохождения обоих курсов.

@Alex, нет.

@Дмитрий_Селезнев, не совсем понял,  "Но это накладывает одно ограничение: Gunicorn и Nginx должны быть на одном сервере."
А сейчас мы работаем не на одном сервере? Если есть возможность, можно подробнее?

@Георгий_Тимофеев, это в контексте использования сокетов. То есть при использовании подключения Gunicorn и Nginx через порты, их можно разнести по разным серверам, если подключение через сокеты, то только на одном сервере.

не понимаю в чем проблема, спрашивал у нейросетей и проверил и вроде как все верно, но тем не менее не работает(

root@den104ten:/var/www/mysite_01/Calculator_remonta# systemctl status gunicorn
× gunicorn.service - gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Mon 2023-10-30 20:52:58 UTC; 8s ago
    Process: 2658 ExecStart=/var/www/mysite_01/gunicorn.sh (code=exited, status=3)
   Main PID: 2658 (code=exited, status=3)
        CPU: 111ms

Oct 30 20:52:58 den104ten.com systemd[1]: gunicorn.service: Main process exited, code=exited, status=3/NOTIMPLEMENTED
Oct 30 20:52:58 den104ten.com systemd[1]: gunicorn.service: Failed with result 'exit-code'.
Oct 30 20:52:58 den104ten.com systemd[1]: gunicorn.service: Scheduled restart job, restart counter is at 5.
Oct 30 20:52:58 den104ten.com systemd[1]: Stopped gunicorn daemon.
Oct 30 20:52:58 den104ten.com systemd[1]: gunicorn.service: Start request repeated too quickly.
Oct 30 20:52:58 den104ten.com systemd[1]: gunicorn.service: Failed with result 'exit-code'.
Oct 30 20:52:58 den104ten.com systemd[1]: Failed to start gunicorn daemon.

@Даниил_Игоревич_Ельцов, загрузите файл с данными для доступа на сервер, по ссылке https://mega.nz/filerequest/rANtUqzWHQ4, посмотрю в чём проблема.

@Дмитрий_Селезнев, я немного не понял. Нужно дать вам данные от сервера? (наверное нет). Или нужно скачать файлы с сервера и скинуть вам?

@Даниил_Игоревич_Ельцов, я говорил про данные для доступа на сервер, раз нет, тогда проверяйте пути во всех файлах, скорее всего в этом ошибка.

@Дмитрий_Селезнев, я наконец-то смог решить эту проблему. Может быть кому-то помогу напишу решение и попрошу вас указать один момент в скрипте gunicorn.sh. В уроке на последней строчке скрипта gunicorn.sh следующее содержимое: exec gunicorn -c "/var/www/mysite_03/mysite/gunicorn_config.py" mysite.wsgi

Тут нужно обратить внимание на mysite.wsgi, так как у меня название проекта было совсем другим у меня конечно же ничего не запустилось, нужно было написать следующее именно в моем случае: exec gunicorn -c "/var/www/mysite_01/Calculator_remonta/gunicorn_config.py" Calculator_remonta.wsgi:application

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

(env) root@26418:/var/www/mysite# deactivate
root@26418:/var/www/mysite# useradd www --gid www-data --shell /bin/false --no-c                                                                                        reate-home
root@26418:/var/www/mysite# cd mysite
root@26418:/var/www/mysite/mysite# vi gunicorn_config.py
root@26418:/var/www/mysite/mysite# cd..
-bash: cd..: command not found
root@26418:/var/www/mysite/mysite# vi gunicorn.sh
root@26418:/var/www/mysite/mysite# chmod 755 gunicorn.sh
root@26418:/var/www/mysite/mysite# ls -la gunicorn.sh
-rwxr-xr-x 1 root root 125 Oct 12 20:12 gunicorn.sh
root@26418:/var/www/mysite/mysite# cd /etc/systemd/system
root@26418:/etc/systemd/system# vi gunicorn.service
root@26418:/etc/systemd/system# chmod 755 gunicorn.service
root@26418:/etc/systemd/system# ls -la gunicorn.service
-rwxr-xr-x 1 root root 219 Oct 12 20:14 gunicorn.service
root@26418:/etc/systemd/system# systemctl daemon-reload
root@26418:/etc/systemd/system# systemctl start gunicorn
root@26418:/etc/systemd/system# systemctl status gunicorn
× gunicorn.service - gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor pre>
     Active: failed (Result: exit-code) since Thu 2023-10-12 20:15:14 BST; 10s >
    Process: 3886 ExecStart=/var/www/mysite/gunicorn.sh (code=exited, status=20>
   Main PID: 3886 (code=exited, status=203/EXEC)
        CPU: 3ms

Oct 12 20:15:14 26418.com systemd[1]: gunicorn.service: Scheduled restart job, >
Oct 12 20:15:14 26418.com systemd[1]: Stopped gunicorn daemon.
Oct 12 20:15:14 26418.com systemd[1]: gunicorn.service: Start request repeated >
Oct 12 20:15:14 26418.com systemd[1]: gunicorn.service: Failed with result 'exi>
Oct 12 20:15:14 26418.com systemd[1]: Failed to start gunicorn daemon.
lines 1-12/12 (END)...skipping...
× gunicorn.service - gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Thu 2023-10-12 20:15:14 BST; 10s ago
    Process: 3886 ExecStart=/var/www/mysite/gunicorn.sh (code=exited, status=203/EXEC)
   Main PID: 3886 (code=exited, status=203/EXEC)
        CPU: 3ms

Oct 12 20:15:14 26418.com systemd[1]: gunicorn.service: Scheduled restart job, restart counter is at 5.
Oct 12 20:15:14 26418.com systemd[1]: Stopped gunicorn daemon.
Oct 12 20:15:14 26418.com systemd[1]: gunicorn.service: Start request repeated too quickly.
Oct 12 20:15:14 26418.com systemd[1]: gunicorn.service: Failed with result 'exit-code'.
Oct 12 20:15:14 26418.com systemd[1]: Failed to start gunicorn daemon.
 

@Григорий_Кожанов, Команда не cd.. а cd .. (с пробелом перед точками). Тем самым вы должны были перейти из папки /var/www/mysite/mysite в папку /var/www/mysite

В результате скрипт gunicorn.sh создался не в той папке и его не может найти gunicorn.service.

@Григорий_Кожанов, что-бы исправить это, перейдите в директорию /var/www/mysite/mysite и переместите файл gunicorn.sh:

cd /var/www/mysite/mysite
mv gunicorn.sh ..

 А затем запускайте службу Gunicorn:

systemctl start gunicorn

И далее проверяйте её статус.

@Дмитрий_Селезнев,  Спасибо за помощь :)

Сделал все, как в уроке, однако сайт не найден






Изменен Михаил Зайнутдинов

@Михаил_Зайнутдинов

@Михаил_Зайнутдинов, Все починил :)