寫在前面

本文給出Windows下nginx報錯:CreateFile() "xxx/logs/nginx.pid" failed 的解決方法並分析了出錯原因,其中 xxx 表示nginx的安裝路徑(即nginx.exe所在的路徑)。注意,除非特別說明,否則後文一律使用 xxx 來表示nginx的安裝目錄。想直奔重點的讀者請直接跳至解決小節,想了解原理的讀者可以參考分析驗證小節。

正文

現象

在Windows下,當我們執行 nginx -s stop 或 nginx -s quit 或 nginx -s reload 時,可能會收到如下報錯:

nginx: [error] CreateFile() "D:/software/nginx/logs/nginx.pid" failed (2: The system cannot find the file specified)

分析

當我們使用 start nginx 來啟動nginx時,會在 xxx/logs/ 目錄下生成名為 nginx.pid 的文字檔案,該檔案的內容只有一個數字,即nginx.exe程序對應的PID。無論是stop,quit還是reload,都需要利用nginx.exe的PID對其進行操作。然而,在某些特殊情況下(下文中我們會人為製造一種特殊情況),nginx.pid會丟失,故而上述三個命令會因找不到nginx.pid而報錯。顯然,此時也不可能stop,quit或reload成功,因為nginx連自己對應哪個程序都不知道。

解決

簡單粗暴:1)通過 tasklist | findstr "nginx.exe" 查出nginx.exe對應的PID;2)在 xxx/logs/ 下新建文字檔案 nginx.pid ,通過文字編輯器將上一步的PID寫入(當然,這一步也可以通過命令列、指令碼、動手程式設計等一切能達到目的的方式進行);3)執行 nginx -s stop 或 nginx -s quit 或  nginx -s reload 。

驗證

必讀

  1. 本驗證中,nginx安裝路徑為 D:/software/nginx ,監聽埠為5000。
  2. 呈現方式是命令列截圖。用到的命令會在後邊以文字形式給出,方便讀者複製貼上。
  3. 本文僅重點關注“找不到nginx.pid”的問題,對於驗證過程中衍生的其它問題,本文僅給出答案的連結,且不保證對症下藥(不是說文件內容有誤,而是不保證正好能解決對應的問題)。在此也懇請知道答案的讀者不吝賜教。
  4. 驗證過程中的命令必須在nginx安裝目錄下執行,否則會出錯。如果非要在任意目錄下執行,請參考在下的另一篇部落格,同時,也要記著對相關路徑做相應改動。

驗證過程如下圖所示:

驗證過程

其中,用到的命令整理如下:

1 start nginx
2 tasklist | findstr "nginx.exe"
3 netstat -ano | findstr "5000" # 需要將5000改為nginx實際監聽的埠
4 type ./logs/nginx.pid
5 nginx -s quit
6 cmd /r dir /b .\\logs
7 13632 | Out-File -Encoding ASCII ./logs/nginx.pid # 需要將13632改為實際的PID

上圖中提到的參考文件為[1]、[2]、[3]。這裡對文件的作者表示衷心的敬佩與感謝。

寫在後面

再次感謝本文引用的所有文件的讀者。

在下剛接觸nginx,本文為在下探索所得,錯誤疏漏之處在所難免,歡迎讀者批評指正,您的批評是在下前進的不竭動力。