NSSM (Non-Sucking Service Manager) 的主要用途正如你所聽到的:它可以把任何傳統的執行檔(.exe)或腳本(.bat、.cmd、.vbs、PowerShell、Python 等)封裝並註冊成 Windows 服務(Windows Service)。
在預設情況下,Windows 無法直接將一般的程式當作服務來執行,因為標準的 Windows 服務必須遵循特定的 Service Control Manager (SCM) 通訊協定。如果直接用系統指令硬把普通 .exe 註冊成服務,啟動時通常會跳出「服務未回應控制要求」的錯誤。
NSSM 就是為了解決這個痛點而生的「代理人(Proxy)」。
為什麼要使用 NSSM?(核心功能)
1. 讓普通程式具備「服務」的特性
開機自動背後執行: 即使沒有使用者登入 Windows 系統,程式也會在背景自動啟動。
權限控管: 可以指定特定的系統帳戶(如
LocalSystem)或特定的網域/本地使用者帳戶來執行該程式。
2. 強大的崩潰自動重啟機制 (Auto-Restart)
這是 NSSM 最受工程師青睞的功能。如果你的程式因為 Bug、記憶體溢位或其他原因不正常關閉(Crash),NSSM 會自動監測到並立刻重啟該程式。它還內建了「重啟延遲」設定,防止程式陷入無限快速重啟的死迴圈。
3. 完美的 I/O 重新導向 (日誌記錄)
一般的控制台程式(Console Application)運行時會有輸出畫面(stdout 和 stderr)。變成服務後,這些畫面會消失。NSSM 可以幫你把這些原本會顯示在黑畫面的文字,即時寫入到指定的 .log 文字檔中,方便日後查修。
4. 優雅的關閉機制 (Graceful Shutdown)
當你停止服務時,NSSM 不會粗暴地直接殺掉(Kill)你的程式,而是會循序漸進地發送作業系統關閉訊號(如 WM_CLOSE、WM_QUIT),讓你的程式有時間處理未完的資料、關閉資料庫連線後才乾淨地結束。
常見的應用場景
在企業 IT 環境或開發流程中,NSSM 常被用來封裝以下類型的程式:
Web 服務/API 伺服器: 例如用 Python (Flask/FastAPI)、Node.js、Go 語言寫好的後端程式,需要 24 小時在 Windows 伺服器上穩定運行。
自動化腳本: 定時執行的批次檔(
.bat)或 PowerShell 監控腳本。開源工具: 許多從 Linux 移植過來、沒有原生 Windows 服務介面的開源工具(例如早期的 Prometheus Exporter、某些資料庫轉發工具)。
如何使用 NSSM?(極簡步驟)
NSSM 最棒的地方在於它同時提供了圖形介面 (GUI) 和命令列 (CLI),操作非常直覺。
使用圖形介面安裝服務:
下載並解壓縮 NSSM。
打開命令提示字元 (CMD) 並切換到 nssm 所在目錄,輸入:
nssm install 你的服務名稱此時會跳出一個 GUI 視窗:
Path: 選擇你要執行的
.exe或直譯器(如python.exe)。Startup directory: 程式運行的工作目錄(通常會自動帶入)。
Arguments: 程式需要的參數(例如
runserver 0.0.0.0:8000或腳本路徑)。在 I/O 頁籤可以設定 Log 輸出路徑。
點擊 Install service 就完成了!接下來就可以去 Windows 的
services.msc(服務管理面板)裡面看到它,並設定成自動啟動。
常用命令列指令:
如果你想透過指令快速管理,它也支援:
刪除服務:
nssm remove 你的服務名稱啟動服務:
nssm start 你的服務名稱停止服務:
nssm stop 你的服務名稱編輯現有服務:
nssm edit 你的服務名稱(會再次跳出 GUI 視窗讓你修改設定)
總結來說,NSSM 是一個非常輕量、穩定且完全免費的工具,是 Windows 系統管理員與開發者在處理背景程序時的必備神器。
======================================================
如果你在命令提示字元(CMD)中輸入了:
這時候系統會跳出 NSSM 的圖形化設定視窗(NSSM Service Installer),讓你填寫詳細的執行路徑與參數。
因為 Nginx 官方的 Windows 版本本身就只是一個普通的控制台程式(Console Application),沒有內建 Windows 服務的控制代碼,所以用 NSSM 來封裝它是非常標準且常見的做法。
請按照以下步驟在跳出的視窗中進行設定:
1. 欄位設定指引
在跳出的 Application 頁籤中,請填入以下資訊:
Path (目的程式路徑): 點擊右側的
...按鈕,找到你解壓縮 Nginx 的目錄,選取nginx.exe。範例:
C:\nginx\nginx.exeStartup directory (啟動工作目錄): 當你選好 Path 之後,這個欄位通常會自動帶入。請確保它是
nginx.exe所在的資料夾。範例:
C:\nginx⚠️ 注意: 這個欄位非常重要,因為 Nginx 啟動時需要去相對路徑讀取conf/nginx.conf檔案,如果工作目錄弄錯,服務會啟動失敗。Arguments (啟動參數): 這裡留空即可(通常不需要填寫,預設就會直接啟動)。
2. 建議進階設定:日誌重新導向 (I/O)
雖然 Nginx 本身就會寫入 logs/error.log,但如果 Nginx 因為主設定檔(nginx.conf)寫錯而導致「根本連開都開不起來」時,Nginx 自己的 Log 是不會有紀錄的。
建議切換到 I/O 頁籤:
Output (stdout): 設為
C:\nginx\logs\nssm_stdout.logError (stderr): 設為
C:\nginx\logs\nssm_stderr.log
這樣一來,如果服務啟動失敗,你可以直接來這兩個檔案看 Windows 拋出的最底層錯誤訊息。
3. 完成與啟動服務
欄位填妥後,點擊視窗下方的 Install service 按鈕。
看到彈出
Service "nginx" installed successfully!的成功訊息後,代表服務已經註冊成功。啟動 Nginx: 此時服務雖然註冊了,但預設還沒開始執行。請在 CMD 輸入以下指令來啟動它:
nssm start nginx(或者你可以按
Win + R輸入services.msc打開 Windows 服務管理員,找到nginx點選「啟動」,並確認啟動類型為「自動」)。
💡 日後如何維護?
變成 Windows 服務後,當你修改了 nginx.conf 設定檔,請不要直接去點 nginx.exe,也不要用 nginx -s reload(因為那會脫離 NSSM 的控制),請統一使用 NSSM 的指令:
重新啟動服務(應用新設定):
nssm restart nginx停止服務:
nssm stop nginx修改 NSSM 設定: 如果路徑填錯了,輸入
nssm edit nginx可以重新打開圖形視窗修改。移除服務: 如果以後不想用了,輸入
nssm remove nginx即可乾淨刪除。
沒有留言:
張貼留言