Djangoでサーバーを開発していると、ローカル環境とは異なり、リモートサーバーにSSHで接続して開発することがよくあります。しかし、SSHセッションの特性上、一定の時間が経過すると自動的に接続が切れることが頻繁に発生します。この場合、開発サーバーが停止し、再接続してサーバーを再起動しなければならない手間が発生します。ここでは、SSHセッションを維持しながらDjango開発サーバーが停止しないように解決した経験を共有したいと思います。

問題点: SSHセッションの自動終了

リモートサーバーにSSHで接続した状態で作業を進めていると、長時間作業が行われないと自動でセッションが終了します。これはSSH設定で一定時間ネットワークトラフィックがない場合に接続を切る方式で、セキュリティ上有用ですが、開発者にとっては不便です。

解決方法: SSH設定、tmux、systemd活用

この問題を解決するために、3つの方法を適用しました。

1. SSH設定の修正

SSHクライアントで ~/.ssh/config ファイルを設定し、一定時間ごとにkeep-aliveパケットを送信するようにしました。このように設定すると、SSH接続は一定時間ごとにパケットを送信し、セッションを維持できます。

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 5

ここで ServerAliveInterval はクライアントがサーバーにパケットを送る間隔(秒単位)を、 ServerAliveCountMax は失敗試行回数を意味します。この設定によって、セッション接続が切れないように維持できます。

2. tmuxまたはscreenの活用

SSHセッションが切れてもDjango開発サーバーが停止しないように、 tmuxscreen のようなターミナルマルチプレクサプログラムを使用しました。 tmux を使ってDjangoサーバーを起動すれば、SSHセッションが終了してもサーバーは実行され続けます。例えば、 tmux を使ってDjangoサーバーを実行する手順は次のとおりです。

# tmuxセッションの作成
tmux new -s django_session

# Django開発サーバーの実行
python manage.py runserver

このようにDjangoサーバーを起動した後、SSHセッションが終了しても tmux セッション内でサーバーが維持されるため、再接続時に tmux attach -t django_session でセッションに再接続できます。

3. systemdを通じてバックグラウンドサービスに設定

3つの方法の中で最も満足度が高かったのは、Djangoサーバーをsystemdで管理するサービスとして作成することです。systemdを使用すると、開発中のアプリケーションを常にバックグラウンドで実行でき、SSHセッションに関係なくサーバーが安定して維持されます。また、デプロイ環境とほぼ同じ状態で開発およびテストを行えるという点で大きな利点があります。systemdを利用してDjangoアプリケーションをサービスに設定する方法は次のとおりです。

まず、 /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, and systemd illustration