首頁  >  文章  >  運維  >  nginx+iis如何實現簡單的負載平衡

nginx+iis如何實現簡單的負載平衡

WBOY
WBOY轉載
2023-05-20 09:43:05902瀏覽

一、nginx安裝

    nginx是一款輕量級的web 伺服器/反向代理伺服器及電子郵件(imap/pop3)代理伺服器,並在一個bsd- like 協議下發行。由俄羅斯的程式設計師igor sysoev所開發,供俄國大型的入口網站及搜尋引擎rambler(俄文:рамблер)使用。其特點是佔有內存少,並發能力強,事實上nginx的並發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站用戶有:百度、新浪、網易、騰訊等。

  最新版本的nginx版本為1.9.3,我這下載的是window版本的,一般實際場景都是安裝在linux系統下的,由於linux系統目前正在摸索中這裡就不介紹。官方下載地址:。下載完成之後解壓縮執行nginx.exe就啟動了nginx了,啟動後會在進程裡面看到nginx。

nginx+iis如何實現簡單的負載平衡

   要實現負載平衡需要修改conf/nginx.conf的設定訊息,修改設定資訊之後重新啟動nginx服務,可以透過nginx -s reload指令實作。這裡我們使用 ants 提供的一個批次來操作。

nginx+iis如何實現簡單的負載平衡

將nginx.bat檔案放到nginx.exe相同資料夾下,直接執行就行了。文章結尾會提供本文所用到的所有文件。

 nginx+iis如何實現簡單的負載平衡

二、網站建置及設定

#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配置資訊

  修改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 ,多造訪幾次,專注於標紅部分。

nginx+iis如何實現簡單的負載平衡

nginx+iis如何實現簡單的負載平衡

可以看到,我們的請求被分發到了8082站點和9000站點,第一次是8082站點第二次9000。出現這樣的結果證明我們負載平衡搭建成功了。嘗試關閉其中的9000站點,然後刷新頁面發現輸出的http端口一直是8082,也就是說其中一個站點掛了,只要還有一個站點是好的,我們的還是可以服務。

四、問題分析

  雖然我們搭建了負載平衡站點,但還存在以下問題。

  1.如果站點使用了session,請求平均分配到兩個站點,那麼必然存在session共享問題,該如何解決?

使用資料庫保存session資訊

使用nginx將相同ip的請求分配到固定伺服器,修改如下。 ip_hash會計算ip對應hash值,然後分配到固定伺服器

  upstream jq_one{
   server 127.0.0.1:8082 ;
    server 127.0.0.1:9000 ;
   ip_hash;
  }

建立一台redis伺服器,對session的讀取都會從該redis伺服器上讀取。後面的文章將介紹分散式快取redis的使用

  2.管理員更新網站文件,該怎麼操作,現在還只有兩台伺服器,可以手動將文件更新到兩台伺服器,如果是10台呢,那麼手動操作必然是不可行的

多伺服器網站更新可以使用goodsync 檔案同步程序,會自動偵測檔案的修改新增,然後同步到其它伺服器上。在linux下可以使用rsync

  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地址吗?

答案是肯定的,在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

 #静态资源缓存设置
 location ~ \.(jpg|png|jpeg|bmp|gif|swf|css)$
 { 
  expires 30d;
  root /nginx-1.9.3/html;#root: #静态文件存在地址,这里设置在/nginx-1.9.3/html下
  break;
 }

    这是index页面的代码

  • nginx+iis如何實現簡單的負載平衡
  • 以上是nginx+iis如何實現簡單的負載平衡的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除