При разработке сервера на Django часто приходится подключаться к удалённому серверу через SSH, в отличие от локальной среды. Однако, из-за особенностей SSH-сессий они часто автоматически разрываются через определённое время, что приводит к необходимости перезапускать сервер после повторного подключения. Здесь я хотел бы поделиться своим опытом по поддержанию SSH-сессии и предотвращению прерывания разработки на сервере Django.
Проблема: Автоматическое завершение SSH-сессии
Когда вы работаете на удалённом сервере через SSH, если в течение длительного времени не происходит никаких действий, сессия автоматически завершается. Это полезно с точки зрения безопасности, так как отключение происходит, если в настройках SSH нет сетевого трафика, но с точки зрения разработчика это может быть довольно неудобно.
Решение: Использование настроек SSH, tmux и systemd
Для решения этой проблемы я применил три метода.
1. Изменение настроек SSH
Я настроил файл ~/.ssh/config
на клиенте SSH так, чтобы он отправлял пакеты keep-alive через определённые промежутки времени. С такой настройкой SSH-соединение будет поддерживаться за счёт периодической отправки пакетов.
Host *
ServerAliveInterval 60
ServerAliveCountMax 5
Здесь ServerAliveInterval
обозначает интервал (в секундах), с которым клиент отправляет пакеты серверу, а ServerAliveCountMax
обозначает число попыток в случае неудачи. Эта настройка помогает поддерживать соединение открытым.
2. Использование tmux или screen
Я использовал терминальные мультиплексоры, такие как tmux
или screen
, чтобы сервер Django продолжал работать, даже если SSH-сессия была разорвана. Запустив сервер Django через tmux
, он будет продолжать работать даже после завершения SSH-сессии. Пример запуска сервера Django через tmux
выглядит следующим образом:
# создание сессии tmux
tmux new -s django_session
# запуск сервера разработки Django
python manage.py runserver
После запуска Django-сервера, даже если SSH-сессия завершится, сервер будет продолжать работать внутри сессии tmux
, и вы сможете повторно подключиться к сессии с помощью tmux attach -t django_session
.
3. Настройка как фоновой службы через systemd
Из всех трёх методов наиболее удовлетворительным оказалось создание службы для сервера Django с помощью systemd. Используя systemd, вы можете запускать разрабатываемые приложения в фоне, и сервер будет стабильно работать независимо от SSH-сессии. Кроме того, это позволяет проводить разработку и тестирование в условиях, почти идентичных производственным. Настройка Django-приложения как службы через systemd осуществляется следующим образом:
Сначала создайте файл /etc/systemd/system/my_django_app.service
и добавьте в него следующее содержание.
[Unit]
Description=My Django Application
After=network.target
[Service]
User=myuser
Group=mygroup
WorkingDirectory=/path/to/my/django/project
ExecStart=/path/to/my/venv/bin/python manage.py runserver 0.0.0.0:8000
Restart=always
[Install]
WantedBy=multi-user.target
После настройки можно запустить службу командой systemctl start my_django_app
и установить автозапуск при перезагрузке сервера командой systemctl enable my_django_app
. После изменения кода достаточно перезапустить службу с помощью systemctl restart my_django_app
, чтобы применить изменения. Главное преимущество заключается в том, что после одной настройки сервер не нужно запускать вручную, если не возникают какие-то необычные ситуации.
Это позволяет не только тестировать в условиях, близких к производственной среде, но и эффективно управлять сервером после настройки. Если вы никогда не пробовали этот метод, определенно стоит попробовать.
Заключение
С помощью описанных методов я смог решить проблему с завершением SSH-сессий и стабильно управлять сервером разработки Django. Особенно использование systemd для выполнения приложения в фоне дало возможность проводить разработку и проверку в условиях, приближённых к реальному производственному окружению, что значительно повысило эффективность работы. Если вы работаете в удалённой разработке, эти советы могут оказаться полезными.
댓글이 없습니다.