nginx的負載均衡模塊詳解


反向代理與負載均衡的概念:

    Nginx僅僅是作為nginx proxy反向代理使用,nginx其實是反向代理,只不過是有負載均衡的功能!

 

安裝Nginx負載均衡

官網Nginx模塊講解

 

模塊詳解

upstream模塊

upstream www {         #upstream是關鍵字,必須要寫,后面的www是一個群組名字,自己起名
server 192.168.70.127:80 weight=1;   #  server固定關鍵字,后面可以接域名或者IP,如果不指定端口默認80.

                                                             #weight權重,數值越大被分配的請求越多,結尾有分號
server 192.168.70.126:80 weight=1 bakup;#bakcup相當於熱備

server 192.168.79.128:80 weight=1 max_fails=2 fail_timeout=20s;#max_fails嘗試連接后端主機失敗的次數,這個值配合 proxy_next_upstream、                                                                                                                fastcgi_next_upstream和memcached_next_upstream這三個參數來使用。根據需求配置,不要太大建議1-3次

                                                                                     fail_timeout=20s 失敗秒數,在達到max_fails嘗試連接失敗次數后,休息20秒,在次連接默認10秒,建議2-3秒

}

 

upstream模塊調度算法

調度算法一份分為兩類:

  第一類  靜態調度算法

        分配的時候,不需要考慮后端節點服務器的情況(rr, wrr, ip_hash調度算法)

      第二類   動態調度算法

        根據自身的情況調度,根據后端節點狀態是否響應很快進行調度(least_conn,fair等)

 

靜態調度算法

  rr輪詢(默認調度算法)

                   按照客戶端請求順序把客戶端的請求逐一分配到不同后端節點服務器

    wrr權重輪序

                 在rr輪詢算法的基礎上加上權重,權重值越大,別轉發的請求越多,可以根據服務器狀態進行指定權重值大小

      ip_hash

                 每個請求按照客戶端IP的hash結果分配,新的請求到達時,先將客戶端IP通過哈希算法哈希出一個值,在隨后的的客戶端請求中,客戶IP的哈希值只要相同,就會被分配至同一台服務器,該調度算法可以解決動態網頁的session共享問題,但是會導致請求分配不均

      (在upstream里配置,如果是ip_hash,不能有weight和bakcup)

    

        upstream www{

                      ip_hash:

                            server xxxx

                         }

 

動態調度算法

fair

   fair算法會根據后端節點服務器的響應時間來分配請求,時間短的優先分配,必須下載nginx的相關模塊upstream_fair

  upstream www{

 fair;

  server xxx;

 server xxx;

}

 

least_conn

   least_conn算法根據后端節點的連接數來決定分配情況,哪個機器連接數少就分發

 

url_hash算法(web cache)

   和ip_hash類似,一般用於web緩存,根據訪問URL的hash結果來分配請求的,每個URL定向到同一個后端服務器,后端服務器為緩存服務器時效果明顯。

upstream www{

server xxxx

hash $request_uri;

hash_method crc32;

}

 

一致性hash算法

    一致性hash算法一般用於代理后端業務為緩存服務(squid,memcached)的場景,通過將用戶請求的URI或指定字符串進行計算,然后調度到后端服務器上,此后任何用戶查找同一個RUI或者指定字符串都會被調度到這一台服務器上,此后后端的每個節點緩存的內容都是不同的。

http{

  upstream www{

     consistent_hash $request_uri;

      server xxxx id=1001  weigh=3;

 }

}

 

 

http_proxy_module模塊

proxy_pass轉發代理

    location /name/ {

               proxy_pass http://127.0.0.1/remote/;

}

 

相關參數

  • proxy_set_header     設置http請求header項傳給后端服務器節點,可實現讓代理后端服務器節點獲取訪問客戶端用戶真實IP地址 proxy_set_header Host  $host;
  • client_body_buffer_size  用於指定客戶端請求主體緩沖區大小
  • proxy_connect_timeout   表示反向代理與后端節點服務器連接的超時時間
  • proxy_send_timeout        代理后端服務器的數據回傳時間,在規定時間之內服務器必須傳完所有數據,否則斷開
  • proxy_read_timeout         設置nginx從代理的后端服務器獲取信息時間,表示連接建立成功后,nginx等待后端服務器的響應時間
  • proxy_buffer_size     設置緩沖區大小,默認該緩沖區大小等於指令proxy_buffers設置大小
  • proxy_buffers              這是緩沖區的數量和大小,nginx從代理的后端服務器獲取響應信息
  • proxy_busy_bufers_size  用於設置系統很忙時可以使用的proxy_buffers大小,官方推薦proxy_buffer*2
  • proxy_temp_file_write_size  臨時緩存文件

 

 反向代理重要參數

prox_pass http://server_pools;      通過proxy_pass功能把用戶的請求轉向到反向代理定義的upstream服務器

