Вопрос или проблема
Я хотел бы настроить веб-сайт на базе Python Flask на сервере NixOS.
Поскольку я совсем новичок как в NixOS, так и в настройке сервера, я застрял на gunicorn.
Я следую этому руководству от Digital Ocean:
Я пытался настроить службу systemd для своего проекта в configuration.nix. Вот часть, связанная с gunicorn:
# Gunicorn versike_project
systemd.services.versike_project = {
enable = true;
description = "Экземпляр Gunicorn для обслуживания versike_project";
after = ["network.target"];
serviceConfig = {
User = "picibucor";
workingDirectory = "/home/picibucor/versike_project";
ExecStart = "/home/picibucor/versike_project/versike_projectenv/bin/gunicorn --workers 3 --bind unix:/home/picibucor/versike_project/versike_project.sock -m 007 wsgi:app";
};
environment = {
PATH = lib.mkForce "/home/picibucor/versike_project/versike_projectenv/bin";
};
wantedBy = ["multi-user.target"];
};
sudo systemctl status versike_project
× versike_project.service – Экземпляр Gunicorn для обслуживания versike_project
Загружено: загружено (/etc/systemd/system/versike_project.service; включено; предустановлено: включено)
Активно: не удалось (Результат: код выхода) с Вс 2024-09-29 23:19:04 CEST; 1ч 42мин назад
Длительность: 597мс
Процесс: 22777 ExecStart=/home/picibucor/versike_project/versike_projectenv/bin/gunicorn –workers 3 –bind unix:/home/picibucor/versike_project/versike_p>
Основной PID: 22777 (код=выход, статус=3)
IP: 0B вход, 0B выход
ЦП: 373мс
29 сент. 23:19:03 nixos gunicorn[22871]: Файл “”, строка 1360, в _find_and_load
29 сент. 23:19:03 nixos gunicorn[22871]: Файл “”, строка 1324, в _find_and_load_unlocked
29 сент. 23:19:03 nixos gunicorn[22871]: ModuleNotFoundError: Нет модуля с именем ‘wsgi’
29 сент. 23:19:03 nixos gunicorn[22871]: [2024-09-29 23:19:03 +0200] [22871] [INFO] Рабочий выходит (pid: 22871)
29 сент. 23:19:03 nixos gunicorn[22777]: [2024-09-29 23:19:03 +0200] [22777] [ERROR] Рабочий (pid:22867) вышел с кодом 3
29 сент. 23:19:03 nixos gunicorn[22777]: [2024-09-29 23:19:03 +0200] [22777] [ERROR] Рабочий (pid:22871) получил SIGTERM!
29 сент. 23:19:03 nixos gunicorn[22777]: [2024-09-29 23:19:03 +0200] [22777] [ERROR] Завершение работы: Мастер
29 сент. 23:19:03 nixos gunicorn[22777]: [2024-09-29 23:19:03 +0200] [22777] [ERROR] Причина: Рабочий не смог запуститься.
29 сент. 23:19:04 nixos systemd[1]: versike_project.service: Основной процесс вышел, код=выход, статус=3/NOTIMPLEMENTED
29 сент. 23:19:04 nixos systemd[1]: versike_project.service: Не удалось с результатом ‘код выхода’.
Можете помочь мне разобраться с сообщением об ошибке выше? Спасибо за заранее.
Ответ или решение
Для решения проблемы с запуском Gunicorn как службы systemd для вашего проекта на Flask, давайте разберем ошибку и предложим шаги для исправления.
Ошибка
Вы получили ошибку:
ModuleNotFoundError: No module named 'wsgi'
Это означает, что Gunicorn не может найти модуль wsgi
, который вы указали в строке:
ExecStart = "/home/picibucor/versike_project/versike_projectenv/bin/gunicorn --workers 3 --bind unix:/home/picibucor/versike_project/versike_project.sock -m 007 wsgi:app";
1. Проверьте структуру проекта
Убедитесь, что у вас есть файл wsgi.py
в корневом каталоге вашего проекта (/home/picibucor/versike_project/
). Этот файл должен содержать объект app
, который является экземпляром вашего Flask-приложения.
Пример содержимого wsgi.py
:
from your_flask_app import create_app # Импортируйте функцию, создающую ваше приложение
app = create_app() # Создайте объект приложения
Замените your_flask_app
на фактическое имя вашего модуля Flask, если необходимо.
2. Измените команду exec
Если ваш файл wsgi.py
находится в подкаталоге, убедитесь, что вы указали полный путь к нему. Например, если он находится в каталоге app
, команда должна выглядеть так:
ExecStart = "/home/picibucor/versike_project/versike_projectenv/bin/gunicorn --workers 3 --bind unix:/home/picibucor/versike_project/versike_project.sock -m 007 app.wsgi:app";
3. Проверьте виртуальное окружение
Убедитесь, что ваше виртуальное окружение настроено правильно, и все зависимости (включая Flask) установлены внутри него. Вы можете активировать виртуальное окружение и установить необходимые зависимости:
cd /home/picibucor/versike_project
source versike_projectenv/bin/activate
pip install -r requirements.txt # Убедитесь, что у вас есть requirements.txt с нужными зависимостями
4. Перезагрузите службу
После внесения изменений в конфигурацию и проверок, не забудьте перезагрузить службу systemd:
sudo systemctl daemon-reload
sudo systemctl start versike_project
5. Проверка статуса
Проверьте статус службы на наличие ошибок:
sudo systemctl status versike_project
6. Логи
Если служба по-прежнему не запускается, проверьте логи для более подробной информации:
journalctl -u versike_project
Это поможет вам определить, если есть другие ошибки или проблемы, которые требуют внимания.
Заключение
Пройдя через эти шаги, вы должны устранить ошибку и успешно запустить Gunicorn как службу systemd для вашего Flask-приложения на NixOS. Если возникнут другие проблемы, не стесняйтесь задавать дополнительные вопросы!