1. 程式人生 > >Nginx重啟時丟失nginx.pid文件

Nginx重啟時丟失nginx.pid文件

做了 重載 快速 名稱 kill 查看 round 但是 進行

nginx被停止(nginx -s stop)或者直接殺掉了進程(kill -9 nginx的進程號)後,調用命令(nginx -s reload 或者 nginx -s reopen)會報錯:無法找到"/opt/nginx/logs/nginx.pid"文件。

這句話中,有好幾個知識點,也包含了一些錯誤,錯誤得把reload或者reopen當做了啟動的命令。來依次總結一下:

1、nginx的常用命令

停止:

直接殺nginx進程
ps aux|grep nginx 查看nginx的主進程號,調用kill -9 nginx的進程號來強制停止nginx(還有
“kill -quit nginx的進程號”來從容停止nginx,“kill -term nginx的進程號”來快速的停止nginx)

調用 nginx -s stop 快速停止nginx
調用 nginx -s quit 完整有序的停止nginx

啟動:

進入nginx安裝目錄/sbin/下執行
nginx或者nginx -c 特定位置的nginx.conf(一般默認是nginx -c ./logs/nginx.conf)

重啟:

nginx -s reload 平滑的重啟,配置重載。

nginx工作中,包括一個master進程,多個worker進程。worker進程負責具體的http等相關工作,master進程主要是進行控制等控制。


nginx -s reload 命令加載修改後的配置文件,命令下達後發生如下事件:

1. Nginx的master進程檢查配置文件的正確性,若是錯誤則返回錯誤信息,nginx繼續采用原
配置文件進行工作(因為worker未受到影響)

2. Nginx啟動新的worker進程,采用新的配置文件

3. Nginx將新的請求分配新的worker進程

4. Nginx等待以前的worker進程的全部請求已經都返回後,關閉相關worker進程

5. 重復上面過程,知道全部舊的worker進程都被關閉掉。

所以,重啟之後,master的進程號不變,worker的進程號會改變。


日誌分割:   

nginx -s reopen 重新打開日誌文件。

為什麽要切割日誌?一般Nginx安裝好後有些人會打開日誌記錄,有些人會關閉日誌記錄,打開日誌記錄的人一般都會把架設在Nginx上的所有網站日誌都存在同一個文件裏(比如我存在access.log日誌文件裏),這樣日積月累所有網站的訪問記錄就會把日誌文件越積越大,當需要查看日誌文件的時候一看就是一大串,不方便查找。現在,如果我把每天的日誌文件分割開來用相應的日期標識出來這樣就大大方便查找了。


我是建議打開日誌記錄,日誌記錄裏面存放著很多有用的東西。比如:瀏覽器名稱,可以方便你對網站的排版做出調整;IP地址,如果網站收到×××,你就可以查到那個IP地址。


Linux下我們可以簡單的把日誌文件mv走,但是你會發現mv走後新的日誌文件沒有重新生成,一般linux下用的文件句柄,文件被打開情況下你mv走文件,但是原來操作這個文件的進程還是有這個文件的inode等信息,


原進程還是讀寫原來的文件,因此簡單的mv是無法生效的。


因此建議過程如下:

1. mv原文件到新文件目錄中,這個時候nginx還寫這個文件(寫入新位置文件中了)

2. 調用nginx -s reopen用來打開日誌文件,這樣nginx會把新日誌信息寫入這個新的文件中

這樣完成了日誌的切割工作, 同時切割過程中沒有日誌的丟失。

測試當前配置文件是否正確: nginx -t
測試指定配置文件是否正確: nginx -t 指定配置文件路徑


註意:修改了配置文件後最好先檢查一下修改過的配置文件是否正確,以免重啟後Nginx出現錯誤影響服務器穩定運行。判斷Nginx配置是否正確命令代碼如下:

nginx -t -c /opt/nginx/conf/nginx.conf

或者

/opt/nginx/sbin/nginx -t


2、/opt/nginx/logs/nginx.pid文件

首先/opt/nginx/是我的nginx安裝路徑的,若在nginx.conf配置了pid文件存放路徑,則該文件存放的就是Nginx主進程號,如果沒指定則放在nginx的logs目錄下。有了pid文件,就不用先查詢Nginx的主進程號,而直接向Nginx發送信號了,命令代碼如下:

kill -信號類型 ‘/opt/nginx/logs/nginx.pid’

kill -USR1 等於 nginx -s reopen 這個信號量本來就是用於重新讀取日誌文件的

kill -USR2 等於 nginx -s reload

reload 和 reopen 的行為相差很大,reopen 僅僅檢查日誌文件,reload 會重載配置,並啟動新 worker,關閉舊 worker

nginx.pid存放的是nginx的master進程的進程號。


3.為什麽會報錯

nginx被停止時,/opt/nginx/logs/nginx.pid被刪除了。 而 reopen和 reload命令需要通過nginx.pid獲取進程號,會去找/opt/nginx/logs/nginx.pid ,如果不存在,就報錯了。


4.總結

reopen是在nginx啟動的情況給做分割日誌用的, reload也是在nginx啟動的情況下做平滑重啟的,他們都依賴於nginx進程存在的情況下。 並不是字面上啟動或打開的意思。


真正的啟動命令是: nginx 或者 nginx -c 指定目錄的配置文件/nginx.conf,查看進程存在即表明啟動成功,之後再調用reload和reopen就不會報錯了。


Nginx重啟時丟失nginx.pid文件