Nginx完全教程(必讀)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
在這時(shí),兩個(gè) nginx 實(shí)例會(huì)同時(shí)運(yùn)行,一起處理輸入的請(qǐng)求。要逐步停止舊的實(shí)例,你必須發(fā)送 WINCH 信號(hào)給舊的主進(jìn)程,然后,它的工作進(jìn)程就將開(kāi)始從容關(guān)閉:
PID PPID USER %CPU VSZ WCHAN COMMAND33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx33135 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (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)
一段時(shí)間后,舊的工作進(jìn)程處理了所有已連接的請(qǐng)求后退出,就僅由新的工作進(jìn)程來(lái)處理輸入的請(qǐng)求了:
PID PPID USER %CPU VSZ WCHAN COMMAND33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx36264 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)
這時(shí),因?yàn)榕f的服務(wù)器還尚未關(guān)閉它監(jiān)聽(tīng)的套接字,所以,通過(guò)下面的幾步,你仍可以恢復(fù)舊的服務(wù)器:
· 發(fā)送 HUP 信號(hào)給舊的主進(jìn)程 - 它將在不重載配置文件的情況下啟動(dòng)它的工作進(jìn)程
· 發(fā)送 QUIT 信號(hào)給新的主進(jìn)程,要求其從容關(guān)閉其工作進(jìn)程
· 發(fā)送 TERM 信號(hào)給新的主進(jìn)程,迫使其退出
· 如果因?yàn)槟承┰蛐碌墓ぷ鬟M(jìn)程不能退出,向其發(fā)送 KILL 信號(hào)
新的主進(jìn)程退出后,舊的主進(jìn)程會(huì)由移除 .oldbin 前綴,恢復(fù)為它的 .pid 文件,這樣,一切就都恢復(fù)到升級(jí)之前了。
如果嘗試升級(jí)成功,而你也希望保留新的服務(wù)器時(shí),發(fā)送 QUIT 信號(hào)給舊的主進(jìn)程使其退出而只留下新的服務(wù)器運(yùn)行:
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)
Nginx 配置優(yōu)化
hash表
Ngnix使用hash表來(lái)協(xié)助完成請(qǐng)求的快速處理。
考慮到保存鍵及其值的hash表存儲(chǔ)單元的大小不至于超出設(shè)定參數(shù)(hash bucket size), 在啟動(dòng)和每次重新配置時(shí),Nginx為hash表選擇盡可能小的尺寸。
直到hash表超過(guò)參數(shù)(hash max size)的大小才重新進(jìn)行選擇. 對(duì)于大多數(shù)hash表都有指令來(lái)修改這些參數(shù)。例如,保存服務(wù)器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所 控制的。參數(shù)hash bucket size總是等于hash表的大小,并且是一路處理器緩存大小的倍數(shù)。在減少了在內(nèi)存中的存取次數(shù)后,使在處理器中加速查找hash表鍵值成為可能。如果 hash bucket size等于一路處理器緩存的大小,那么在查找鍵的時(shí)候,最壞的情況下在內(nèi)存中查找的次數(shù)為2。第一次是確定存儲(chǔ)單元的地址,第二次是在存儲(chǔ)單元中查找鍵 值。因此,如果Nginx給出需要增大 hash max size 或 hash bucket size的提示,那么首要的是增大前一個(gè)參數(shù)的大小.
事件模型
Nginx支持如下處理連接的方法(I/O復(fù)用方法),這些方法可以通過(guò)use指令指定。
· select - 標(biāo)準(zhǔn)方法。 如果當(dāng)前平臺(tái)沒(méi)有更有效的方法,它是編譯時(shí)默認(rèn)的方法。你可以使用配置參數(shù) --with-select_module 和 --without-select_module 來(lái)啟用或禁用這個(gè)模塊。
· poll - 標(biāo)準(zhǔn)方法。 如果當(dāng)前平臺(tái)沒(méi)有更有效的方法,它是編譯時(shí)默認(rèn)的方法。你可以使用配置參數(shù) --with-poll_module 和 --without-poll_module 來(lái)啟用或禁用這個(gè)模塊。
· kqueue - 高效的方法,使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用雙處理器的MacOS X系統(tǒng)使用kqueue可能會(huì)造成內(nèi)核崩潰。
· epoll - 高效的方法,使用于Linux內(nèi)核2.6版本及以后的系統(tǒng)。在某些發(fā)行版本中,如SuSE 8.2, 有讓2.4版本的內(nèi)核支持epoll的補(bǔ)丁。
· rtsig - 可執(zhí)行的實(shí)時(shí)信號(hào),使用于Linux內(nèi)核版本2.2.19以后的系統(tǒng)。默認(rèn)情況下整個(gè)系統(tǒng)中不能出現(xiàn)大于1024個(gè)POSIX實(shí)時(shí)(排隊(duì))信號(hào)。這種情況對(duì)于高負(fù)載的服務(wù)器來(lái)說(shuō)是低效的;所以有必要通過(guò)調(diào)節(jié)內(nèi)核參數(shù) /proc/sys/kernel/rtsig-max 來(lái)增加隊(duì)列的大小??墒菑腖inux內(nèi)核版本2.6.6-mm2開(kāi)始, 這個(gè)參數(shù)就不再使用了,并且對(duì)于每個(gè)進(jìn)程有一個(gè)獨(dú)立的信號(hào)隊(duì)列,這個(gè)隊(duì)列的大小可以用 RLIMIT_SIGPENDING 參數(shù)調(diào)節(jié)。當(dāng)這個(gè)隊(duì)列過(guò)于擁塞,nginx就放棄它并且開(kāi)始使用 poll 方法來(lái)處理連接直到恢復(fù)正常。
· /dev/poll - 高效的方法,使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+.
· eventport - 高效的方法,使用于 Solaris 10. 為了防止出現(xiàn)內(nèi)核崩潰的問(wèn)題, 有必要安裝 這個(gè) 安全補(bǔ)丁。
評(píng)論