При разработке сервера на 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 для выполнения приложения в фоне дало возможность проводить разработку и проверку в условиях, приближённых к реальному производственному окружению, что значительно повысило эффективность работы. Если вы работаете в удалённой разработке, эти советы могут оказаться полезными.

Иллюстрация SSH, tmux и systemd