在使用 Django 开发服务器时,经常需要通过 SSH 连接到远程服务器进行开发,这与本地环境不同。然而,由于 SSH 会话的特性,经过一段时间后,连接会自动断开。这会导致开发服务器中断,需要重新连接和重新启动服务器,造成很大麻烦。在这里,我想分享一下保持 SSH 会话不中断的方法,以确保 Django 开发服务器可以持续运行。

问题:SSH 会话自动断开

当通过 SSH 连接到远程服务器进行工作时,如果长时间没有任何操作,会话就会自动断开。这种设置在安全方面是有用的,因为它会在没有网络流量时断开连接,但对开发者来说往往造成不便。

解决方案:利用 SSH 设置、tmux 和 systemd

为了解决这个问题,我应用了三种方法。

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 设置为后台服务

三种方法中,我认为最有效的方法是将 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