【轉】玩玩負載均衡---在window與linux下配置nginx

最近有些時間,開始接觸負載均衡方面的東西,從硬件F5再到Citrix Netscalar。不過由於硬件的配置雖然不復雜,但昂貴的價格也讓通常用戶望而卻步(十幾萬到幾十萬),因此只能轉向nginx,squid這類有反向代理功能的軟件了。好在其設置都不是很麻煩。php

      本文就以前所作過的安裝和配置步驟作一下總結分享出來,以避免往後忘記了。
      首先是windows系統,這裏建議使用window 2003企業版,而不要做用win7(太新了,我遇到沒法啓動nginx的問題)。要說的是,在windows下配置安裝nginx仍是很容易的,少了linux下下載tar再配置編譯參數等等步驟,咱們只要從下面的地址下載相應的zip包(大約750kb)便可,地址以下:css

      http://sysoev.ru/nginx/nginx-0.8.21.ziphtml


      須要說明的是這個下載包是nginx 0.8.21開發版,換句話說其只能用於搭建測試環境等用途的,不能用於實際的生產環境(受限於windows文件句柄數限制)。linux

      下載並將該包中的文件解壓到c盤上,爲了配置使用方便,我將其解壓後的文件夾名稱從「nginx-0.8.19」改成"nginx」,這樣咱們只要將要負載均衡的站點在iis中設置好以後,將相應的連接地址放到nginx的相應配置文件中便可,這裏咱們打開C:\nginx\conf\nginx.conf文件,將下面的內容放到該文件的「server { 」上方行處:nginx

upstream  mylocalsite {  
     server   10.0.2.137:8088;
     server   10.0.2.137:8089; 

 

      由於nginx沒法運行動態腳本,因此這裏要使用proxy_pass屬性進行代理,因此找到該配置文件的以下內容:ajax

location / {
           root   html;
           index  index.html index.htm;
}

 

      修改其內容以下:算法

 

location / {
            proxy_pass http://mylocalsite;
            #proxy_set_header   Host             $host;
            #proxy_set_header   X-Real-IP        $remote_addr;  ;#防止ajax安全請求問題
            #proxy_set_header   REMOTE-HOST        $remote_addr; ;#防止ajax安全請求問題

 

       修改完以後,還要修改一下server的偵聽端口,原內容以下:windows

server {
      listen       80;
      server_name  localhost; 
      …… 

 

      修改完後的內容以下:    後端

 server {
        listen       8086;
        server_name  10.0.2.136; 
        …… 

   

      這樣,nginx就會在啓動以後開始偵聽本地IP(10.0.2.136)的8086端口請求,而後將其請求轉向到mylocalsite 中所指定的兩個iis站點,並將執行的結果轉發給客戶端。若是一切配置正確,這時能夠運行 c:/nginx/nginx.exe (或在cmd下運行「start nginx」),就能夠在任務管理器中看到一個nginx進程啓動了。(注:若是配置文件有錯誤,能夠到C:\nginx\logs\error.log查看錯誤日誌,進一步排錯)。瀏覽器

      注: 關閉ngnix的命令: nginx -s stop

             配置文件ngnix.conf正確性判斷的命令: nginx -t 

 

       固然Nginx 負載均衡的功能也是很強的,而且其通常做爲七層負載均衡(應用協議層)。下面就其upstream所支持的四個經常使用設置進行說明: 

複製代碼
1)、輪詢(默認):每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。
2)、weight :指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況。
2)、ip_hash :每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。
3)、fair(第三方):按後端服務器的響應時間來分配請求,響應時間短的優先分配。 
4)、url_hash(第三方) 
複製代碼

    

     按上面的說明,能夠將以前咱們的upstream作以下修改:

 

