nginx反向代理與負載均衡

第1章 nginx反向代理與負載均衡

1.1 nginx反向代理環境部署準備

01. 準備好lb01 10.0.0.5 安裝好nginx 1.10.3 編譯參數和web01上面同樣html

02. 準備好三臺web服務器,三臺web服務器安裝好nginx便可nginx

web01(10.0.0.8) web02(10.0.0.7) web03(10.0.0.9)web

03. 安裝好wireshark軟件(羣文件中wireshark-win64-2.2.2)算法

 

 

1.2 Nginx反向代理知識概念說明:

集羣概念介紹說明:一堆幹相同事情的服務器,稱爲集羣windows

      集羣概念的特色說明:高可用  高性能 (核心特色說明)後端

      集羣的分類說明:負載均衡集羣  高可用集羣瀏覽器

      負載均衡集羣概念說明:前面是負載均衡器,後面是集羣的節點緩存

      負載均衡集羣:會出現雪崩效應服務器

        高可用集羣:利用keepalived實現,一個機器宕機了,另外一個機器能夠頂替上架構

      反向代理實現軟件爲:nginx(7層http https )層次進行回顧---Nginx支持7層,1.9之後也支持4層了

      LVS支持4層,負載均衡架構學習haproxy(4層和7層 屬於反向代理軟件)

      硬件負載均衡設備說明:

        硬件和軟件使用場景(企業中軟硬件選型),中小型場景;

        門戶網站 (LVS Tnginx)大型企業網站;

        授課選擇Nginx進行負載均衡學習便可

        nginx經常使用的模塊:

        upstream 實現負載均衡和反向代理

        proxy

        rewrite

 

 

1.3 快速部署nginx負載均衡環境

①. 安裝部署nginx過程(一鍵自動化安裝腳本)

yum install -y pcre-devel openssl-devel

mkdir -p /server/tools

cd /server/tools

wget -q http://nginx.org/download/nginx-1.10.2.tar.gz

ls -l nginx-1.10.2.tar.gz

useradd nginx -s /sbin/nologin -M

tar xf nginx-1.10.2.tar.gz

cd nginx-1.10.2

./configure  --user=nginx --group=nginx --prefix=/application/nginx-1.10.2 --with-http_stub_status_module  --with-http_ssl_module

make

make install

ln -s /application/nginx-1.10.2 /application/nginx

            # 安裝部署完成進行檢查

/application/nginx/sbin/nginx -t

/application/nginx/sbin/nginx

curl localhost        

      # ②. 統一編寫nginx配置(web服務器端)

            worker_processes  1;

            events {

                worker_connections  1024;

            }

            http {

                include       mime.types;

                default_type  application/octet-stream;

                sendfile        on;

                keepalive_timeout  65;

                log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                                  '$status $body_bytes_sent "$http_referer" '

                                  '"$http_user_agent" "$http_x_forwarded_for"';

                server {

                    listen       80;

                    server_name  bbs.etiantian.org;

                    location / {

                        root   html/bbs;

                        index  index.html index.htm;

                    }

                access_log  logs/access_bbs.log  main;

                }       

                server {

                    listen       80;

                    server_name  www.etiantian.org;

                    location / {

                        root   html/www;

                        index  index.html index.htm;

                    }

                    access_log  logs/access_www.log  main;

                }

            }

 

      # ③. 統一nginx測試環境(web服務器端)

mkdir -p /application/nginx/html/{www,bbs}

for name in www bbs; do echo $name `hostname` >/application/nginx/html/$name/xiaoxinxin.html;done

for name in www bbs; do cat /application/nginx/html/$name/xiaoxinxin.html;done

說明:在瀏覽器測試前,重啓或啓動nginx服務程序(lb01 web01 web02)

              # ④. 瀏覽器測試web服務(利用IP地址進行訪問)

curl www.etiantian.org/xiaoxinxin.html

curl bbs.etiantian.org/xiaoxinxin.html

curl -H host:www.etiantian.org  10.0.0.7/xiaoxinxin.html

curl -H host:bbs.etiantian.org  10.0.0.7/xiaoxinxin.html

curl -H host:www.etiantian.org  10.0.0.9/xiaoxinxin.html

curl -H host:bbs.etiantian.org  10.0.0.9/xiaoxinxin.html

     

      # ⑤. 編輯配置負載服務文件

            upstream模塊: 相似於一個池塘,將nginx節點放置到池塘中

           

            至關於ansible的hosts文件定義

            [www]

            172.16.1.41

            172.16.1.31

                      

               proxy模塊: 用池塘裏面的nginx節點,利用proxy進行調用

      proxy_pass == ansible劇本中 - hosts:

        - hosts: www

            # 配置文件編寫內容

