在使用 Django 開發伺服器時,與本地環境不同,通常需要通過 SSH 連接遠程伺服器進行開發。然而,由於 SSH 會話的特性,經常會出現在一段時間後自動斷開連接的情況。這樣一來,就會出現需要重新連接並重新啟動伺服器的麻煩。本文將分享如何保持 SSH 會話不斷開,同時確保 Django 開發伺服器不會中斷的經驗。
問題點:SSH 會話自動結束
在遠程伺服器上通過 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 開發伺服器停止運行,我使用了 tmux
或 screen
等終端多工程序。使用 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 在後台以服務的方式運行,不僅使開發和測試的狀態更接近實際部署環境,工作效率大大提高。如果你在遠程開發環境中工作,這將是個非常有用的技巧。
Add a New Comment