隨着互聯網項目用戶訪問量不斷上升,單點web服務器是沒法知足大型高併發高負載的業務處理的,爲了給web服務器作負載均衡方案,打算採用Nginx搭建負載均衡服務器,把用戶請求分配到N個服務器來緩解服務器壓力。html
Nginx簡介:
Nginx (「engine x」) 是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器 。 Nginx 是由 Igor Sysoev 爲俄羅斯訪問量第二的Rambler.ru 站點開發的,它已經在該站點運行超過四年多了。Igor 將源代碼以類BSD許可證的形式發佈。自Nginx 發佈四年來,Nginx 已經由於它的穩定性、豐富的功能集、 示例配置文件和低系統資源的消耗而聞名了。目前國內各大門戶網站已經部署了Nginx,如新浪、網易、騰訊等;國內幾個重要的視頻分享網站也部署了Nginx,如六房間、酷6等。 新近發現Nginx 技術在國內日趨火熱,愈來愈多的網站開始部署Nginx。這邊都是網上說的,先扯一下蛋。。。。
linux
Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,供俄國大型的入口網站及搜索引擎Rambler(俄文:Рамблер)使用。其特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、新浪、網易、騰訊等。nginx
最新版本的nginx版本爲1.9.3,我這下載的是window版本的,通常實際場景都是安裝在linux系統下的,因爲linux系統目前正在摸索中這裏就不介紹。官方下載地址:nginx-1.9.3.zip 博客園下載地址:nginx-1.9.3.zip 。下載完成以後解壓運行nginx.exe就啓動了nginx了,啓動後會在進程裏面看到nginx。web
要實現負載均衡須要修改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) { Label0.Text = "請求開始時間:"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Label1.Text = "服務器名稱:" + Server.MachineName;//服務器名稱 Label2.Text = "服務器IP地址:" + Request.ServerVariables["LOCAL_ADDR"];//服務器IP地址 Label3.Text = "HTTP訪問端口:" + Request.ServerVariables["SERVER_PORT"];//HTTP訪問端口" Label4.Text = ".NET解釋引擎版本:" + ".NET CLR" + Environment.Version.Major + "." + Environment.Version.Minor + "." + Environment.Version.Build + "." + Environment.Version.Revision;//.NET解釋引擎版本 Label5.Text = "服務器操做系統版本:" + Environment.OSVersion.ToString();//服務器操做系統版本 Label6.Text = "服務器IIS版本:" + Request.ServerVariables["SERVER_SOFTWARE"];//服務器IIS版本 Label7.Text = "服務器域名:" + Request.ServerVariables["SERVER_NAME"];//服務器域名 Label8.Text = "虛擬目錄的絕對路徑:" + Request.ServerVariables["APPL_RHYSICAL_PATH"];//虛擬目錄的絕對路徑 Label9.Text = "執行文件的絕對路徑:" + Request.ServerVariables["PATH_TRANSLATED"];//執行文件的絕對路徑 Label10.Text = "虛擬目錄Session總數:" + Session.Contents.Count.ToString();//虛擬目錄Session總數 Label11.Text = "虛擬目錄Application總數:" + Application.Contents.Count.ToString();//虛擬目錄Application總數 Label12.Text = "域名主機:" + Request.ServerVariables["HTTP_HOST"];//域名主機 Label13.Text = "服務器區域語言:" + Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"];//服務器區域語言 Label14.Text = "用戶信息:" + Request.ServerVariables["HTTP_USER_AGENT"]; Label14.Text = "CPU個數:" + Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS");//CPU個數 Label15.Text = "CPU類型:" + Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER");//CPU類型 Label16.Text = "請求來源地址:" + Request.Headers["X-Real-IP"]; }
2.修改nginx配置信息session
修改nginx監聽端口,修改http server下的listen節點值,因爲本機80端口已經被佔用,我改成監聽8083端口。併發
listen 8083;
在http節點下添加upstream(服務器集羣),server設置的是集羣服務器的信息,我這裏搭建了兩個站點,配置了兩條信息。
#服務器集羣名稱爲Jq_one
upstream Jq_one {
server 127.0.0.1:9000;
server 127.0.0.1:8082;
}
在http節點下找到location節點修改
location / {
root html;
index index.aspx index.html index.htm; #修改主頁爲index.aspx
#其中jq_one 對應着upstream設置的集羣名稱
proxy_pass http://Jq_one;
#設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實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;
}
修改完成配置文件之後記得重啓nginx服務,最終完整配置文件信息以下
3.運行結果
訪問http://127.0.0.1:8083/index.aspx ,多訪問幾回,着重關注標紅部分。
能夠看到,咱們的請求被分發到了8082站點和9000站點,而且第一次是8082站點第二次9000。出現這樣的結果證實咱們負載均衡搭建成功了。 嘗試關閉其中的9000站點,而後刷新頁面發現輸出的http端口一直是8082,也就是說其中一個站點掛了,只要還有一個站點是好的,咱們的仍是能夠服務。
雖然咱們搭建好了負載均衡站點,可是還存在如下問題。
1.若是站點使用了session,請求平均分配到兩個站點,那麼必然存在session共享問題,該如何解決?
upstream Jq_one{
server 127.0.0.1:8082 ;
server 127.0.0.1:9000 ;
ip_hash;
}
2.管理員更新站點文件,該怎麼操做,如今還只有兩臺服務器,能夠手工將文件更新到兩臺服務器,若是是10臺呢,那麼手工操做必然是不可行的
3.站點中的文件上傳功能會將文件分配到不一樣的服務器,文件共享問題如何解決。
4.負載的服務器配置不同,有的高有的低可不可讓配置高的服務器處理請求多一些
upstream Jq_one{
server 127.0.0.1:8082 weight=4;
server 127.0.0.1:9000 weight=1;
}
經過weight設置每臺服務器分配請求站的權重,值越高分配的越多。
5.因爲請求是通過nginx轉發過來的,能夠在代碼裏面獲取到用戶請求的實際ip地址嗎?
#設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實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
以上代碼來自:http://www.cnblogs.com/yanweidie/p/4658136.html