####lb01  nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;                                            

    upstream server_pools {

        server 10.0.0.7:80;

        server 10.0.0.8:80;

        server 10.0.0.9:80;

    }

    server {

        listen 80;

              server_name bbs.etiantian.org;

        location / {

            proxy_pass http://server_pools;

        }

       }

}

             

## 負載均衡配置完畢後,進行負載測試

[root@lb01 ~]# curl 10.0.0.5/oldboy.html

             

1.4      反向代理拍錯思路

01. 在lb01上訪問後端節點進行測試(curl)

02. 在lb01上訪問本地地址進行測試 (curl -H host:www.etiantian.org 10.0.0.5/xiaoxinxin.html)

03. 在瀏覽器上進行測試

a 緩存    b 域名解析

1.5 負載均衡參數介紹-深刻參數說明

 ########lb01 nginx.conf   multi hosts

 worker_processes  1;

 events {

     worker_connections  1024;

 }

 http {

     include       mime.types;

     default_type  application/octet-stream;

     sendfile        on;

     keepalive_timeout  65;

     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                                 '$status $body_bytes_sent "$http_referer" '

                                 '"$http_user_agent" "$http_x_forwarded_for"';                                          

           upstream server_pools {

               server 10.0.0.7 weight=1 max_fails=3 fail_timeout=10s;

               server 10.0.0.8 weight=1 max_fails=3 fail_timeout=10s;

               server 10.0.0.9 weight=1 max_fails=3 fail_timeout=10s;

           }

   server {

       listen 80;

       server_name www.etiantian.org;

       location / {

           proxy_pass http://server_pools;

       }

       access_log  logs/access_www.log  main;

}

    server {

        listen 80;

        server_name blog.etiantian.org;

        location / {

            proxy_pass http://server_pools;

        }

              access_log  logs/access_blog.log  main;   

       }

}

 

1.6 # 編寫負載均衡多虛擬主機配置

              ## 說明:負載配置信息能夠參見官方說明 http://nginx.org/en/docs/http/load_balancing.html

 ####lb01  nginx.conf

 worker_processes  1;

 events {

     worker_connections  1024;

 }

 http {

     include       mime.types;

     default_type  application/octet-stream;

     sendfile        on;

     keepalive_timeout  65;                                          

     upstream server_pools {

         server 10.0.0.7:80;

         server 10.0.0.8:80;

     }

     server {

         listen 80;

          server_name bbs.etiantian.org

         location / {

             proxy_pass http://server_pools;

                    proxy_set_header Host $host

         }

          }

   server {

         listen 80;

          server_name www.etiantian.org

         location / {

             proxy_pass http://server_pools;

                    proxy_set_header Host $host

         }

          }

 }

              說明:多虛擬主機信息配置完畢,須要修改windows的hosts文件進行域名映射

第2章 nginx負載均衡核心組件(模塊)

2.1 upstrean模塊調度算法種類

01. rr算法(默認調度算法)

輪循調度算法

02. wrr算法

權重調度算法--weight

03. ip_hash算法(靜態調度算法)

已經登陸的用戶,就分配到同一臺服務器,從而避免須要從新登陸,但會形成負載不均的結果

04. fair算法(動態調度算法)

哪臺服務器處理請求能力強,就優先分配給哪臺服務器

05. lest_conn算法

根據後端節點的鏈接數來決定分配狀況,哪一個機器鏈接數少,就分配給哪臺服務器。

2.2 nginx upstrean模塊

更多的Nginx upstream模塊參數請參考:
http://nginx.org/en/docs/http/ngx_http_ups-tream_module.html

 

upstream模塊內參數

參數說明

server 10.0.10.8:80

負載均衡後面的 RS配置,能夠是 IP或域名,若是端□不寫,默認是80端口。 高併發場景下,ip可換成域名,經過 DNS作負載均衡

weigth = l

表明服務器的權重,默認值是1。權重數字越大表示接受的清求比例越大

max_ fails=5

Nginx嘗試鏈接後端主機失敗的次數,這個值是配合 proxy_next_upstream、 fastcgi_next_upstreann 和 memcached_next_upstream 這三個參數來使用的。 當nginx接收後端服務器返回這三個參數定義的狀態碼時,會將這個請求轉發給正常工做的後端服務器,例如40四、50二、50三、 Max_ fails的默認值是1 ; 企業場景下建議 2-3次。如京東 1次,藍汛 10次,根據業物需求去配置

fail_ timeout=10s

在max_ fails定義的失敗次數後,距離下次檢查的間隔時間,默認是10s ;若是

max_ fails是5 ,它就檢測5次,若是5次都是502 ,那麼,它就會根據 fail_timeout

的值,等待10s再去檢查,仍是隻檢查一次,若是持續502 ,在不從新加載 Nginx

配置的狀況下,每隔 10s都只檢查一次。常規業務2~3秒比較合理,好比京東3

秒,藍汛3秒,可根據業務需求去配置

backup

熱備配置( RS芍點的高可用),當前面激活的 RS都失敗後會自動後用熱備 RS

