1. nginx負載均衡原理
負載均衡(Load Balance),它在網路現有結構之上可以提供一種廉價、有效、透明的方法來擴展 網路設備 和 伺服器的帶寬 ,並可以在一定程度上 增加吞吐量 、 加強網路數據處理能力 、提高 網路的靈活性 和 可用性 等。用官網的話說,它充當著網路流中「交通指揮官」的角色,「站在」伺服器前 處理所有伺服器端和客戶端之間的請求 ,從而最大程度地 提高響應速率和容量利用率 ,同時 確保任何伺服器都沒有超負荷工作 。如果單個伺服器出現故障, 負載均衡的方法會將流量重定向到其餘的集群伺服器,以保證服務的穩定性 。當新的伺服器添加到伺服器組後,也可通過負載均衡的方法使其開始自動處理客戶端發來的請求。
負載均衡涉及到以下的基礎知識。
a. Round Robin: 對所有的backend輪訓發送請求,算是最簡單的方式了,也是默認的分配方式;
b. Least Connections(least_conn): 跟蹤和backend當前的活躍連接數目,最少的連接數目說明這個backend負載最輕,將請求分配給他,這種方式會考慮到配置中給每個upstream分配的weight權重信息;
c. Least Time(least_time): 請求會分配給響應最快和活躍連接數最少的backend;
d. IP Hash(ip_hash): 對請求來源IP地址計算hash值,IPv4會考慮前3個octet,IPv6會考慮所有的地址位,然後根據得到的hash值通過某種映射分配到backend;
e. Generic Hash(hash): 以用戶自定義資源(比如URL)的方式計算hash值完成分配,其可選consistent關鍵字支持一致性hash特性;
用戶(瀏覽器)在和服務端交互的時候,通常會在本地保存一些信息,而整個過程叫做一個會話(Session)並用唯一的Session ID進行標識。會話的概念不僅用於購物車這種常見情況,因為HTTP協議是無狀態的,所以任何需要邏輯上下文的情形都必須使用會話機制,此外HTTP客戶端也會額外緩存一些數據在本地,這樣就可以減少請求提高性能了。如果負載均衡可能將這個會話的請求分配到不同的後台服務端上,這肯定是不合適的,必須通過多個backend共享這些數據,效率肯定會很低下,最簡單的情況是保證會話一致性——相同的會話每次請求都會被分配到同一個backend上去。
出問題的backend要能被及時探測並剔除出分配群,而當業務增長的時候可以靈活的添加backend數目。此外當前風靡的Elastic Compute雲計算服務,服務商也應當根據當前負載自動添加和減少backend主機。
通常現代的網路服務者一個域名會關連到多個主機,在進行DNS查詢的時候,默認情況下DNS伺服器會以round-robin形式以不同的順序返回IP地址列表,因此天然將客戶請求分配到不同的主機上去。不過這種方式含有固有的缺陷:DNS不會檢查主機和IP地址的可訪問性,所以分配給客戶端的IP不確保是可用的(Google 404);DNS的解析結果會在客戶端、多個中間DNS伺服器不斷的緩存,所以backend的分配不會那麼的理想。
轉自 https://blog.csdn.net/weixin_43694144/java/article/details/84098906
2. 【NGINX入門】3.Nginx的緩存伺服器proxy_cache配置
本文介紹NGINX緩存機制,配置和參數說明。
如圖所示,nginx緩存,可以在一定程度上,減少源伺服器的處理請求壓力。因為靜態文件(比如css,js, 圖片)中,很多都是不經常更新的。nginx使用proxy_cache將用戶的請求緩存到本地一個目錄。下一個相同請求可以直接調取緩存文件,就不用去請求伺服器了。畢竟,IO密集型服務的處理是nginx的強項。
Nginx的緩存加速功能是由proxy_cache(用於反向代理和靜態緩存)和fastcgi_cache(PHP動態緩存)兩個功能模塊完成。
Nginx緩存特點:
先上個例子:
因為我是在一台伺服器上做試驗,所以用了兩個埠 80 和 90 進行模擬兩台伺服器之間的交互。
接下來講一下配置項:
這里我設置了 圖片 、 css 、 js 靜態資源進行緩存。
當用戶輸入 http://wangxiaokai.vip 域名時,解析得到 ip:port 的訪問地址。 port 默認為80。所以頁面請求會被當前server截取到,進行請求處理。
當解析到上述文件名結尾的靜態資源,會到緩存區獲取靜態資源。
如果獲取到對應資源,則直接返回數據。
如果獲取不到,則將請求轉發給 proxy_pass 指向的地址進行處理。
這里直接處理 90 埠接受到的請求,到伺服器本地目錄 /mnt/blog 下抓取資源進行響應。
細心的讀者應該發現,我在第二段例子里,留了個彩蛋 add_header wall "hey!guys!give me a star." 。
add_header 是用於在報頭設置自定義的信息。
所以,如果緩存有效的話,那麼靜態資源返回的報頭,一定會帶上這個信息。
(1)Nginx系列教程(3)nginx緩存伺服器上的靜態文件
https://yq.aliyun.com/articles/752967
(2)proxy_cache
nginx 反向代理之 proxy_cache https://www.cnblogs.com/yyxianren/p/10832172.html
(3)Nginx使用upstream負載均衡和proxy_cache緩存實現反向代理
https://blog.51cto.com/13770206/2163952
3. nginx如何實現負載均衡、限流、緩存、黑白名單和灰度發布
1.負載均衡配置
2.失敗重試配置
在fail_timeout時間內失敗了max_fails次請求後,認為上游伺服器不可用,就會將服務地址剔除掉,fail_timeout時間後會再次將伺服器加入存活列表進行重試。
limit_req_zone指令設置參數
參數說明
limit_req_zone定義在http塊中,$binary_remote_addr表示保存客戶端IP地址的二進制形式。
Zone定義IP狀態及URL訪問頻率的共享內存區域。zone=keyword標識區域的名字,以及冒號後面跟區域大小。16000個IP地址的狀態信息約1MB,例子區域可以存儲160000個IP地址。
Rate定義最大請求速率。示例中速率不能超過每秒10個請求。
設置限流
burs排隊大小,nodelay不限制單個請求間的時間。具體使用可以查看高並發場景如何使用nginx實現限流-實戰篇
不限流白名單
該配置說明 192.168.1.0/24網段的ip訪問是不限流的,其它限流。ip後面數字的含義
24表示子網掩碼:255.255.255.0
16表示子網掩碼:255.255.0.0
8表示子網掩碼:255.0.0.0
1.瀏覽器緩存 靜態資源緩存用expire
Response Header中添加了Expires和Cache-Control
所謂的靜態資源一般包括一直不變的圖像,如網站的logo,js、css靜態文件還有可下載的內容,媒體文件
協商緩存(add_header ETag/Last-Modified value)包括html文件,經常替換的圖片,經常需要修改的js、css文件和基本不變的api介面
不需要緩存包括用戶隱私等敏感數據,用戶經常變動的api介面
2.代理層緩存
在本地磁碟創建一個文件目錄,根據我們的配置把請求資源以k(key自定義,這邊用url的hash值)->v形式緩存到目錄里,並根據需求對內容設置緩存時長,比如狀態碼為200緩存10分鍾,其餘的緩存1分鍾等待。要清理緩存可以藉助purger的功能。如果ab測試/個性化需求時應禁用瀏覽器緩存,否則會因為緩存導致誤差。
方式一
方式二 lua+redis動態黑名單(openresty)
配置(/usr/local/openresty/nginx/conf/nginx.conf)
lua腳本編寫(ip_blacklist.lua)
1.根據cookie實現灰度發布
根據cooke查詢version值,根據version跳轉到對應的host,如果沒有匹配上的就跳轉到默認配置。
2.根據來路ip實現灰度發布
4. 深入Nginx + PHP 緩存詳解
以下是對Nginx中的PHP緩存進行了詳細的分析介紹 需要的朋友可以參考下Nginx緩存 nginx有兩種緩存機制:fastcgi_cache和proxy_cache 下面我們來說說這兩種緩存機制的區別吧 proxy_cache 作用是緩存後端伺服器的內容 可能是任何內容 包括靜態的和動態的 fastcgi_cache 作用是緩存fastcgi生成的內容 很多情況是php生成的動態內容 proxy_cache 緩存減少了nginx與後端通信的次數 節省了傳輸時間和後端帶寬 fastcgi_cache 緩存減少了nginx與php的通信次數 更減輕了php和資料庫的壓力 proxy_cache 緩存設置
復制代碼 代碼如下: #注 proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區 proxy_temp_path /data /proxy_temp_dir; #設置Web緩存區名稱為cache_one 內存緩存空間大小為 MB 天沒有被訪問的內容自動清除 硬碟緩存空間大小為 GB proxy_cache_path /data /proxy_cache_dir levels= : keys_zone=cache_one: m inactive= d max_size= g; server { listen ; server_name yourdomain ; index index index ; root /data /htdocs/; location / { #如果後端的伺服器返回 執行超時等錯誤 自動將請求轉發到upstream負載均衡池中的另一台伺服器 實現故障轉移 proxy_next_upstream _ _ error timeout invalid_header; proxy_cache cache_one; #對不同的HTTP狀態碼設置不同的緩存時間 proxy_cache_valid h; #以域名 URI 參數組合成Web緩存的Key值 Nginx根據Key值哈希 存儲緩存內容到二級緩存目錄內 proxy_cache_key $host$uri$is_args$args; proxy_set_header Host $host; proxy_set_header X Forwarded For $remote_addr; proxy_pass //backend_server; expires d; } #用於清除緩存 假設一個URL為 通過訪問就可以清除該URL的緩存 location ~ /purge(/ *) { #設置只允許指定的IP或IP段才可以清除URL緩存 allow ; allow / ; deny all; proxy_cache_purge cache_one $host$ $is_args$args; } #擴展名以 php jsp cgi結尾的動態應用程序不緩存 location ~ * (php|jsp|cgi)?$ { proxy_set_header Host $host; proxy_set_header X Forwarded For $remote_addr; proxy_pass //backend_server; } access_log off; } }fastcgi_cache緩存設置
復制代碼 代碼如下: #定義緩存存放的文件夾 fastcgi_cache_path /tt/cache levels= : keys_zone=NAME: m inactive= d max_size= G; #定義緩存不同的url請求 fastcgi_cache_key "$scheme$request_method$host$uri$arg_filename$arg_x$arg_y"; server { listen ; server_name example ; location / { root /; index index index index php; } location ~ (| php)$ { root /; fastcgi_pass : ; fastcgi_cache NAME; fastcgi_cache_valid h; fastcgi_cache_min_uses ; fastcgi_cache_use_stale error timeout invalid_header _ ; fastcgi_index index php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi conf; #設置緩存的過程中發現無法獲取cookie 經查需要定義這句話 fastcgi_pass_header Set Cookie; } log_format access $remote_addr $remote_user [$time_local] "$request" $status $body_bytes_sent "$_referer" "$_user_agent" $_x_forwarded_for ; access_log / }總的來說 nginx的proxy_cache和fastcgi_cache的緩存配置差不多 memcache緩存 在討論memcache緩存之前 我們先了解下mysql的內存緩存吧 mysql的內存緩存可以在my cnf中指定大小 內存表和臨時表不同 臨時表也是存放內存中 臨時表最大的內存需要通過tmp_table_size= M設定 當數據查過臨時表的最大值設定時 自動轉為磁碟表 此時因需要進行IO操作 性能會大大下降 而內存表不會 內存滿了後 會提示數據滿錯誤 例
復制代碼 代碼如下: create table test ( id int unsigned not null auto_increment primary key state char( ) type char( ) date char( ) )engine=memory default charset=utf lishixin/Article/program/PHP/201311/21248