Nginx七層反向代理和負載均衡

 

1.介紹

1.1 Nginx不只是一個出色的web軟件,其七層代理和負載均衡也是至關出色。Nginx作前端代理,當用戶請求服務時,能夠根據url進行判斷,而後分配到不一樣的後臺webserver上。javascript

1.2 Nginx的負載均衡實現原理:首先在http模塊中配置使用upstream模塊定義後臺的web server的池子,名爲proxy-web,在池子中咱們能夠添加多臺後臺webserver,其中狀態檢查、調度算法都是在池子中配置;而後在serverr模塊中定義虛擬主機,可是這個虛擬主機不指定本身的web目錄站點,它將使用location匹配url而後轉發到上面定義好的web池子中,最後根據調度策略再轉發到後臺web server上php

2.負載均衡配置項的介紹

2.1 upstream調度算法介紹

       (1)rr輪詢(默認)css

       按照請求順序分配到每一個RS,和lvs中的rr算法同樣,若是RS宕機,會自動剔除,默認狀況下只檢測80端口,若是RS報40二、40三、50三、504錯誤,會直接返回給客戶端。html

2)weight(權重)前端

       在rr的基礎上再加上權重(默認是rr+weight),權重輪詢和訪問成正比,值越大分配的越多,能夠根據服務器的配置設置權重,能夠解決服務器性能不均進行請求分配的問題java

3)ip_hashnginx

       解決動態網頁session共享問題web

       每一個訪問請求按照IP地址的hash值進行分配,ip的hash值只要相同就會被分配到同一臺服務器上(lvs負載均衡的-p參數,keepalived配置裏的persistence_timeout 50),該調度算法能夠解決動態網頁session共享問題,但有時會致使請求分配不均,正則表達式

       提示:因爲國內用的都是nat模式,因此hash不適合使用算法

                 ip_hash不能和其餘的算法一塊使用,即不能使weight或backup

4)fair(第三方)

       按照後端服務器的響應時間來配置,響應時間短的優先分配,比上面的都更智能,此種算法能夠按照頁面大小和加載時間長短智能的進行負載均衡,nginx自己不支持fair,須要下載nginx的upstrea_fair模塊

5)url_hash(第三方)

       主要應用於緩存服務器上

       按照訪問的url來分配請求,讓相同的url定向到同一個服務器,後端服務器爲緩存服務器的時候效果更顯著,在upstream中加入hash語句,server語句中不能寫入weight等其餘的參數,hash_method是使用的hash算法。

       缺點:若是有一臺機器宕機了,那就苦了,consistent_hash能夠解決這個問題

       能夠提升後端緩存服務器的效率,nginx自己不支持url_hash的,須要下載hash軟件

6)least_conn

       最少鏈接數,哪一個鏈接少就分配到哪臺設備

7)consistent_hash

       一致性算法

 

2.2 upstream健康檢查配置介紹

upstream proxy_nginx {

                server 192.168.0.254 weight=1 max_fails=2 fail_timeout=10s ;

                server 192.168.0.253 weight=2 max_fails=2 fail_timeout=10s;

                            server 192.168.0.252 backup;

                            server 192.168.0.251  down;

        }

server 192.168.0.254 : 後臺RS,能夠是域名或IP,默認是80端口,也可加上:80指定

wight = 1 權重比 默認是1

max_fails=2 健康檢查的最大失敗次數,超過這次數表示該RS不可用,默認是1,0表示禁止失敗嘗試。生產環境通常設置2~3次

fail_timeout=10s  失敗的超時時間,默認是10s

backup  熱備配置,當前面的RS所有不可用時自動啓動

down  表示該服務永遠不可用

注意:max_fails設置的越低用戶體驗越好,可是設置低了也有個缺點,就是proxy可能會誤判RS的狀態,並且RS越少誤判的概率越大,誤判會對業務產生巨大影響,當RS的數量比較少時建議將該值設置的大點。

 

2.3 location指令的用法介紹

Location主要用來匹配url,如:http://www.beyond.com/nice,在這裏對於location來講www.beyond.com是域名,/nice纔是url。

對於url的匹配,可使用字符串或者正則表達式,但若是是正則表達式,必須指定前綴,location指令來匹配不一樣的url,匹配成功後應用不一樣的配置

語法:location [=|~|~*|^~|@]/url {…..}

[=]精確匹配,若是找到匹配等號的內容,當即中止搜索,並當即處理請求(優先級最高)

[~] 表示匹配正則表達式,區分大小寫

[^~]只匹配字符串,不匹配正則表達式,主要用來匹配目錄

[~*]表示匹配正則表達式,不區分大小寫

[@]指定一個命名的location,通常只應用於內部重定向請求,location @name {···}

示例:

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       80;

        server_name  www.beyond.com;

#No.1

        location / {

                return  502;

        }

#No.3

        location ~* \.jpg$ {

                return 403;

        }

#No.4

        location ^~ /a/ {

                return 402;

        }

#No.5

        location /a/1.jpg {

                return 401;

        }

#No.6

        location = /a/.jpg {

                return 400;

        }

}

}

 

