Windows中nginx多次啟動的問題


在Windows上做開發環境中的nginx服務器。為了使nginx在后台運行,使用如下命令來啟停nginx:

cd <nginx安裝目錄>

# 開啟nginx並在后台運行
start nginx.exe

# 關閉nginx
./nginx.exe -s stop

# 重啟nginx:先關閉再開啟
./nginx.exe -s stop; start nginx.exe

但是某次修改配置文件后,重啟nginx,卻發現根本沒有生效。比如,把一個serverroot直接刪了,重啟后居然還能正常響應。

接着發現,執行nginx -s stop時已經提示沒有nginx.pid了(這意味着nginx應該已經關閉了),但網頁仍然能打開,這說明nginx實際上還在運行。

打開任務管理器查看進程,發現居然還有4個正在運行的nginx進程。正常情況下,nginx運行時應該只有2個nginx進程(1個master進程,1個worker進程(默認配置是1個)),而關閉時則沒有nginx進程。

image

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

image

經過實驗發現,每執行一次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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM