nginx被停止(nginx -s stop)或者直接殺掉了進程(kill -9 nginx的進程號)后,調用命令(nginx -s reload 或者 nginx -s reopen)會報錯:無法找到 "var/run/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 指定配置文件路徑
2.var/run/nginx.pid文件
首先 var/run這個目錄是干嘛用的?
此文件夾包含描述系統啟動以來系統信息的數據。此文件夾下的文件必須在啟動過程初期清除(刪除或歸零)。程序可以在/var/run
下有自己的子文件夾。原先放在/etc
下的進程標識(PID)文件必須放
在/var/run
里面。PID文件的命名慣例是<program-name>.pid
。所以,nginx的PID文件名為/var/run/nginx.pid
。
nginx.pid存放的是nginx的master進程的進程號。
3.為什么會報錯
nginx被停止時,var/run/nginx.pid被刪除了。 而 reopen和 reload命令需要通過nginx.pid獲取進程號,會去找var/run.nginx.pid ,如果不存在,就報錯了。
4.總結
reopen是在nginx啟動的情況給做分割日志用的, reload也是在nginx啟動的情況下做平滑重啟的,他們都依賴於nginx進程存在的情況下。 並不是字面上啟動或打開的意思。
真正的啟動命令是: nginx 或者 nginx -c 指定目錄的配置文件 nginx.conf。 查看進程存在即表明啟動成功,之后再調用reload和reopen就不會報錯了。
nginx: [error] open() “/usr/local/nginx/logs/nginx.pid” failed (2: No such file or directory)
[root@VM_16_6_centos sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf