在Windows上做開發環境中的nginx服務器。為了使nginx在后台運行,使用如下命令來啟停nginx:
cd <nginx安裝目錄>
# 開啟nginx並在后台運行
start nginx.exe
# 關閉nginx
./nginx.exe -s stop
# 重啟nginx:先關閉再開啟
./nginx.exe -s stop; start nginx.exe
但是某次修改配置文件后,重啟nginx,卻發現根本沒有生效。比如,把一個server的root直接刪了,重啟后居然還能正常響應。
接着發現,執行nginx -s stop時已經提示沒有nginx.pid了(這意味着nginx應該已經關閉了),但網頁仍然能打開,這說明nginx實際上還在運行。
打開任務管理器查看進程,發現居然還有4個正在運行的nginx進程。正常情況下,nginx運行時應該只有2個nginx進程(1個master進程,1個worker進程(默認配置是1個)),而關閉時則沒有nginx進程。

所以原因很明顯,是因為加載了舊配置的那批nginx進程一直都在運行,請求和響應一直都是被這批進程在處理,而加載了新配置的nginx進程雖然也運行起來了,但並沒有得到處理請求的機會。

經過實驗發現,每執行一次start nginx,都會創建新的nginx進程,同時創建新的nginx.pid文件,但只有最先啟動的nginx進程才會處理到請求。
而如果多次使用./nginx.exe -s stop; start nginx.exe命令來重啟,則總是會在某一次報出nginx.pid的錯誤,然后就看到nginx進程就變多了。猜想這是因為nginx -s stop命令並不是等到nginx關閉完成之后才執行結束,而僅僅是發送了一個系統信號,那么start nginx就會緊接着立即執行,創建新的nginx進程(會占用nginx.pid文件),而此時舊進程可能還沒來得及關閉,然后就可能因為nginx.pid文件或其他某些因素導致舊進程沒有關閉成功,於是就繼續運行下去了。
所以,鑒於可能會出現此種問題,應該調整對nginx的啟停管理的操作方式:
cd <nginx安裝目錄>
# 開啟nginx並在后台運行
start nginx.exe
# 關閉nginx
nginx.exe -s stop
# 重載配置文件(不需要重啟進程)
nginx.exe -s reload
# 重啟nginx(僅在必須重啟時才重啟,再次啟動前先確認已經關閉)
nginx.exe -s stop
start nginx.exe
