可以用訊號控制nginx。主程序的id預設情況下被寫入/usr/local/nginx/logs/nginx.pid檔案。這個名字可以在配置時修改或者在nginx.conf檔案中使用pid指令。
主程序支援以下訊號:
-term, int - 快速關閉
-quit - 友好的關閉
-hup - 修改配置,保持乙個時區的改變(僅freebsd&linux),友好的關閉舊的工作程序,使用新配置建立新的工作程序
-usr1 - 重新開啟日誌檔案
-usr2 - 公升級可執行檔案(nginx主程式)
-winch - 友好的關閉所有的工作程序
儘管你不必自己操作工作程序,但是它們也支援一些訊號::
-term, int 快速關機
-quit 正常關機
-usr1 重新開啟日誌檔案
-winch 除錯異常終止(要求debug_points 可用)
為了讓nginx重讀配置檔案,乙個hup訊號應該被傳送到主程序。主程序首先檢查語法的有效性,然後試圖應用新的配置,即開啟日誌檔案和新的監聽套接字。如果失敗,它會回滾變化的地方,並繼續使用舊的配置。如果成功了,它會開啟新的工作程序,並向舊的程序傳送正常關機的訊息。舊的工作程序關閉監聽的套接字並繼續服務舊的客戶端。當服務完所有的客戶端,舊的工作程序會關閉。
讓我們通過示例來說明。假設nginx是執行在freebsd 4.x 上的,這個命令是:
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep
'(nginx|pid)'
輸出如下:
pid ppid user %cpu vsz wchan command
33126
1 root 0.0
1148 pause nginx: master process /usr/local/nginx/sbin/nginx
33127
33126 nobody 0.0
1380 kqread nginx: worker process (nginx)
33128
33126 nobody 0.0
1364 kqread nginx: worker process (nginx)
33129
33126 nobody 0.0
1364 kqread nginx: worker process (nginx)
當」hup「signal傳送給nginx主程序,輸出如下:
pid ppid user %cpu vsz wchan command
33126
1 root 0.0
1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33129
33126 nobody 0.0
1380 kqread nginx: worker process is shutting down (nginx)
33134
33126 nobody 0.0
1368 kqread nginx: worker process (nginx)
33135
33126 nobody 0.0
1368 kqread nginx: worker process (nginx)
33136
33126 nobody 0.0
1368 kqread nginx: worker process (nginx)
上面可以發現,33129的工作程序,仍然在繼續工作。一段時間後,輸出如下:
pid ppid user %cpu vsz wchan command
33126
1 root 0.0
1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33134
33126 nobody 0.0
1368 kqread nginx: worker process (nginx)
33135
33126 nobody 0.0
1368 kqread nginx: worker process (nginx)
33136
33126 nobody 0.0
1368 kqread nginx: worker process (nginx)
此時,所有的舊的工作程序,都已經全部關閉。
為了輪詢日誌檔案,這些日誌檔案首先應該被重新命名(輪詢的日誌檔案命名有一定的規律)。接著,傳送」usr1「signal給主程序。主程序將重新開啟所有當前開啟的日誌檔案,並且分配給它們乙個沒有特權的使用者作為owner使用者(工程進行的執行使用者,例如上節中的nobody)。重新開啟成功後,主程序關閉所有開啟的檔案,並傳送訊息給工作程序,要求它們去重新開啟日誌檔案。工作程序開啟新檔案,並馬上關閉舊檔案。結果,舊檔案幾乎立馬可用於後處理,例如:壓縮。
為了公升級伺服器,新的可執行檔案應該首先被寫入到舊檔案中。接著,傳送」usr2「signal給主程序。主程序首先重新命名 」儲存程序id的檔案「(/usr/local/nginx/logs/nginx.pid)為乙個新檔案,字尾是」.oldbin「(/usr/local/nginx/logs/nginx.pid.oldbin),接著,啟動乙個新的可執行檔案,反過來,再啟動新的工作程序:
pid ppid user %cpu vsz wchan command
33126
1 root 0.0
1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33134
33126 nobody 0.0
1368 kqread nginx: worker process (nginx)
33135
33126 nobody 0.0
1380 kqread nginx: worker process (nginx)
33136
33126 nobody 0.0
1368 kqread nginx: worker process (nginx)
36264
33126 root 0.0
1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265
36264 nobody 0.0
1364 kqread nginx: worker process (nginx)
36266
36264 nobody 0.0
1364 kqread nginx: worker process (nginx)
36267
36264 nobody 0.0
1364 kqread nginx: worker process (nginx)
之後,所有的工作程序(新的&舊的)繼續接收請求。如果 」winch「 signal傳送給第乙個主程序,它將傳送訊息給它的子工作程序,請求它們友好的關閉,然後子工作程序開始關閉:
一段時間後,只有新的工作程序來處理請求:
注意:舊的主程序並沒有關閉它監聽的sockets,當需要時,它仍然能夠開啟它的子工作程序。如果,由於某些原因,新的可執行檔案工作不正常,可執行下面的乙個:
如果新的主程序退出,然後舊的主程序忽略 」.oldbin「 字尾檔案。
如果公升級成功,之後應該傳送」quit「signal給舊的主程序,最後,只有新的程序會被保留下來:
pid ppid user %cpu vsz wchan command
36264
1 root 0.0
1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265
36264 nobody 0.0
1364 kqread nginx: worker process (nginx)
36266
36264 nobody 0.0
1364 kqread nginx: worker process (nginx)
36267
36264 nobody 0.0
1364 kqread nginx: worker process (nginx)
Core Foundation 官方文件翻譯
core foundation框架中常用的隱含型別 使用這些隱含型別時需要自己初始化,自己去釋放記憶體。所以需要記住,在初始化的同時在相應位置釋放。以防出現記憶體問題。1.cfstringref 其他方法用的時候可以檢視文件 void testcfstringref 2 cfarrayref,還有很...
Docker 官方文件翻譯
docker compose 是利用docker來執行多個容器的工具。利用compose 在乙個檔案中定義多個容器,然後利用乙個單獨的命令,可以執行你所想做的任何事情。compose 能較好的作為開發環境的假設,伺服器腳手架以及ci方面的應用。我們不推薦使用在生產環境中。使用compose 需要一下...
voltdb官方文件翻譯 一)
最近研究voltdb,發現網上的資料很少。但是官網的文件講述的還是挺清楚的。所以就把看後的觀點記錄下來,方便後來人,廢話不多說,進入正題。首先,voltdb是什麼。它是一款記憶體資料庫,號稱實現了acid和事務隔離,快速解決大資料量和大併發量的秒級相應。本人實際使用了一下感覺還是蠻好的。因為volt...