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://172.16.100.11:8080/bbs/
如果使用了模式匹配只能指定到:
http://172.16.100.11:8080/
OP:
~ :不區分大小寫
~* :區分大小寫
^~ : 做逐字符匹配
= : 路徑精確匹配,通常匹配一個文件
28分