Nginx: Nginx反向代理、負載均衡、緩存、URL重寫及讀寫分離

Nginx反向代理、負載均衡、緩存、URL重寫及讀寫分離


設計高性能網站的時候首頁靜態化,都是html格式,可能有

些子版塊是動態生成的,但也是緩存的。

由於網站越來越複雜,網站需要分區,分成圖片組,搜索組等等:




Xcache: 緩存

Nginx特性:

map

event-driver:一個進程響應多個請求,單線程進程

aio

 

LEMP:

  Nnginx(FastCGI) + php + fps

  

  

10000個請求,才2.5M內存

 

lvs:  4層,dr模型,配置邏輯比較複雜,工作在內核的,但性能是最好的

      經過優化後,一個時間內可以轉發數百萬個請求,不具備檢查APPServer

        狀況的能力,還需要調用iodevertor

       

       

nginx: 7層,能理解具體應用協議的,工作於用戶空間,一個時間內能處理上萬個請求

haproxy: 7層,能理解具體的應用協議的,工作在用戶空間,一個時間內能處理上萬個請求

在同一個條件下,haproxy的轉發能力比nginx強,但nginx對系統的資源需求量要求小,

haproxy具有緩存功能,但nginx的緩存功能乏善可陳了。

 

一般MySQL服務器,能同時處理50個請求就不錯了。

 

Memcache: 公共緩存,後端查詢數據庫緩存,先查詢Memcache,如果緩存中沒有,

再查數據庫。命中率達到40%左右,帶整體的性能提升都是

非常明顯的。

 

Xcache: 單個APP server爲例,由於App Server是php服務器,

Php的執行代碼要編譯成opcode, 然後才能執行,第二個請求再

請求同一個頁面的時候,還需要重新編譯,由於每個請求是由

一個進程處理,不能共享,但使用xcache後,可以使得第一個

請求編譯的opcode可以被第二個請求使用。

 

如果某個App Server掛了怎麼吧?

1.可以使用持久連接,讓同一個客戶端的請求時鐘發送到某個

服務器;如果這個服務器掛了,就會丟失這臺主機的會話信息;

2.共享會話信息,通過組播的方式同步,粘性會話,小集羣可以;

3.使用session共享服務器,用memcache或者redis緩存服務器。

每一個請求都會發cookia,通過cookia, 找到session。

Memcache對高可用的支持不理想,但可以很好實現分佈式功能。

通過hash運行,取餘,選擇服務器。

如果某個key要存多個數據的時候,可以用redis。

 

 

隨着訪問量的增加,網站需要分塊,把圖片,搜索,廣告等分塊。

 

隨着訪問的增加,分發服務器會成爲瓶頸,形成單點故障。

 

在分發服務器可以緩存opcode生成的結果,但轉發服務器

本身就很忙,還有緩存,所以可以將緩存服務器緩存起來。

如果緩存服務器有,就由緩存服務器夠着響應,如果沒有則

發送到後端服務器。

 

如果第一請求後的結果,緩存在第一個緩存服務器,如果第二個請求

過來,請求訪問第二個緩存服務器,則第二個緩存不能命中。

爲了提高命中率,可以做持久連接(會破壞負載均衡效果),或者

數據同步。




這些APP Server都是服務動態內容的,還可以加一個服務靜態內容的服務器組(varnish),如果圖片的時候,轉發給靜態服務器組(lvs分發給varnish,varnish在分發到後端服務器)。或者增加專門圖片服務器組。

如果要區分請求的資源類型,lvs是不支持的。

Nginx如果php的請求分發到後端?

Location ~* \.php${

      Fastcgi_proxy127.0.0.1:9000 

//定義方向代理,這就是反向代理

}

 

正向代理:內網的主機的80端口的請求,都發送代理服務器,代理內網主機

訪問internet,再返回結果給內網主機。

反向代理:外網的主機想訪問內網的主機,過程與正向代理相反。

 

Server{

      Listen 80;

   Server_namewww.magedu.com

   Location /{

          後端服務器;

}

}

怎麼定義後端服務器呢?

使用方向代理:

Proxy_pass

 

 

回顧Nginx配置分段:

Main;  //全局配置,worker進程數,錯誤日誌,

Event{

   //定義事件驅動的,Nginx基於事件驅動,如epoll

}

httpd{

  //關於httpd相關配置

}

Server{

//server只能放在http中,server不能嵌套,但location可以

//嵌套

}

  

Location URI{

//定義虛擬主機

//可以放在server中,也可以放在httpd中

//訪問規則,定義URI的屬性(誰能幹什麼)

}

 

詳解:

 

Location  /form/{

      Proxy_passHttp://172.16.100.11:8080/bbs/;

}

http://www.magedu.com/forum/

   àhttp://172.16.100.11:8080/bbs/

 

如果使用了模式匹配只能指定到:

http://172.16.100.11:8080/

 

OP:

~  :不區分大小寫

~* :區分大小寫

^~ : 做逐字符匹配

= : 路徑精確匹配,通常匹配一個文件

 

28分


發佈了69 篇原創文章 · 獲贊 11 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章