<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
sticky 是一個nginx的第三方模組 它不在nginx發行版中 需要額外編譯這個模組的, 它的思想就是不依靠後端生成cookie , 而是sticky在nginx這裡生成cookie ,然後下發到使用者端, 使用者端收到cookie後 以後的請求帶著這個cookie 就會通過這個cookie 進行hash 被一直定位到後端的某一臺伺服器了
優點:
ip hash
負載有個優點就是 純 ip hash 像區域網內的存取ip 存取會導致ip傾斜$cookie_jsessionid
的優點就是 它不依賴後端 不用後端生成 session 從而減少後端的 資源想想為什麼要用這個 sticky 來把使用者儘量一直定位到一臺伺服器呢? 在多臺後臺伺服器的環境下,我們為了確保一個客戶只和一臺伺服器通訊,我們勢必使用長連線。使用什麼方式來實現這種連線呢,常見的有使用nginx自帶的ip_hash來做,我想這絕對不是一個好的辦法,如果前端是CDN,或者說一個區域網的客戶同時存取伺服器,導致出現伺服器分配不均衡,以及不能保證每次存取都粘滯在同一臺伺服器。
如果基於cookie會是一種什麼情形,想想看, 每臺電腦都會有不同的cookie,在保持長連線的同時還保證了伺服器的壓力均衡,nginx sticky值得推薦。
如果瀏覽器不支援cookie,那麼sticky不生效,畢竟整個模組是給予cookie實現的.
在說sticky 之前先來看看 nginx 通過 cookie_jessionid 的負載均衡方式
@Autowired lateinit var env: Environment @GetMapping("/server") fun server(request:HttpServletRequest):String { //獲取當前服務的埠 val port = env.getProperty("local.server.port") println("now port: $port") //呼叫了request.getSession(true) 則會沒有session的時候建立session val session = request.getSession(true) val name = session.getAttribute("name") println("name: $name") if (name == null){ session.setAttribute("name","johnny") } return "success" }
在upstream 裡面設定 hash 的方式 使用 cookie_jsessionid 去做hash
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; upstream backend { # 指定hash 方式是 cookie_jessionid nginx自帶的方式 hash $cookie_jsessionid; server 172.16.225.1:8081; server 172.16.225.1:8080; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { # 指定負載到後端upstream proxy_pass http://backend; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
可以看到 伺服器下發了 cookie JSESSIONID 並且多次請求這個 都不會改變 因為nginx 根據 JSESSIONID 它進行hash 每次都負載到同一臺後端伺服器, 因為這個後端伺服器已經存在了 這個session 所以不會再次建立
可以看到 多次請求 都打到這個 8081 的後端服務了
Bitbucket
1)下載完成,放入伺服器解壓,記住解壓的位置,後面要用
2)進入到nginx的安裝檔案
3)設定nginx
tar -xvf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz mv nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d nginx-sticky # 新增sticky 模組 ./configure --prefix=/usr/local/nginx --add-module=/opt/nginx-sticky
make 編譯的時候有可能會報錯
找到sticky剛剛的解壓目錄,進入修改檔案 vim ngx_http_sticky_misc.c ,加入下面的標頭檔案
#include <openssl/sha.h> #include <openssl/md5.h>
再次make , 當然後面如果還報錯的話,openssl檢查是否安裝
apt-get install -y openssl
設定好後重啟nginx
upstream backend { #hash $cookie_jsessionid; sticky; #指定使用 sticky 進行負載均衡 server 172.16.225.1:8081; server 172.16.225.1:8080; }
此時後端不會建立session 也不會下發cookie jsessionid 了
@Autowired lateinit var env: Environment @GetMapping("/server") fun server(request:HttpServletRequest):String { val port = env.getProperty("local.server.port") println("now port: $port") return "success" }
可以看到stick 幫我們下發了 route 這個cookie , 並且這個不會變 預設關閉瀏覽器就會失效
可以看到請求還是隻會落在一臺伺服器上
sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];
name: 可以為任何的string字元,預設是route
domain:哪些域名下可以使用這個cookie
path:哪些路徑對啟用sticky,例如path/test,那麼只有test這個目錄才會使用sticky做負載均衡
expires:cookie過期時間,預設瀏覽器關閉就過期,也就是對談方式。
no_fallbackup:如果設定了這個,cookie對應的伺服器宕機了,那麼將會返回502(bad gateway 或者 proxy error),建議不啟用
本篇主要介紹了 nginx sticky 負載均衡,它不需要後端去生成session 下發jsessionid 而是nginx的sticky模組幫我們去下發一個 route 的 cookie , nginx 使用這個cookie 進行hash 負載, 從而實現了 客戶每次存取都粘滯在同一臺伺服器
以上就是nginx sticky實現基於cookie負載均衡範例詳解的詳細內容,更多關於nginx sticky cookie負載均衡的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45