天天看點

Nginx重新開機時丢失nginx.pid檔案

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程序存在的情況下。 并不是字面上啟動或打開的意思。

繼續閱讀