小結:

匹配順序:

1)優先先匹配普通url,可是匹配完以後會繼續匹配正則

      內部匹配規則爲最大匹配前綴,即location /data/123 {} 要比 location /data {} 優先,和location的位置順序不要緊。匹配完以後會用最大匹配前綴 繼續去匹配下面的正則匹配

2)正則匹配,

  正則匹配跟位置順序無關,可是和邏輯順序有關,會以最大匹配爲準(越精確越優先)

3location的執行邏輯基本上跟順序沒有關係;可是針對正則匹配的方式,匹配上第一個url,就不在繼續匹配後面的url;

 

這種狀況,若是匹配上普通localtion,沒有正則匹配,則使用普通匹配;若是既有普通location的最大前綴匹配,也有正則匹配,則正則匹配覆蓋最大前綴匹配。

 

4)匹配完「普通 location 」後,有的時候須要繼續匹配「正則 location 」,有的時候則不須要繼續匹配「正則 location 」。

兩種狀況下,不須要繼續匹配正則 location :(1) 當普通 location 前面指定了「 ^~ 」,特別告訴 Nginx 本條普通 location 一旦匹配上,則不須要繼續正則匹配;(2) 當普通location 剛好嚴格匹配上,不是最大前綴匹配,則再也不繼續匹配正則。

2.4 proxy模塊的介紹

Nginx轉發模塊是ngx_http_proxy_module,默認安裝,能夠直接使用

Proxy_pass此指令用於轉發location匹配到的url到serve池子中。

語法:proxy_pass URL;

注意:使用該指令時需注意URL中是否包含URI。,若是URL中不包含URI,nginx將不會改變原地址的uri,若是包含uri,將使用新的uri代替原來的uri。

如:

location /test {

#1 proxy_pass http://1.1.1.1;

#2 proxy_pass http://1.1.1.1/tmp;

}

若是使用1的話,原來的url將不會改變,代理後是http://1.1.1.1/test

若是使用2的話,原來的url將會變爲http://1.1.1.1/tmp

因此在配置的時候須要注意url末尾是否加「/」的問題

 

參數:

proxy_ignore_client_abort  on|off用於設置客戶端中斷網絡請求時,nginx是否中斷對被代理服務器的請求,默認爲off,中斷

proxy_headers_hash_max_size  size 設置http報文頭的哈希表的大小,默認爲512

proxy_headers_hash_bucket_size size 設置申請存放http報文頭的哈希表容量的單位大小,默認爲64字符

client_body_buffer_size  客戶端請求緩存大小,能夠理解爲先保存本地在傳給用戶

proxy_connect_timeout time  與RS連接超時的時間,默認爲60s

proxy_send_timeout time  RS回傳數據的時間,必須在這個時間段內傳完,不然斷開鏈接

proxy_read_timeout time  等待RS響應的時間,標明鏈接已經成功,正在排隊

proxy_buffering on|off 是否開啓proxy buffer 默認爲on

proxy_buffer_size 緩存區大小,默認等於指令proxy_buffers設置的大小 默認爲4K或8K

proxy_buffers number size  緩衝區的數量和大小,從RS獲取的響應信息會放置到緩衝區,默認爲8 4K|8K

proxy_busy_buffers_size  系統很忙時可使用的proxy_buffers大小,官方推薦的大小是proxy_buffers的兩倍,默認爲8K或16K

proxy_temp_path path [level1[level2]] 指定磁盤上的一個文件路徑,用於臨時存放代理服務器的大致積響應數據,若是buffer已經裝滿,可是響應數據仍然沒有被nginx徹底接收,響應數據就會被臨時存放到該文件中

proxy_max_temp_file_size  用於配置全部臨時文件的整體積大小

proxy_temp_file_write_size  用於配置同時寫入緩存臨時文件的數據量大小
proxy_set_header host $host 當RS有多個虛擬主機的時候須要逐個指定

proxy_set_header X-Forwarded-For $remote_addr   開啓負載均衡器轉發真實客戶的IP地址給RS.    

注意:

proxy_set_header」當咱們的RS有多個虛擬主機(相同的ip,相同的端口)的時候如www、bbs、blog,代理服務器怎麼知道將請求發到哪呢,這個時候nginx代理就會查找proxy_set_header參數,將請求發送到相應域名的虛擬主機上。

3.nginx負載均衡配置案例

1.有三個域名:www.beyond.com bbs.beyond.com film.beyond.com,四臺webserver負責提供服務

2.有一個mailserver和cloud server在一臺服務器上

規劃:

web1   192.168.254.251    BBS、film

web2   192.168.254.252     BBS、film

web3   192.168.254.253       BBS、film

web4   192.168.254.254     www,負載均衡器

web5   192.168.254.250      mail   cloud

說明:web4是負載均衡器,同時也負責解析www站點。web一、web二、web3負責解析bbs和film站點。Mail和cloud在同一臺設備上,也是web站點

 

Nginx的安裝略了

如今列出web4的nginx的配置文件供參考

nginx.conf:

user  nginx;

worker_processes  4;

