- 論壇徽章:
- 19
|
本帖最后由 shenlanyouyu 于 2016-05-10 21:36 編輯
1. 如何在實戰(zhàn)中熟練使用Nginx?
Nginx是一個安全、快速并且靈活的開源Web服務(wù)器,占用系統(tǒng)資源少,并發(fā)能力強,穩(wěn)定較高,F(xiàn)在公司的業(yè)務(wù)是構(gòu)建在LNMP架構(gòu)上的,后臺開發(fā)人員為了加快環(huán)境搭建,使用了LNMP一鍵安裝包。因為Nginx編譯安裝需要輸入大量的命令,如果是配置生產(chǎn)環(huán)境需要耗費大量的時間。
在實戰(zhàn)中熟練使用Nginx,需要熟悉Nginx的配置文件,熟練掌握配置的通用語法。多練習(xí)搭建負(fù)載均衡、反向代理,熟能生巧。其次,遇到問題可以通過網(wǎng)絡(luò)來獲取幫助。
同時可以加入郵件討論組:http://mailman.nginx.org/mailman/listinfo。
學(xué)習(xí)官方的使用手冊: http://mailman.nginx.org/mailman/listinfo
配合一些工具,例如wireshark抓取網(wǎng)絡(luò)packet來分析;使用gdb attach到Nginx進(jìn)程來調(diào)試分析;使用日志信息來跟蹤Nginx的運行等等,掌握Nginx的運行的流程。
2. 如何發(fā)揮Nginx的性能?
一、Nginx的進(jìn)程的模型,是主-從結(jié)構(gòu),一個master進(jìn)程,多個worker進(jìn)程。worker進(jìn)程通常為CPU的數(shù)量。進(jìn)程職責(zé)如下:
(1) master進(jìn)程是監(jiān)控進(jìn)程,充當(dāng)進(jìn)程組和用戶交互的接口,同時監(jiān)控worker進(jìn)程,如果worker進(jìn)程意外退出,master重新fork一個worker進(jìn)程。
(2) worker進(jìn)程完成具體的業(yè)務(wù)邏輯,等待客戶端建立連接,接收客戶端的連接請求等等。
前面有網(wǎng)友說worker進(jìn)程的數(shù)量,配置為CPU數(shù)量*2。我覺得這樣不能提高效率,正確的做法是:
(1) worker進(jìn)程數(shù)=CPU數(shù),進(jìn)程間切換的代價是最小的。
(2) 其次設(shè)置worker進(jìn)程的CPU親和性,將worker進(jìn)程綁定到特定的CPU上面,避免進(jìn)程在CPU間調(diào)度帶來的開銷
采用上面兩個設(shè)定可以最大程度地降低進(jìn)程切換帶來的效率損失和提高CPU的利用率。在一個四核CPU上,worker進(jìn)程的數(shù)量如下:
openstack@openstack-VirtualBox:/mnt/share/nginx/nginx-1.6.3$ sudo /etc/init.d/apache2 stop
* Stopping web server apache2 *
openstack@openstack-VirtualBox:/mnt/share/nginx/nginx-1.6.3$ sudo /etc/init.d/nginx start
openstack@openstack-VirtualBox:/mnt/share/nginx/nginx-1.6.3$ ps -aux |grep nginx
root 15816 0.0 0.3 85892 2820 ? Ss 21:10 0:00 nginx: master process /usr/sbin/nginx
www-data 15817 0.0 0.3 86232 3412 ? S 21:10 0:00 nginx: worker process
www-data 15818 0.0 0.3 86232 3412 ? S 21:10 0:00 nginx: worker process
www-data 15819 0.0 0.3 86232 3412 ? S 21:10 0:00 nginx: worker process
www-data 15820 0.0 0.3 86232 3412 ? S 21:10 0:00 nginx: worker process
opensta+ 15822 0.0 0.2 15944 2392 pts/24 S+ 21:10 0:00 grep --color=auto nginx
二、Nginx是事件驅(qū)動的Web服務(wù)器,支持select/poll/epoll等I/O多路復(fù)用函數(shù)的實現(xiàn)。使用epoll不會設(shè)置文件描述符的增加而導(dǎo)致效率的下降。因為select和poll采用遍歷掃描來判斷描述符是否有事件發(fā)生。監(jiān)控的文件描述符增加,系統(tǒng)效率就會急劇下降。因此配置使用epoll會提高系統(tǒng)的性能。
3. 如何在理解Nginx源碼的基礎(chǔ)上,通過編寫Nginx插件來提高自己的編程能力?
研究過一部分Nginx的源代碼,全部用C語言寫的,代碼質(zhì)量非常高。編寫Nginx插件,當(dāng)然需要掌握C語言,C++語言也是可以開發(fā)Nginx的,據(jù)我所知lua也可以編寫Nginx插件。
理解Nginx源碼最好的方法就是先用,在使用過程中加深理解。其次選一本好的參考書,輔助學(xué)習(xí),好的書籍能夠夠指導(dǎo)我們學(xué)習(xí),達(dá)到事半功倍的效果。
(1) 首先下載一份Nginx的源碼,搭建編譯環(huán)境,編譯安裝。這種方式難度會大一些,需要在源代碼目錄執(zhí)行./configure,然后make & make install,其次,要處理很多編譯依賴庫安裝的問題,例如pcre。例如下圖:
checking for getaddrinfo() ... found
checking for PCRE library ... not found
checking for PCRE library in /usr/local/ ... not found
checking for PCRE library in /usr/include/pcre/ ... not found
checking for PCRE library in /usr/pkg/ ... not found
checking for PCRE library in /opt/local/ ... not found
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
也可以采用$sudo apt-get install nginx方式來安裝。
(2) 使用Nginx,配置Nginx,熟悉并逐漸掌握Nginx的配置和使用,主要理解Nginx的配置語法。
Nginx搭建一個反向代理服務(wù)器,將用戶的請求分發(fā)到不同的后端服務(wù)器來處理,由這些服務(wù)器完成具體的業(yè)務(wù)邏輯,通過分布式計算能夠大大減少業(yè)務(wù)處理時間。
(3) 配合一些工具,例如wireshark抓取網(wǎng)絡(luò)packet來分析;使用gdb attach到Nginx進(jìn)程來調(diào)試分析;使用日志信息來跟蹤Nginx的運行等等。
(4) 在使用過程中,理解,通過工具來了解Nginx的運行流程。結(jié)合源代碼學(xué)習(xí),掌握Nginx的模塊機制。
(5) 編寫負(fù)載均衡策略,Nginx中提供了加權(quán)輪詢、IP哈希等策略,通過參考他們的實現(xiàn),編寫適合自身業(yè)務(wù)需求的負(fù)載均衡策略,添加到Nginx中。
|
|