傳統上基于程序或線程模型架構的web服務通過每程序或每線程處理并發連接配接請求,這勢必會在網絡和I/O操作時産生阻塞,其另一個必然結果則是對記憶體或CPU的使用率低下。生成一個新的程序/線程需要事先備好其運作時環境,這包括為其配置設定堆記憶體和棧記憶體,以及為其建立新的執行上下文等。這些操作都需要占用CPU,而且過多的程序/線程還會帶來線程抖動或頻繁的上下文切換,系統性能也會由此進一步下降。
在設計的最初階段,nginx的主要着眼點就是其高性能以及對實體計算資源的高密度利用,是以其采用了不同的架構模型。受啟發于多種作業系統設計中基于“事件”的進階處理機制,nginx采用了子產品化、事件驅動、異步、單線程及非阻塞的架構,并大量采用了多路複用及事件通知機制。在nginx中,連接配接請求由為數不多的幾個僅包含一個線程的程序worker以高效的回環(run-loop)機制進行處理,而每個worker可以并行處理數千個的并發連接配接及請求。
如果負載以CPU密集型應用為主,如SSL或壓縮應用,則worker數應與CPU數相同;如果負載以IO密集型為主,如響應大量内容給用戶端,則worker數應該為CPU個數的1.5或2倍。
Nginx會按需同時運作多個程序:一個主程序(master)和幾個工作程序(worker),配置了緩存時還會有緩存加載器程序(cache loader)和緩存管理器程序(cache manager)等。所有程序均是僅含有一個線程,并主要通過“共享記憶體”的機制實作程序間通信。主程序以root使用者身份運作,而worker、cache loader和cache manager均應以非特權使用者身份運作。
主程序主要完成如下工作:
1. 讀取并驗正配置資訊;
2. 建立、綁定及關閉套接字;
3. 啟動、終止及維護worker程序的個數;
4. 無須中止服務而重新配置工作特性;
5. 控制非中斷式程式更新,啟用新的二進制程式并在需要時復原至老版本;
6. 重新打開日志檔案,實作日志滾動;
7. 編譯嵌入式perl腳本;
worker程序主要完成的任務包括:
1. 接收、傳入并處理來自用戶端的連接配接;
2. 提供反向代理及過濾功能;
3. nginx任何能完成的其它任務;
cache loader程序主要完成的任務包括:
1. 檢查緩存存儲中的緩存對象;
2. 使用緩存中繼資料建立記憶體資料庫;
cache manager程序的主要任務:
1. 緩存的失效及過期檢驗;
Nginx的配置有着幾個不同的上下文:main、http、server、upstream和location(還有實作郵件服務反向代理的mail)。配置文法的格式和定義方式遵循所謂的C風格,是以支援嵌套,還有着邏輯清晰并易于建立、閱讀和維護等優勢。
Nginx的代碼是由一個核心和一系列的子產品組成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;還用于啟用網絡協定,建立必要的運作時環境以及確定不同的子產品之間平滑地進行互動。不過,大多跟協定相關的功能和某應用特有的功能都是由nginx的子產品實作的。這些功能子產品大緻可以分為事件子產品、階段性處理器、輸出過濾器、變量處理器、協定、upstream和負載均衡幾個類别,這些共同組成了nginx的http功能。事件子產品主要用于提供OS獨立的(不同作業系統的事件機制有所不同)事件通知機制如kqueue或epoll等。協定子產品則負責實作nginx通過http、tls/ssl、smtp、pop3以及imap與對應的用戶端建立會話。
在Nginx内部,程序間的通信是通過子產品的pipeline或chain實作的;換句話說,每一個功能或操作都由一個子產品來實作。例如,壓縮、通過FastCGI或uwsgi協定與upstream伺服器通信,以及與memcached建立會話等。
一、安裝Nginx:
1.解決依賴關系
編譯安裝Nginx需要事先安裝開發包組“Development Tools”和“Development Libraries”。同時,還需要專門安裝pcre-devel包:
2.安裝
首先添加使用者nginx,實作以運作nginx服務程序:
接着開始編譯和安裝:
說明:如果想使用nginx的perl子產品,可以通過為configure腳本添加--with-http_prel_module選項來實作,但目前此子產品仍處于實驗性使用用階段,可能會在運作中出現意外,是以,不做編譯。如果想使用基于nginx的cgi功能,也可以基于FCGI來實作。
3.為nginx提供SysV init腳本:
建立檔案/etc/rc.d/init.d/nginx,内容如下:
而後為才腳本賦予執行權限:
添加至服務管理清單,并讓其開機自動啟動:
而後就可以啟動服務并測試:
二、安裝mysql-5.5.28
1.準備資料存放的檔案
建立一個邏輯卷,并将其挂載至特定目錄即可。
這裡假設其邏輯卷的挂載目錄為/mydata,而後需要建立/mydata/data目錄作為mysql資料的存放目錄。
2.建立使用者以安全方式運作程序:
3.安裝并初始化mysql-5.5.28
4.為mysql提供主配置檔案:
并修改此檔案中thread_concurrency的值為你的CPU個數乘以2,比如這裡使用如下行:
另外還需要添加如下行指定mysql資料檔案的存放位置:
5.為mysql提供Sysv服務腳本:
添加至服務清單:
啟動服務進行測試使用。
為了使用mysql的安裝符合系統使用規範,并将其開發元件導出系統使用,這裡需要進行如下步驟:
6.輸出mysql的man手冊至man指令的查找路徑:
編輯/etc/man.config,添加如下行即可:
7.輸出mysql的頭檔案至系統檔案路徑/usr/include:
可以通過建立連結來實作:
8.輸出mysql的庫檔案給系統庫查找路徑:
而後讓系統重新載入系統庫:
9.修改PATH環境變量,讓系統可以直接使用mysql的相關指令
三、編譯安裝php-5.4.4
1.解決依賴關系:
如果想讓編譯的php支援mcrypt、mhash擴充和Libevent,需要下載下傳以下rpm包并安裝:
最好使用更新的方式安裝上面的rpm包,指令格式如下:
另外,也可以根據需要安裝Libevent,系統一般會自帶libevent,但版本低。是以可以更新安裝,它包含如下兩個rpm包。
說明:libevent是一個異步事件通知庫檔案,其API提供了在某檔案描述上發生事件時或其逾時時執行回調函數的機制,主要用來替換事件驅動的網絡伺服器上的event loop機制。目前來說,libevent支援/dev/poll、kqueue、select、poll、epoll及Solaris的的event ports。
2.編譯安裝php-5.4.4
說明:如果前面第1步解決依賴關系時安裝mcrypt相關的兩個rpm包,此./configure指令可以帶上--with-mcrypt選項讓Php支援mycrpt擴充。--with-snmp選項則用于實作php的SNMP擴充,但此功能要求前提安裝net-snmp相關軟體包。
為php提供配置檔案:
為php-fpm提供Sysv init腳本,并将其添加至服務清單:
為php-fpm提供配置檔案:
編輯php-fpm的配置檔案:
配置fpm的相關選項為你所需要的值,并啟用pid檔案(如下最後一行):
接下來就可以啟動Php-fpm了:
使用如下指令來驗證(如果指令中輸出php-fpm程序就說明啟動成功了):
四、整合nginx和php5
1.編輯/etc/nginx/nginx.conf,啟用如下選項:
2.編輯/etc/nginx/fastcgi_params,将其内容更改為如下内容:
并在所支援的首頁面格式中添加php格式的首頁,類似如下
而後重新載入nginx的配置檔案:
3.在/usr/html建立index.php的測試頁面,測試php是否正常工作:
然後就可以通過浏覽器來通路此測試頁面了。
五、安裝xcache,為php加速:
1.安裝
安裝結束,會出現類似如下行:
2.編輯php.ini,整合php和xcache:
首先将xcache提供的樣例配置導入php.ini
說明:xcache.ini檔案在xcache的源碼目錄中。
編輯/etc/php.d/xcache.ini,找到zend_extension開頭的行,修改為如下行:
注意:如果php.ini檔案中有多條zend_extension指令行,要確定此新增的行排在第一位。
3.重新啟動php-fpm
#service php-fpm restart
六、補充說明
如果要在SSL中使用php,需要在php的location中添加此選項:
本文轉自 SoulMio 51CTO部落格,原文連結:http://blog.51cto.com/bovin/1844883,如需轉載請自行聯系原作者