最近在研究分布式系統架構方面的知識,包括負載均衡,資料庫讀寫分離,分布式快取redis等。本篇先從負載均衡服務架構入手,關於負載均衡百度百科的定義如下:負載均衡,英文名稱為load balance,其意思就是分攤到多個操作單元上進行執行,例如web伺服器、ftp伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,從而共同完成工作任務。
我的解釋:一項任務交由乙個開發人員處理總會有上限處理能力,這時可以考慮增加開發人員來共同處理這項任務,多人處理同一項任務時就會涉及到排程問題,即任務分配,這和多執行緒理念是一致的。nginx在這裡的角色相當於任務分配者。
閱讀目錄
nginx安裝
站點搭建及配置
問題分析
總結一、nginx安裝
nginx是一款輕量級的web 伺服器/反向**伺服器及電子郵件(imap/pop3)**伺服器,並在乙個bsd-like 協議下發行。由俄羅斯的程式設計師igor sysoev所開發,供**大型的入口**及搜尋引擎rambler(俄文:)使用。其特點是占有記憶體少,併發能力強,事實上nginx的併發能力確實在同型別的網頁伺服器中表現較好,中國大陸使用nginx**使用者有:百度、新浪、網易、騰訊等。
最新版本的nginx版本為1.9.3,我這**的是window版本的,一般實際場景都是安裝在linux系統下的,由於linux系統目前正在摸索中這裡就不介紹。官方**位址:nginx-1.9.3.zip。**完成之後解壓執行nginx.exe就啟動了nginx了,啟動後會在程序裡面看到nginx。
要實現負載均衡需要修改conf/nginx.conf的配置資訊,修改配置資訊之後重新啟動nginx服務,可以通過nginx -s reload指令實現。這裡我們使用 ants 提供的乙個批處理來操作。
將nginx.bat檔案放到nginx.exe相同資料夾下,直接執行就行了。文章結尾會提供本文用到程式設計客棧的所有檔案。
二、站點搭建及配置
1.搭建兩個iis站點
站點下只有乙個簡單的index頁面,用來輸出當前伺服器資訊。由於我沒有兩台機器,所以將兩個站點都部署到本機了,分別繫結了8082和9000兩個埠。
protected void page_load(object sender, eventargs e)
2.修改nginx配置資訊
修改nginx監聽埠,修改http server下的listen節點值,由於本機80埠已經被占用,我改為監聽8083埠。
listen 8083;
在http節點下新增upstream(伺服器集群),server設定的是集群伺服器的資訊,我這裡搭建了兩個站點,配置了兩條資訊。
#伺服器集群名稱為jq_one
upstream jq_one
在http節點下找到location節點修改
location /
修改完成配置檔案以後記得重啟nginx服務,最終完整配置檔案資訊如下
3.執行結果
訪問 ,多訪問幾次,著重關注標紅部分。
可以看到,我們的請求被程式設計客棧分發到了8082站點和9000站點,並且第一次是8082站點第二次9000。出現這樣的結果證明我們負載均衡搭建成功了。 嘗試關閉其中的9000站點,然後重新整理頁面發現輸出的http埠一直是8082,也就是說其中乙個站點掛了,只要還有乙個站點是好的,我們的還是可以服務。
四、問題分析
雖然我們搭建好了負載均衡站點,但是還存在以下問題。
1.如果站點使用了session,請求平均分配到兩個站點,那麼必然存在session共享問題,該如何解決?
使用資料庫儲存session資訊
使用nginx將同一ip的請求分配到固定伺服器,修改如下。ip_hash會計算ip對應hash值,然後分配到固定伺服器
upstream jq_one
搭建一台redis伺服器,對session的讀取都從該redis伺服器上讀取。後面的文章將介紹分布式快取redis的使用
2.管理員更新站點檔案,該怎麼操作,現在還只有兩台伺服器,可以手工將檔案更新到兩台伺服器,如果是10臺呢,那麼手工操作必然是不可行的
多伺服器站點更新可以使用goodsync 檔案同步程式,會自動檢測檔案的修改新增,然後同步到其它伺服器上。在linux下可以使用rsync
3.站點中的檔案上傳功能會將檔案分配到不同的伺服器,檔案共享問題如何解決。
使用檔案伺服器將所有檔案儲存到該伺服器上,檔案操作讀取寫入都在該伺服器上。這裡同樣會存在乙個問題,檔案伺服器存在讀寫上限。
4.負載的伺服器配置不一樣,有的高有的低可不可以讓配置高的伺服器處理請求多一些
這裡講一下,負載均衡有好幾種演算法 輪轉法,雜湊法, 最少連線法,最低缺失法,最快響應法,加權法。我們這裡可以使用加權法來分配請求。
upstream jq_one
通過weight設定每台伺服器分配請求站的權重,值越高分配的越多。
5.由於請求是經過nginx**過來的,可以在**裡面獲取到使用者請求的實際ip位址嗎?
答案是肯定的,在localtion節點設定如下請求頭資訊
#設定主機頭和客戶端真實位址,以便伺服器獲取客戶端真實ip
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
**裡面通過request.headers["x-real-ip"],就能獲取到真實ip
6.nginx實現靜態檔案(image,js,css)快取
在server節點下新增新的localtion
#靜態資源快取設定
這是index頁面的**
總結通過nginx我們實現了乙個簡單的負載均衡,實際情況比這複雜很多。比如nginx伺服器掛了,那我們的站點就直接掛了,正確的通過keepalived元件來搭建多台nginx服務提供服務。本篇只做為分布式系統的開篇,後續會陸續推出redis快取,資料庫實現分布式架構的文章,敬請期待!
本文標題: nginx+iis實現簡單的負載均衡
本文位址:
nginx iis實現負載均衡
我的解釋 一項任務交由乙個開發人員處理總會有上限處理能力,這時可以考慮增加開發人員來共同處理這項任務,多人處理同一項任務時就會涉及到排程問題,即任務分配,這和多執行緒理念是一致的。nginx在這裡的角色相當於任務分配者。閱讀目錄 回到頂部 要實現負載均衡需要修改conf nginx.conf的配置資...
Nginx IIS實現負載均衡
當大型的web程式遇到高併發的時候,往往單點伺服器是扛不住這麼多使用者的同時訪問的,就會使程式宕機,所以我們就需要使用負載均衡來實現。當然也還有其他的方法解決高併發的問題。今天就簡單的介紹一下負載均衡的實現。負載均衡就是建立多個伺服器,當使用者傳送request到我們的iis上的時候,我們可以建立多...
nginx iis實現負載均衡
我的解釋 一項任務交由乙個開發人員處理總會有上限處理能力,這時可以考慮增加開發人員來共同處理這項任務,多人處理同一項任務時就會涉及到排程問題,即任務分配,這和多執行緒理念是一致的。nginx在這裡的角色相當於任務分配者。閱讀目錄 回到頂部 要實現負載均衡需要修改conf nginx.conf的配置資...