2026年6月4日 星期四

使用NSSM將Nginx程式轉為Windows服務。(通用其他程式)

NSSM (Non-Sucking Service Manager) 的主要用途正如你所聽到的:它可以把任何傳統的執行檔(.exe)或腳本(.bat.cmd.vbsPowerShellPython 等)封裝並註冊成 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)運行時會有輸出畫面(stdoutstderr)。變成服務後,這些畫面會消失。NSSM 可以幫你把這些原本會顯示在黑畫面的文字,即時寫入到指定的 .log 文字檔中,方便日後查修。

4. 優雅的關閉機制 (Graceful Shutdown)

當你停止服務時,NSSM 不會粗暴地直接殺掉(Kill)你的程式,而是會循序漸進地發送作業系統關閉訊號(如 WM_CLOSEWM_QUIT),讓你的程式有時間處理未完的資料、關閉資料庫連線後才乾淨地結束。

常見的應用場景

在企業 IT 環境或開發流程中,NSSM 常被用來封裝以下類型的程式:

  • Web 服務/API 伺服器: 例如用 Python (Flask/FastAPI)、Node.js、Go 語言寫好的後端程式,需要 24 小時在 Windows 伺服器上穩定運行。

  • 自動化腳本: 定時執行的批次檔(.bat)或 PowerShell 監控腳本。

  • 開源工具: 許多從 Linux 移植過來、沒有原生 Windows 服務介面的開源工具(例如早期的 Prometheus Exporter、某些資料庫轉發工具)。

如何使用 NSSM?(極簡步驟)

NSSM 最棒的地方在於它同時提供了圖形介面 (GUI)命令列 (CLI),操作非常直覺。

使用圖形介面安裝服務:

  1. 下載並解壓縮 NSSM。

  2. 打開命令提示字元 (CMD) 並切換到 nssm 所在目錄,輸入:

    nssm install 你的服務名稱
    
  3. 此時會跳出一個 GUI 視窗:

    • Path: 選擇你要執行的 .exe 或直譯器(如 python.exe)。

    • Startup directory: 程式運行的工作目錄(通常會自動帶入)。

    • Arguments: 程式需要的參數(例如 runserver 0.0.0.0:8000 或腳本路徑)。

    • I/O 頁籤可以設定 Log 輸出路徑。

  4. 點擊 Install service 就完成了!接下來就可以去 Windows 的 services.msc(服務管理面板)裡面看到它,並設定成自動啟動。

常用命令列指令:

如果你想透過指令快速管理,它也支援:

  • 刪除服務: nssm remove 你的服務名稱

  • 啟動服務: nssm start 你的服務名稱

  • 停止服務: nssm stop 你的服務名稱

  • 編輯現有服務: nssm edit 你的服務名稱(會再次跳出 GUI 視窗讓你修改設定)

總結來說,NSSM 是一個非常輕量、穩定且完全免費的工具,是 Windows 系統管理員與開發者在處理背景程序時的必備神器。

======================================================

如果你在命令提示字元(CMD)中輸入了:


 nssm install nginx 
or
nssm edit nginx



這時候系統會跳出 NSSM 的圖形化設定視窗(NSSM Service Installer),讓你填寫詳細的執行路徑與參數。

因為 Nginx 官方的 Windows 版本本身就只是一個普通的控制台程式(Console Application),沒有內建 Windows 服務的控制代碼,所以用 NSSM 來封裝它是非常標準且常見的做法。

請按照以下步驟在跳出的視窗中進行設定:

1. 欄位設定指引

在跳出的 Application 頁籤中,請填入以下資訊:

  • Path (目的程式路徑): 點擊右側的 ... 按鈕,找到你解壓縮 Nginx 的目錄,選取 nginx.exe

    範例:C:\nginx\nginx.exe

  • Startup 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.log

  • Error (stderr): 設為 C:\nginx\logs\nssm_stderr.log

這樣一來,如果服務啟動失敗,你可以直接來這兩個檔案看 Windows 拋出的最底層錯誤訊息。

3. 完成與啟動服務

  1. 欄位填妥後,點擊視窗下方的 Install service 按鈕。

  2. 看到彈出 Service "nginx" installed successfully! 的成功訊息後,代表服務已經註冊成功。

  3. 啟動 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 即可乾淨刪除。



沒有留言:

使用NSSM將Nginx程式轉為Windows服務。(通用其他程式)

NSSM (Non-Sucking Service Manager) 的主要用途正如你所聽到的: 它可以把任何傳統的執行檔( .exe )或腳本( .bat 、 .cmd 、 .vbs 、 PowerShell 、 Python 等)封裝並註冊成 Windows 服務(Win...