upstream  mylocalsite { 
     #ip_hash; 
     server   10.0.2.137:8088 weight=2;
     server   10.0.2.137:8089 weight=1; 
}

 

     這個當來了三個http請求時,其中的兩個會被分配到10.0.2.137:8088 上,一個分配到10.0.2.137:8089 。固然一開始能夠其分攤的請求能夠不是太嚴格按其設置,但當請求數多了以後,基本上就接近於咱們分指派的權值了。固然就負載均衡的算法而言,使用weight只是其中的一種,而常用的還有許多,好比lvs就在其內部實現了多種的負載均衡算法,能夠根據用戶的實際環境進行設置佈署。。固然就目前而言,nginx的算法相比較仍是少了許多,呵呵。  

     能夠說在windows下安裝配置仍是很方便的,但若是使用loadrunner作併發測試時,就會發現其logs/error.log就會報以下錯誤:

     maximum number of descriptors supported by select() is 1024 while connecting to upstream

     我曾經在網上查過解決方案,包括修改配置文件的worker_connections ,以下:       

 worker_rlimit_nofile 20240; 
     events {
         #use epoll;//linux下使用
          worker_connections  20240;
     } 

    

     但依舊不能將文件句柄數擴充到20240,仍是報1024最大句柄數錯誤。最後實在沒辦法了,只得開始嘗試在linux下安裝配置nginx。也就引起了下面的內容。  

     其實在網上有關介紹如何在linux下安裝nginx的要比windows下的要多得多,一定這是‘本家’吧。  

     由於以前網管只在虛擬機上安裝了CentOS5,因此只能就嘗試在該linux分支版本下安裝了。好在虛擬機已安裝完了,剩下的工做並不太多。

     首先須要以root身份登錄系統,而後切換身份爲超級管理員:      

 sudo -s          # 先成爲超級管理員

    

      而後進入到src目前下,並在當前目錄下download nginx.tar.gz包    

    cd /usr/src      # 將文件下載到這個目錄
     wget http://sysoev.ru/nginx/nginx-0.7.62.tar.gz# 下載安裝包
     tar xzvf nginx-0.7.62.tar.gz   #解壓

     

      若是下載的nginx 中默承認能沒有 rewirte規則,所以須要下載pcre包的擴展來實現這個功能:   

      wget  http://blog.s135.com/soft/linux/nginx_php/pcre/pcre-7.8.tar.gz    # 下載pcre
      tar xzvf pcre-7.8.tar.gz                   # 解壓pcre

    

      下面編譯安裝pcre      

 cd /usr/src/pcre-7.8;
 ./configure --prefix=/usr/local/pcre --enable-utf8 --enable-unicode-properties 

 

       下面編譯安裝nginx     

 cd /usr/src/nginx-0.7.62 

 

     開始配置要編譯的參數(注:內容較長,容易輸錯。具體參數設置參見http://wiki.codemongers.com/NginxChsInstall

  

./configure --prefix=/usr/local/nginx  --sbin-path=/usr/local/nginx/sbin/nginx  --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --pid-path=/usr/local/nginx/var/nginx.pid --lock-path=/usr/local/nginx/var/nginx.lock --http-client-body-temp-path=/dev/shm/nginx_temp/client_body --http-proxy-temp-path=/dev/shm/nginx_temp/proxy --without-http_rewrite_module --without-http-cache  --without-http_map_module --without-http_gzip_module #使用debuginfo 信息--with-debug

     接下來就開始編譯生成相應的文件了:

   make
   make install 

 

     而後/dev/shm 也就是內存中,創建一個nginx_temp文件夾

   mkdir /dev/shm/nginx_temp 

 

   接着建立www用戶和組,以及其使用的目錄:    

   /usr/sbin/groupadd www -g 48 
   /usr/sbin/useradd -u 48 -g www www 
   mkdir -p /data0/vshare/htdocs 
   chmod +w /data0/vshare/htdocs 
   chown -R www:www /data0/vshare/htdocs 

 

   這時能夠擴充一下文件句柄數(windows下就沒這麼容易擴展了,哎)   

 ulimit -SHn 51200 #設置打開文件句柄

  

   到這裏,咱們就可使用linux下的vi編輯器編輯一下:

   cd /usr/src/nginx-0.7.62/conf/ 
   vi nginx.conf

 

   將以前在window下的修改內容替換(按下insert鍵進入到編輯模式)到當前的文件中,當修改完成了,按冒號(":")切換到命令模式下,而後敲入「wq」,保存並退出。(強制退出(不保存)的話,輸入q!,而後回車)

     注:

events { 
            use epoll; 
            worker_connections  20240;
     }

      注:use epoll; //linux下使用,更多內容參見NginxChsOptimizations
       

     這樣就能夠運行nginx了:    

 /usr/local/nginx/sbin/nginx -t –c 

   建立個軟連接: $ sudo ln -s /user/local/nginx/sbin/nginx  /usr/bin/nginx #以前安過的話要先刪除sudo rm  /usr/bin/nginx

     啓動完成後,能夠經過以下指令查看其在內存中的運行信息:

   # ps aux | egrep '(PID|nginx)'

    nginx_config1

 

    這樣當咱們再使用loadrunner運行時,就能夠看到error.log中就再也不報那個惱人的「1024錯誤了」。 

    固然在nginx中,還支持文件緩存,以便於將那些靜態文件緩存到本地的nginx服務器上,只不過要修改一下其config文件配置,以下:

    vi nginx.conf

    在文件中的相應節點處輸入以下內容:   

複製代碼
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|html|htm|css)$ {        #指定緩存文件類型
       expires 7d;      #設置瀏覽器過時時間7天
       root data/nginx_cache/iis;          #靜態文件根目錄目錄(必須對應proxy_temp_path)
       proxy_store on;        #開啓緩存機制
       proxy_store_access user:rw group:rw all:rw;       #緩存讀寫規則
       proxy_temp_path data/nginx_cache/iis;            #存放靜態文件的緩存目錄
   #    include proxy.conf;          # 外聯proxy理的詳細配置如proxy_set_header, client_max_body_size  .
        if (!-e $request_filename) { 
              proxy_pass http://10.0.2.136;/
        }
   }
複製代碼

 

     這樣就會在data/nginx_cache/iis目前下生成相應的gif,jpg等文件的臨時信息,當客戶端請求到來時,就會從該目錄中檢索相應文件綁定以後返回給客戶端,以減輕iis服務器和網絡帶寬的壓力。  

    最後附上一個我在那臺Centos上的配置文件,你們能夠對比參照一下,由於nginx自己提供的配置結點信息過多,更多信息能夠參見這篇文章。  

    相關連接以下:

        張宴 搭建賽過Apache十倍的Web服務器(第5版)[原創]

        守住每一天(網名)       nginx反向代理配置及優化

 

      原文連接: http://www.cnblogs.com/daizhj/archive/2009/11/03/1595292.html

相關文章
相關標籤/搜索