error_log  logs/error.log;

pid        logs/nginx.pid;

events {

    use epoll ;

       worker_connections  1024;

http {

     include       mime.types;

     default_type  application/octet-stream;

      server_tokens off;

      sendfile        on;

      tcp_nopush        on;

      keepalive_timeout  65;

      fastcgi_connect_timeout 300;

      fastcgi_send_timeout    300;

      fastcgi_read_timeout    300;

      client_header_buffer_size      32k;

      large_client_header_buffers 4 128k;

      client_max_body_size 10m;

      gzip  on;

      gzip_min_length  1k;

      gzip_buffers     4 8k;

      gzip_http_version 1.1;

      gzip_comp_level 6;

      gzip_vary on;

      gzip_types       text/javascript text/plain application/x-javascript text/css application/xml;

    log_format  main  ' $http_host $http_x_forwarded_for ${request_time}s [$time_local] "$request" $status $body_bytes_sent $http_referer $http_user_agent $remote_addr';

 

        include vhosts/*.conf;                 #每一個虛擬主機一個配置文件

        include upstream.conf;                       #存放web的後臺server

         fastcgi_intercept_errors on;

}

 

Vhosts/{bbs,film,www,cloud,mail}.conf:

  server {

        listen       80;

        server_name  bbs.beyond.com;

        index index.php;

        location  / {

        proxy_pass  http://web;

        proxy_set_header host $host;

        proxy_set_header X-Forwarded-For $remote_addr;

        client_body_buffer_size   4K;

        proxy_connect_timeout   90;

        proxy_send_timeout   90;

        proxy_read_timeout   90;

        proxy_buffer_size   4K;

        proxy_buffers      4 32K;

        proxy_busy_buffers_size  64K;

        proxy_temp_file_write_size  64K;

 

}

    }

 

  server {

        listen       80;

        server_name  cloud.beyond.com;

        index index.php;

        location  / {

        proxy_pass  http://192.168.254.250:8000;

        proxy_set_header host $host;

        proxy_set_header X-Forwarded-For $remote_addr;

        client_body_buffer_size   4K;

        proxy_connect_timeout   90;

        proxy_send_timeout   90;

        proxy_read_timeout   90;

        proxy_buffer_size   4K;

        proxy_buffers      4 32K;

        proxy_busy_buffers_size  64K;

        proxy_temp_file_write_size  64K;

 

}

    }

 

  server {

        listen       80;

        server_name  film.beyond.com;

        index index.php;

        location  / {

        proxy_pass  http://web;

        proxy_set_header host $host;

        proxy_set_header X-Forwarded-For $remote_addr;

        client_body_buffer_size   4K;

        proxy_connect_timeout   90;

        proxy_send_timeout   90;

        proxy_read_timeout   90;

        proxy_buffer_size   4K;

        proxy_buffers      4 32K;

        proxy_busy_buffers_size  64K;

        proxy_temp_file_write_size  64K;

 

}

    }

 

  server {

        listen       80;

        server_name  mail.beyond.com;

        index index.php;

        location  / {

        proxy_pass  http://192.168.254.250:80;

        proxy_set_header host $host;

        proxy_set_header X-Forwarded-For $remote_addr;

        client_body_buffer_size   4K;

        proxy_connect_timeout   90;

        proxy_send_timeout   90;

        proxy_read_timeout   90;

        proxy_buffer_size   4K;

        proxy_buffers      4 32K;

        proxy_busy_buffers_size  64K;

        proxy_temp_file_write_size  64K;

 

}

    }

 

  server {

        listen       80;

        server_name  monitor.beyond.com;

        index index.php;

        location  / {

        proxy_pass  http://192.168.254.220;

        proxy_set_header host $host;

        proxy_set_header X-Forwarded-For $remote_addr;

        client_body_buffer_size   4K;

        proxy_connect_timeout   90;

        proxy_send_timeout   90;

        proxy_read_timeout   90;

        proxy_buffer_size   4K;

        proxy_buffers      4 32K;

        proxy_busy_buffers_size  64K;

        proxy_temp_file_write_size  64K;

 

}

    }

 

  server {

        listen       80;

        server_name  www.beyond.com;

        root /usr/local/nginx/html/www;

        index index.html;

        access_log  logs/current/www.beyond.com-access.log  main;

        error_log  logs/current/www.beyond.com-error.log;

         error_page   500 501 502 503 504  /error/5-error.html;    

        error_page 400 403 404 405 408 410 411 412 413 414 415 /error/4-error.html;

 

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {

                expires 30d;

        }

 

        location ~.*\.(js|css|javascript|fluash)$ {

                expires 24h;

        }

        location /error {

        root /usr/local/nginx/logs/error;

        }

 

    }

注意每一個server是一個.conf的文件

upstream.conf文件:

upstream web {

server 192.168.254.253 weight=1 max_fails=2 fail_timeout=10s ;

server 192.168.254.252 weight=1 max_fails=2 fail_timeout=10s ;

server 192.168.254.251 weight=1 max_fails=2 fail_timeout=10s ;

}

相關文章
相關標籤/搜索