在 Linux 上執行 API 服務
我正在連接到 AWS EC2 實例並啟動我的 API。我希望 API 繼續執行並接受請求。
那麼,tmux 是一個很好的方法嗎?或者,還有更好的方法?我的印像是 tmux 和 screen 更適合非常長的任務。不確定它們是否適合無限期地執行 API。
tmux
並且screen
用於保持一個或多個 shell 會話處於活動狀態,即使您ssh
與目標系統的連接因任何原因中斷,和/或通過單個連接多路復用多個 shell 會話(認為它類似於能夠打開多個終端視窗,但沒有 GUI 界面)。當然,您可以使用它
tmux
來執行您的 API 服務,但如果您的 AWS EC2 實例正在使用systemd
(正如許多現代 Linux 發行版所做的那樣),那麼“正確”的做法可能是編寫一個*.service
文件來描述啟動所需的命令 &停止您的服務及其要求(即在您的服務成功啟動之前需要執行哪些其他服務)。然後您可以將服務文件放在
/etc/systemd/system/
目錄中,執行systemctl daemon-reload
,然後您將能夠使用systemctl start your-API.service
and來操作您的服務systemctl stop your-API.service
。就像一個標準的系統服務——因為就其systemd
而言,它將是一個系統服務。這樣做可以讓您輕鬆地為 API 指定資源限制,例如限制 API 被濫用時可能造成的損害。如果你想讓你的 API 服務自動啟動?
systemctl enable your-API.service
你就完成了。您還可以在
.service
文件中指定您希望 API 服務在其自行崩潰或被終止時自動重新啟動。如果您讓您的 API 服務定期呼叫sd_notify(3)
,"WATCHDOG=1"
您甚至可以systemd
在服務似乎掛起時自動重啟您的服務。還有一些安全優勢:systemd 會為它管理的每一個服務創建一個“控制組”,這個控制組被該服務創建的任何子程序繼承。因此,即使您的服務“瘋狂”並創建了 10000 個子程序(可能是因為網際網路上有人試圖濫用它),一個簡單的
systemd stop your-API.service
(或者systemd kill your-API.service
如果您希望它立即停止並且不關心執行受控關閉您的服務)將足以清理所有這些程序:您不必考慮pkill
手動pgrep
查找正確程序並殺死它們的表達式。如果您願意,systemd 也可以為
chroot
您提供服務(將其限制為僅查看特定目錄及其子目錄)。或者,如果您在專用於它的使用者帳戶上執行該服務(盡可能始終是一個好習慣),您可以阻止其程序(以及它們創建的任何子程序)能夠訪問完整的系統管理員權限,即使他們可能可以root
通過一些漏洞利用,只需NoNewPrivileges=true
在*.service
您的服務文件中設置即可。有關更多資訊和範例,請在 Unix&Linux.SE 上查看此問題,或研究系統上的現有
*.service
文件並參考man systemd.service
並man systemd.exec
了解各種關鍵字的含義。