這標誌着這個服務器做爲備份服務器,若主服務器所有宕機了,就會向它轉發請求

注意:當負載調度算法爲 ip_hash時,後端服務器在負載均衡調度中的狀態不能是

weight 和 backup

down==#

這標誌着服務器永遠不可用,這個參數可配合 ip_hash使用;相似註釋效果

http {

     include         mime.types;

     default_type  application/octet-stream;

     sendfile        on;

     keepalive_timeout  65;                                          

     upstream server_pools {

               server 10.0.0.7 weight=1 max_fails=3 fail_timeout=10s;

               server 10.0.0.8 weight=1 max_fails=3 fail_timeout=10s;

               server 10.0.0.9 weight=1 max_fails=3 fail_timeout=10s;

           }

2.3 http_proxy_module 模塊

 

 

 

server {
        listen 80;
   server_name bbs.etiantian.org
        location / {
           proxy_pass http://server_pools;                  
       proxy_set_header Host $host;                    顯示主機信息
       proxy_set_header X-Forwarded-For $remote_addr;   顯示訪問端地址
        }
   }

 

2.3.1 反向代理重要參數

 

 

 

 

第3章 nginx負載均衡配置實踐

3.1 根據URL中的目錄地址實現代理轉發

 第一個里程碑: 規劃 分類

/upload           10.0.0.8:80          html/www/upload      upload服務器

/static        10.0.0.7:80          html/www/static         static靜態服務器

/                10.0.0.9:80          html/www                默認

 第二個里程碑: 建立/設置

upstream upload_pools {

         server 10.0.0.8:80;

       }

       upstream static_pools {

         server 10.0.0.7:80;

       }

       upstream default_pools {

         server 10.0.0.9:80;

       }

 第三個里程碑:如何調用upstream信息

       location /static/ {

           proxy_pass http://static_pools;

           proxy_set_header Host $host;

           proxy_set_header X-Forwarded-For $remote_addr;

       }

     location /upload/ {

        proxy_pass http://upload_pools;

           proxy_set_header Host $host;

           proxy_set_header X-Forwarded-For $remote_addr;

       }

        location / {

        proxy_pass http://default_pools;

           proxy_set_header Host $host;

           proxy_set_header X-Forwarded-For $remote_addr;

       }

 第四個里程碑:配置lb負載均衡集羣的配置文件

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';                               

       upstream upload_pools {

         server 10.0.0.8:80;

       }

 

       upstream static_pools {

         server 10.0.0.7:80;

       }

 

       upstream default_pools {

         server 10.0.0.9:80;

       }

 

    server {

        listen 80;

        server_name www.etiantian.org;

       location /static/ {

           proxy_pass http://static_pools;

           proxy_set_header Host $host;

           proxy_set_header X-Forwarded-For $remote_addr;

       }

 

        location /upload/ {

            proxy_pass http://upload_pools;

           proxy_set_header Host $host;

           proxy_set_header X-Forwarded-For $remote_addr;

       }

 

        location / {

            proxy_pass http://default_pools;

           proxy_set_header Host $host;

           proxy_set_header X-Forwarded-For $remote_addr;

       }

         access_log  logs/access_www.log  main;

       }

}

第五個里程碑-建立環境

www.etiantian.org/nana.html

www.etiantian.org/upload/nana.html

www.etiantian.org/static/nana.html

 

##web01

mkdir -p /application/nginx/html/www/upload

echo  "web01 upload" >/application/nginx/html/www/upload/xxx.html

 

##web02

mkdir -p /application/nginx/html/www/static

echo  "web02 static" >/application/nginx/html/www/static/xxx.html

 

##web03

echo  "web03 default" >/application/nginx/html/www/xxx.html

 

第六個里程碑-進行測試


[root@lb01 conf]# curl www.etiantian.org/nana.html 
web03 default
[root@lb01 conf]# curl www.etiantian.org/static/nana.html 
web02 static
[root@lb01 conf]# curl www.etiantian.org/upload/nana.html 
web01 upload

3.2 根據客戶端的設備(user_agent)轉發實踐

 

 

 

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

                                                       

       upstream upload_pools {

         server 10.0.0.8:80;

       }

 

       upstream static_pools {

         server 10.0.0.7:80;

       }

 

       upstream default_pools {

         server 10.0.0.9:80;

       }

 

    server {

        listen 80;

        server_name www.etiantian.org;

        location / {

            proxy_set_header Host $host;

           proxy_set_header X-Forwarded-For $remote_addr;

 

         if ($http_user_agent ~* "iphone")

          {

            proxy_pass http://static_pools;

          }

         if ($http_user_agent ~* "Chrome")

          {

            proxy_pass http://upload_pools;

          }

        proxy_pass http://default_pools;

               }

         access_log  logs/access_www.log  main;

       }

}

相關文章
相關標籤/搜索