proxy_set_header Host $host;     在代理向后端服務器發送的http請求頭中加入host字段信息,用於后端服務器配置有多個虛擬主機,可以識別那個虛擬主機

proxy_set_header X-Forwarded-For $remot_addr;  用於接收用戶真實IP,而不是代理服務器ip

在配置文件里都會加上include proxy.conf;

在proxy.conf里增加參數,會顯得干凈

 

proxy_set_header Host  $host;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_connect_timeout 60;

proxy_send_timeout 60;

proxy_read_timeout 60;

proxy_buffer_size 4k;

proxy_buffers 4 32k;

proxy_busy_buffers_size 64k;

proxy_temp_file_write_size 64k;

 

 

=========================NGINX--根據URL中的目錄地址實現代理轉發====================

 

 

 

當用戶請求www.daxian.com/upload/xx地址的時候,實現由upload上傳服務器池處理請求

當用戶請求www.daxian.com/static/xx地址的時候,實現由靜態服務器池處理請求

除此之外,對於其他訪問請求,全部交給默認動態服務器請求

 

環境 131負載均衡   126nginx  127apache(服務器有限,127當兩台服務器)

配置過程

在131nginx配置文件中添加

   upstream static_pools {
        server 192.168.70.127:80 weight=1;#apache
    }
   upstream upload_pools{
        server 192.168.70.127:8080 weight=1;
    }
   upstream default_pools{
        server 192.168.70.126:80 weight=1;#nginx
   }

server {
listen 80;
server_name www.daxian.com;
location / {
proxy_pass http://default_pools;
include proxy.conf;
}

 
         

location /static/ {
proxy_pass http://static_pools;
include proxy.conf;
}

 
         

location /upload/ {
proxy_pass http://upload_pools;
include proxy.conf;
}

 
         

}

 

 

配置apache

cd /application/apache/conf/extra/

vim httpd-vhosts.conf 

<VirtualHost *:80>
ServerAdmin 2647@qq.com
DocumentRoot "/application/apache2.2.34/htdocs/www"
ServerName www.daxian.com
ServerAlias daxian.com
ErrorLog "logs/www-error_log"
CustomLog "logs/www-access_log" common
</VirtualHost>


<VirtualHost *:8080>
ServerAdmin 2647@qq.com
DocumentRoot "/application/apache2.2.34/htdocs/www8080"
ServerName www.daxian.com
ErrorLog "logs/www8080-error_log"
CustomLog "logs/www8080-access_log" common
</VirtualHost>

 
增加監聽端口8080
vim /application/apache/conf/httpd.conf

Listen 80
Listen 8080

創建訪問目錄 mkdir
-p /application/apache/htdocs/www8080 echo www8080>/application/apache/htdocs/www8080/index.html cd /application/apache/htdocs/www/ mkdir static/ echo static>index.html ../../bin/apachectl restart

 

web01修改hosts

192.168.70.127 web02  www.daxian.com

進行測試

curl http://www.daxian.com
apachewww

curl http://www.daxian.com/static/
static

 

cd www8080

mkdir /upload/

cd /upload/

echo "upload">index.html

測試

curl http://www.daxian.com:8080/upload/
upload

 

驗證結果

web01 修改hosts文件,將地址指向負載均衡器

192.168.70.131 lb01 www.daxian.com

ping www.daxian.com
PING lb-01 (192.168.70.131) 56(84) bytes of data.
64 bytes from lb-01 (192.168.70.131): icmp_seq=1 ttl=64 time=0.571 ms
64 bytes from lb-01 (192.168.70.131): icmp_seq=2 ttl=64 time=0.686 ms
64 bytes from lb-01 (192.168.70.131): icmp_seq=3 ttl=64 time=0.685 ms

 

測試

curl http://www.daxian.com
nginx wwww

curl http://www.daxian.com/static/
static

curl http://www.daxian.com/upload/
upload

 ============================nginx根據移動端轉發============================

 

 

在7層負載均衡下不需要人為拆分域名,對外只需要用一個域名即可,通過獲取用戶請求中設備信息($http_user_agent獲取)

vim nginx.conf

worker_processes 1;

events {
worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream android_pools { server 192.168.70.127:80 weight=1; #apache } upstream iphone_pools { server 192.168.70.127:8080 weight=1; } upstream pc_pools { server 192.168.70.126:80 weight=1; #nginx } server { listen 80; server_name www.daxian.com; location / { if ($http_user_agent ~* "android") { proxy_pass http://android_pools; } if ($http_user_agent ~* "iphone") { proxy_pass http://iphone_pools; } proxy_pass http://pc_pools; include proxy.conf; } } }

 

../sbin/nginx -s reload

 

局域網里就可以輸入ip地址訪問

安卓

http://192.168.70.131/static/

蘋果

http://192.168.70.131/upload/

pc

http://192.168.70.131

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM