lvs調度算法和nginx常用模塊

1、簡述LVS調度方案及應用場景
2、詳細描述nginx模塊并舉例說明

1、簡述LVS調度方案及應用場景

lvs的調度算法:

靜態方法:僅根據算法本身進行調度;
    RR:roundrobin,輪詢;
    WRR:Weighted RR,加權輪詢;
    SH:Source Hashing,實現session sticky,源IP地址hash;將來自于同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話綁定;
    DH:Destination Hashing;目標地址哈希,將發往同一個目標地址的請求始終轉發至第一次挑中的RS,典型使用場景是正向代理緩存場景中的負載均衡;

動態方法:主要根據每RS當前的負載狀態及調度算法進行調度;
    Overhead=

    LC:least connections
        Overhead=activeconns*256+inactiveconns
    WLC:Weighted LC
        Overhead=(activeconns*256+inactiveconns)/weight
    SED:Shortest Expection Delay
        Overhead=(activeconns+1)*256/weight
    NQ:Never Queue
    
    LBLC:Locality-Based LC,動態的DH算法;
    LBLCR:LBLC with Replication,帶復制功能的LBLC;

lvs集群的類型:

  • lvs-nat:修改請求報文的目標IP;多目標IP的DNAT;
  • lvs-dr:操縱封裝新的MAC地址;
  • lvs-tun:在原請求IP報文之外新加一個IP首部;
  • lvs-fullnat:修改請求報文的源和目標IP;

lvs-nat:
多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改為某挑出的RS的RIP和PORT實現轉發;

    (1)RIP和DIP必須在同一個IP網絡,且應該使用私網地址;RS的網關要指向DIP;
    (2)請求報文和響應報文都必須經由Director轉發;Director易于成為系統瓶頸;
    (3)支持端口映射,可修改請求報文的目標PORT;
    (4)vs必須是Linux系統,rs可以是任意系統;

lvs-dr:
通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變;

Director和各RS都得配置使用VIP
(1) 確保前端路由器將目標IP為VIP的請求報文發往Director:
    (a) 在前端網關做靜態綁定;
    (b) 在RS上使用arptables;
    (c) 在RS上修改內核參數以限制arp通告及應答級別;
        arp_announce
        arp_ignore
(2) RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網絡;RIP的網關不能指向DIP,以確保響應報文不會經由Director;
(3) RS跟Director要在同一個物理網絡;
(4) 請求報文要經由Director,但響應不能經由Director,而是由RS直接發往Client;
(5) 不支持端口映射;

lvs-tun:
轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而是在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP);

(1) DIP, VIP, RIP都應該是公網地址;
(2) RS的網關不能,也不可能指向DIP;
(3) 請求報文要經由Director,但響應不能經由Director;
(4) 不支持端口映射;
(5) RS的OS得支持隧道功能;

lvs-fullnat:
通過同時修改請求報文的源IP地址和目標IP地址進行轉發;

(1) VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網絡;因此,RIP的網關一般不會指向DIP;
(2) RS收到的請求報文源地址是DIP,因此,只能響應給DIP;但Director還要將其發往Client;
(3) 請求和響應報文都經由Director;
(4) 支持端口映射;

注意:此類型默認不支持;

總結:

lvs-nat, lvs-fullnat:請求和響應報文都經由Director;
    lvs-nat:RIP的網關要指向DIP;
    lvs-fullnat:RIP和DIP未必在同一IP網絡,但要能通信;
lvs-dr, lvs-tun:請求報文要經由Director,但響應報文由RS直接發往Client;
    lvs-dr:通過封裝新的MAC首部實現,通過MAC網絡轉發;
    lvs-tun:通過在原IP報文之外封裝新的IP首部實現轉發,支持遠距離通信;

2、詳細描述nginx模塊并舉例說明

1、ngx_http_access_module模塊:
實現基于ip的訪問控制功能

        location / {
        allow 192.168.31.204/32;
        deny all;
        }

結果:

curl http://192.168.31.200
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>

curl http://192.168.31.200
<h1>The node1 Server</h1>

2、ngx_http_auth_basic_module模塊
實現基于用戶的訪問控制,使用basic機制進行用戶認證;
注意:htpasswd命令由httpd-tools所提供;
語法:

  • auth_basic string | off;設置為off可以不繼承上一級的basic配置
  • auth_basic_user_file file;指定保存用戶名密碼的文件

步驟:
創建用戶密碼文件,注意第一次創建加上-c以后就不需要加了,否則會覆蓋原來的文件。
方法1、htpasswd -cb /etc/nginx/conf.d/.htpasswd lvqing 123456
方法2、echo "lvqing:$(openssl passwd -crypt 123456)" >> /etc/nginx/conf.d/.htpasswd
再在配置文件中添加

location / {
    auth_basic           "admin passwd";
    auth_basic_user_file passwd/.htpasswd;
}

3、ngx_http_stub_status_module模塊
用于輸出nginx的基本狀態信息;
直接在配置文件中添加

location  /basic_status {
        stub_status;
}

結果:

curl http://192.168.31.200/basic_status
Active connections: 1
server accepts handled requests
 24 24 24
Reading: 0 Writing: 1 Waiting: 0

Active connections:當前狀態,活動狀態的連接數
accepts:統計總值,已經接受的客戶端請求的總數
handled:統計總值,已經處理完成的客戶端請求的總數
requests:統計總值,客戶端發來的總的請求數
Reading:當前狀態,正在讀取客戶端請求報文首部的連接的連接數
Writing:當前狀態,正在向客戶端發送響應報文過程中的連接數
Waiting:當前狀態,正在等待客戶端發出請求的空閑連接數

4、ngx_http_log_module模塊
用指定的格式寫入請求日志
語法:
log_format name string ...; string可以使用nginx核心模塊及其它模塊內嵌的變量;

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];訪問日志文件路徑

  • access_log off;
  • buffer=size:緩沖大小
  • flush=time :日志滾動的時間

open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;緩存日志文件的元數據

  • max:緩存的最大文件描述符數量;
  • min_uses:在inactive指定的時長內訪問大于等于此值方可被當作活動項;
  • inactive:非活動時長;
  • valid:驗正緩存中各緩存項是否為活動項的時間間隔;

示例:

'$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$gzip_ratio" "$http_x_forwarded_for"';

access_log  /var/log/nginx/logtest/nginx-access.log compression buffer=32k;

結果:

tail /var/log/nginx/logtest/nginx-access.log
192.168.31.204-lvqing[30/Dec/2018:11:59:41 +0800] "GET / HTTP/1.1" 200 262 "-" "curl/7.29.0" "-"
192.168.31.204-lvqing[30/Dec/2018:11:59:41 +0800] "GET / HTTP/1.1" 200 262 "-" "curl/7.29.0" "-"
192.168.31.205--[30/Dec/2018:11:59:01 +0800] "GET / HTTP/1.1" 200 262 "-" "curl/7.29.0" "-"
192.168.31.204-lvqing[30/Dec/2018:11:59:38 +0800] "GET / HTTP/1.1" 200 262 "-" "curl/7.29.0" "-"
192.168.31.204-lvqing[30/Dec/2018:11:59:39 +0800] "GET / HTTP/1.1" 200 262 "-" "curl/7.29.0" "-"
192.168.31.205--[30/Dec/2018:12:00:27 +0800] "GET / HTTP/1.1" 200 262 "-" "curl/7.29.0" "-"
192.168.31.205--[30/Dec/2018:12:00:27 +0800] "GET / HTTP/1.1" 200 262 "-" "curl/7.29.0" "-"
192.168.31.205--[30/Dec/2018:12:00:28 +0800] "GET / HTTP/1.1" 200 262 "-" "curl/7.29.0" "-"
192.168.31.205--[30/Dec/2018:11:58:59 +0800] "GET / HTTP/1.1" 200 262 "-" "curl/7.29.0" "-"
192.168.31.204-lvqing[30/Dec/2018:11:59:40 +0800] "GET / HTTP/1.1" 200 262 "-" "curl/7.29.0" "-"

5、ngx_http_gzip_module模塊
用gzip算法來壓縮數據可以節約帶寬,默認nginx不壓縮數據,但是壓縮會消耗CPU資源,且壓縮文本圖像類效果較好,能達到30%左右,但壓縮音頻視頻沒有多大意義,因為本身音視頻就是被壓縮過的,很可能對音視頻壓縮反而會增大其體積。
語法:

1、gzip on | off;
        Enables or disables gzipping of responses.
                        
2、gzip_comp_level level;
        Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9.
                        
3、  gzip_disable regex ...;
        Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions.
                        
4、  gzip_min_length length;
        啟用壓縮功能的響應報文大小閾值; 
                        
5、gzip_buffers number size;
        支持實現壓縮功能時為其配置的緩沖區數量及每個緩存區的大?。?                        
6、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
        nginx作為代理服務器接收到從被代理服務器發送的響應報文后,在何種條件下啟用壓縮功能的;
            off:對代理的請求不啟用
            no-cache, no-store,private:表示從被代理服務器收到的響應報文首部的Cache-Control的值為此三者中任何一個,則啟用壓縮功能;
                            
7、gzip_types mime-type ...;
        壓縮過濾器,僅對此處設定的MIME類型的內容啟用壓縮功能;

配置示例:

gzip  on;
gzip_comp_level 6;
gzip_min_length 64;
gzip_proxied any;
gzip_types text/xml text/css  application/javascript;   

結果:


文本數據原來大小是465B壓縮后只有180B
而圖像壓縮比例更驚人

6、ngx_http_ssl_module模塊
啟用https時使用的模塊
語法:

1、ssl on | off;
    Enables the HTTPS protocol for the given virtual server.
                        
2、ssl_certificate file;
    當前虛擬主機使用PEM格式的證書文件;
                        
3、ssl_certificate_key file;
    當前虛擬主機上與其證書匹配的私鑰文件;
                        
4、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
    支持ssl協議版本,默認為后三個;
                        
5、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
    builtin[:size]:使用OpenSSL內建的緩存,此緩存為每worker進程私有;
    [shared:name:size]:在各worker之間使用一個共享的緩存;
                        
6、ssl_session_timeout time;
    客戶端一側的連接可以復用ssl session cache中緩存 的ssl參數的有效時長;

當然因為用到了ssl所以也需要CA服務器,可以將nginx服務器自己作CA簽發證書給自己和客戶端。
配置示例:

server{
        listen 443 ssl;
        server_name node1.lvqing.com;
        root /var/nginx/www/;
        access_log /var/log/nginx/ngx_ssl_access.log main;

        ssl on;
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;
        ssl_protocols sslv3 tlsv1 tlsv1.1 tlsv1.2;
        ssl_session_cache shared:SSL:10m; #打開會話緩存
}

7、ngx_http_rewrite_module模塊
重定向模塊,可以將客戶端的請求基于regex所描述的模式進行檢查,而后完成替換。當舊的業務和新的業務不一樣,網站更名了,就可以使用此模塊。將訪問舊的請求重定向成新的。
語法:

1、rewrite regex replacement [flag]
    將用戶請求的URI基于regex所描述的模式進行檢查,匹配到時將其替換為replacement指定的新的URI;
    
    注意:如果在同一級配置塊中存在多個rewrite規則,那么會自上而下逐個檢查;被某條件規則替換完成后,會重新一輪的替換檢查,因此,隱含有循環機制;[flag]所表示的標志位用于控制此循環機制,但不超過10次;如果超過,會給客戶端一個500響應碼;
  redirect:臨時重定向,重寫完成后以臨時重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發起請求;不能以http://或https://開頭,使用相對路徑,狀態碼:302
  replacement:永久重定向是以http://或https://開頭,則替換結果會直接以重向返回給客戶端,狀態碼 :301

    [flag]:
        last:重寫完成后停止對當前URI在當前location中后續的其它重寫操作,而后對新的URI啟動新一輪重寫檢查;提前重啟新一輪循環; 
        break:重寫完成后停止對當前URI在當前location中后續的其它重寫操作,而后直接跳轉至重寫規則配置塊之后的其它配置;結束循環;
          last 和break是在服務器內部操作的,客戶端不知道,客戶端訪問的url不會發生變化。但是服務器端會返回替換過的新的內容。
        redirect:重寫完成后以臨時重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發起請求;不能以http://或https://開頭;
        permanent:重寫完成后以永久重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發起請求;
          redirect和permanent是服務器端給客戶端發一個301或者302的請求,客戶端需要重新發起請求,因此最終客戶端看到的瀏覽器是url和原始的url是不一樣的,url會被轉換新指定的。
2、return
    return code [text];
    return code URL;
    return URL;
    
    停止處理并將指定的代碼返回給客戶端。 
    
3、  rewrite_log on | off;
    是否開啟重寫日志;
    
4、  if (condition) { ... }
    引入一個新的配置上下文 ;條件滿足時,執行配置塊中的配置指令;server, location;
    
    condition:
        比較操作符:
            ==
            !=
            ~:模式匹配,區分字符大小寫;
            ~*:模式匹配,不區分字符大小寫;
            !~:模式不匹配,區分字符大小寫;
            !~*:模式不匹配,不區分字符大小寫;
        文件及目錄存在性判斷:
            -e, !-e
            -f, !-f
            -d, !-d
            -x, !-x
            
5、set $variable value;
    用戶自定義變量 ;

示例:

rewrite /(.*)\.png$/$1.jpg;

將所有請求以png結尾的重定向以jpg結尾的

8、ngx_http_referer_module模塊
可以跟蹤鏈接從哪里跳轉過來的,該字段可以用來防止盜鏈
語法:

valid_referers none | blocked | server_names | string ...;
    定義referer首部的合法可用值;
                    
        none:請求報文首部沒有referer首部;
        blocked:請求報文的referer首部沒有值;
        server_names:參數,其可以有值作為主機名或主機名模式;
        arbitrary_string:直接字符串,但可使用*作通配符;
        regular expression:被指定的正則表達式模式匹配到的字符串;要使用~打頭,例如 ~.*\.lvqing\.com;

示例:

 valid_referers none block server_names *.lvqing.com *.lvqing.com *.lvqing.* ~.*\.lvqing\.com;
        if($invalid_referer) {
                return http://node1.lvqing.com/background.jpg;
        }
#定義如果出現無效的referer將返回code 403
#只用從匹配到的地址跳轉過來的請求才允許訪問return的地址

nginx的代理功能所使用到的模塊

9、ngx_http_headers_module模塊
向由代理服務器響應給客戶端的響應報文添加自定義首部,或修改指定首部的值
語法:

1、add_header name value [always];
    添加自定義首部;
    
    add_header X-Via  $server_addr;
    add_header X-Accel $server_name;
    
2、expires [modified] time;
    expires epoch | max | off;
    
    用于定義Expire或Cache-Control首部的值;

示例:

add_header proxy_name lvqing_proxy;
add_header lvqing_X-Via  $server_addr;
add_header lvqing_X-Accel  $server_name;

image.png

10、ngx_http_proxy_module模塊
這個沒什么好說的,沒這個nginx就無法代理轉發請求
語法:

1、proxy_pass URL;
    Context:    location, if in location, limit_except
    
    注意:proxy_pass后面的路徑不帶uri時,其會將location的uri傳遞給后端主機;
        
        server {
            ...
            server_name HOSTNAME;
            location /uri/ {
                proxy_pass  http://hos[:port];
            }
            ...
        }
        
        http://HOSTNAME/uri --> http://host/uri 
        
    proxy_pass后面的路徑是一個uri時,其會將location的uri替換為proxy_pass的uri;
        
        server {
            ...
            server_name HOSTNAME;
            location /uri/ {
                proxy_pass http://host/new_uri/;
            }
            ...
        }
        
        http://HOSTNAME/uri/ --> http://host/new_uri/
        
    如果location定義其uri時使用了正則表達式的模式,或在if語句或limt_execept中使用proxy_pass指令,
則proxy_pass之后必須不能使用uri; 用戶請求時傳遞的uri將直接附加代理到的服務的之后;
    
        server {
            ...
            server_name HOSTNAME;
            location ~|~* /uri/ {
                proxy http://host;
            }
            ...
        }
        
        http://HOSTNAME/uri/ --> http://host/uri/;
        
2、proxy_set_header field value;
    設定發往后端主機的請求報文的請求首部的值;Context:   http, server, location
       proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        $proxy_add_x_forwarded_for:經過了哪些主機的代理使用,隔開
        $remote_addr:代表了客戶端的IP,可能是最后一個代理服務器的地址

3、proxy_cache_path
    定義可用于proxy功能的緩存;Context:    http            
    
    proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] 
[loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
    

4、proxy_cache zone | off;
    指明要調用的緩存,或關閉緩存機制;Context:   http, server, location
    
5、  proxy_cache_key string;
    緩存中用于“鍵”的內容;
    
    默認值:proxy_cache_key $scheme$proxy_host$request_uri;
    
6、proxy_cache_valid [code ...] time;
    定義對特定響應碼的響應內容的緩存時長;
    
    定義在http{...}中;
    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;
    
    定義在需要調用緩存功能的配置段,例如server{...}或location{....};
    proxy_cache pxycache;
    proxy_cache_key $request_uri;
    proxy_cache_valid 200 302 301 1h;    定義不同類的內容緩存多長時間
    proxy_cache_valid any 1m;
    
7、proxy_cache_use_stale
    
    proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
    
    Determines in which cases a stale cached response can be used when an error occurs during communication with the proxied server.
    
8、proxy_cache_methods GET | HEAD | POST ...;
    If the client request method is listed in this directive then the response will be cached. 
“GET” and “HEAD” methods are always added to the list, though it is recommended to specify them explicitly. 
    
9、proxy_hide_header field;
    By default, nginx does not pass the header fields “Date”, “Server”, “X-Pad”, and “X-Accel-...” 
from the response of a proxied server to a client. The proxy_hide_header directive sets additional fields that will not be passed.
    
10、proxy_connect_timeout time;
    Defines a timeout for establishing a connection with a proxied server. It should be noted that this timeout cannot usually exceed 75 seconds.
    建立鏈接服務器端超時
    默認為60s;最長為75s;
    
11、proxy_read_timeout time; 
    Defines a timeout for reading a response from the proxied server. The timeout is set only between two successive read operations, not for the transmission of the whole response.
    接收服務端響應超時
12、proxy_send_timeout time;
    Sets a timeout for transmitting a request to the proxied server. he timeout is set only between two successive write operations, 
not for the transmission of the whole request. If the proxied server does not receive anything within this time, the connection is closed.
    向服務端發請求超時           

示例:
所有發給node1以php結尾的請求都代理給后端的node2服務器,同時調用緩存pxycache,以proxy_host和request_uri做cache的建

proxy.conf
server{
        server_name node1.lvqing.com;
        location / {
        root /var/nginx/www/;
        }
        location ~* \.php$ {
                proxy_cache pxycache;
                proxy_cache_key $proxy_host$request_uri;
                proxy_pass http://node2.lvqing.com;
        }
}

nginx.conf
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;

同時在node2的默認目錄下創建一個php測試文件
index.php
<h1>node2 Server</h2>
<?php
        phpinfo()
?>

結果:
成功代理到node2上

[root@node1 bak]# curl http://node1.lvqing.com/index.php
<h1>node2 Server</h2>
<?php
        phpinfo()
?>

11、ngx_http_fastcgi_module
該模塊允許將請求傳遞給FastCGI服務器。可以認為這個模塊提供了nginx與web服務器上的應用交流的接口。有了這個模塊nginx就可以將請求轉發給web服務器上的php或者tomcat等應用程序,形成動態網站。
語法:


1、fastcgi_pass address;
    address為fastcgi server的地址;  location, if in location;
    
        http://www.ilinux.io/admin/index.php --> /admin/index.php (uri)
            /data/application/admin/index.php
                
2、fastcgi_index name;
    fastcgi默認的主頁資源; 
    
3、fastcgi_param parameter value [if_not_empty];
    Sets a parameter that should be passed to the FastCGI server.
 The value can contain text, variables, and their combination.
    
        
4、fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] 
[loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

    定義fastcgi的緩存;緩存位置為磁盤上的文件系統,由path所指定路徑來定義;
    
        levels=levels:緩存目錄的層級數量,以及每一級的目錄數量;levels=ONE:TWO:THREE
            leves=1:2:2
        keys_zone=name:size
            k/v映射的內存空間的名稱及大小
        inactive=time
            非活動時長
        max_size=size
            磁盤上用于緩存數據的緩存空間上限

        
5、fastcgi_cache zone | off;
    調用指定的緩存空間來緩存數據;http, server, location
    
6、fastcgi_cache_key string;
    定義用作緩存項的key的字符串;
    
7、fastcgi_cache_methods GET | HEAD | POST ...;
    為哪些請求方法使用緩存;
    
8、fastcgi_cache_min_uses number;
    緩存空間中的緩存項在inactive定義的非活動時間內至少要被訪問到此處所指定的次數方可被認作活動項;
    
9、fastcgi_cache_valid [code ...] time;
    不同的響應碼各自的緩存時長;
    
10、fastcgi_keep_conn on | off;
        By default, a FastCGI server will close a connection right after sending the response. However, when this directive is set to the value on, nginx will instruct a FastCGI server to keep connections open.
        默認情況下,FastCGI服務器會在發送響應后立即關閉連接。然而,當這個指令被設置為on時,nginx會指示FastCGI服務器保持連接打開。

示例:
node2配置文件

fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgi:20m inactive=120s;

server{
        server_name node2.lvqing.com;
        location ~* \.php$ {
                root /var/nginx/www;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                #這里的$document_root指的是上面root指定的家目錄,意在解釋這個目錄內的php腳本。
                include        fastcgi_params;
                fastcgi_cache fcgi;
                fastcgi_cache_key $request_uri;
                fastcgi_cache_valid 200 302 10m;
                fastcgi_cache_valid 301 1h;
                fastcgi_cache_valid any 1m;
        }
}

結果


12、ngx_http_upstream_module
將后端的多個服務器定義成服務器組,對代理的請求做基于七層的負載均衡,自帶健康狀態檢測功能,可由proxy_pass,fastcgi_pass,uwsgi_pass,scgi_pass和memcached_pass指令引用的服務器組
負載均衡設備如果要根據真正的應用層內容再選擇服務器,只能先代理最終的服務器和客戶端建立連接(三次握手)后,才能看到客戶端發送的真正應用層內容的報文,然后再根據該報文中的特定字段,再加上負載均衡設備設置的服務器選擇方式,決定最終選擇的內部服務器。負載均衡設備在這種情況下,更類似于一個代理服務器。負載均衡和前端的客戶端以及后端的服務器會分別建立TCP連接。所以從這個技術原理上來看,七層負載均衡明顯的對負載均衡設備的要求更高,處理七層的能力也必然會低于四層模式的部署方式。
語法:

1、upstream name { ... }
    定義后端服務器組,會引入一個新的上下文;Context: http
    
    upstream httpdsrvs {
        server ...
        server...
        ...
    }
    
2、server address [parameters];
    在upstream上下文中server成員,以及相關的參數;Context:  upstream
    
    address的表示格式:
        unix:/PATH/TO/SOME_SOCK_FILE
        IP[:PORT]
        HOSTNAME[:PORT]
        
    parameters:
        weight=number
            權重,默認為1;
        max_fails=number
            失敗嘗試最大次數;超出此處指定的次數時,server將被標記為不可用;
        fail_timeout=time
            設置將服務器標記為不可用狀態的超時時長;
        max_conns
            當前的服務器的最大并發連接數;
        backup
            將服務器標記為“備用”,即所有服務器均不可用時此服務器才啟用;
        down
            標記為“不可用”;
            
3、least_conn;
    最少連接調度算法,當server擁有不同的權重時其為wlc;
    
4、  ip_hash;
    源地址hash調度方法;類似lvs的sh算法,使用了就不能使用backup了
    
5、hash key [consistent];
    基于指定的key的hash表來實現對請求的調度,此處的key可以直接文本、變量或二者的組合;
    
    作用:將請求分類,同一類請求將發往同一個upstream server;
    
    If the consistent parameter is specified the ketama consistent hashing method will be used instead.
        

    示例:
        hash $request_uri consistent;
        這是根據請求的資源進行會話粘性,在代理服務器上都有一張hash表記錄一切
        帶consistent指定一致性哈希自帶虛擬節點,就算后端節點失效了也能重新調度
        hash $remote_addr;
        hash $cookie_name

6、keepalive connections;
    為每個worker進程保留的空閑的長連接數量;
    為服務器端保持長鏈接,不需要一個并發訪問就打開一個套接字端口

7、least_time header | last_byte;
    最短平均響應時長和最少連接;
    header:response_header; 
    last_byte: full_response; 
    
    僅Nginx Plus有效;
    
8、 health_check [parameters];
    定義對后端主機的健康狀態檢測機制;只能用于location上下文;
    
    可用參數:
        interval=time:檢測頻率,默認為每隔5秒鐘;
        fails=number:判斷服務器狀態轉為失敗需要檢測的次數;
        passes=number:判斷服務器狀態轉為成功需要檢測的次數;
        uri=uri:判斷其健康與否時使用的uri;
        match=name:基于指定的match來衡量檢測結果的成??;
        port=number:使用獨立的端口進行檢測;
        
    僅Nginx Plus有效;
        
9、 match name { ... }
    Defines the named test set used to verify responses to health check requests.
    定義衡量某檢測結果是否為成功的衡量機制;
    
    專用指令:
        status:期望的響應碼;
            status CODE
            status ! CODE
            ...
        header:基于響應報文的首部進行判斷
            header HEADER=VALUE
            header HEADER ~ VALUE 
            ...
        body:基于響應報文的內容進行判斷
            body ~ "PATTERN"
            body !~ "PATTERN"
            
    僅Nginx Plus有效;

示例:
在node1代理服務器上定義一個httpdsrvs組,七層負載均衡,基于uri的hash以保存會話粘性

    upstream httpdsrvs{
        hash $request_uri consistent;
        server node2.lvqing.com weight=2;
        server node3.lvqing.com weight=1  max_fails=3 fail_timeout=30s;
    }

    location / {
        proxy_cache pxycache;
        proxy_cache_key $proxy_host$request_uri;
        proxy_pass httpdsrvs;
    }

結果:
因為我們前面基于uri做了會話粘性,相同的請求都會發給后端的同一臺服務器所以這里只有一臺響應。當然如果node2掛掉會自動切換到node3

for i in {1..10};do curl http://node1.lvqing.com;done
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>

如果將上面的 hash $request_uri consistent;去掉會是一下的結果

for i in {1..10};do curl http://node1.lvqing.com;done
<h1>node2 Server</h1>
<h1>node3 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node3 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node3 Server</h1>
<h1>node3 Server</h1>

這是基于7層代理的,效率相對四層來說較低,但我們可以對請求做的操作也更多
13、ngx_stream_core_module
模擬反代基于tcp或udp的服務連接,即工作于傳輸層的反代或調度器,工作在四層的代理。
語法:
負載均衡設備在接收到第一個來自客戶端的SYN 請求時,即通過上述方式選擇一個最佳的服務器,并對報文中目標IP地址進行修改(改為后端服務器IP),直接轉發給該服務器。TCP的連接建立,即三次握手是客戶端和服務器直接建立的,負載均衡設備只是起到一個類似路由器的轉發動作。在某些部署情況下,為保證服務器回包可以正確返回給負載均衡設備,在轉發報文的同時可能還會對報文原來的源地址進行修改。

1、stream { ... }
定義stream相關的服務;Context:main

2、listen
listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] 
[reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
監聽的端口;
    默認為tcp協議;
    udp: 監聽udp協議的端口;

14、ngx_stream_proxy_module
在stream里使用的proxy語句,與stream配套使用
語法:

(1) proxy_pass address;
    Sets the address of a proxied server. The address can be specified as a domain name or IP address, and a port or as a UNIX-domain socket path.
    
(2) proxy_timeout timeout;
    Sets the timeout between two successive read or write operations on client or proxied server connections. If no data is transmitted within this time, the connection is closed.
    默認為10m; 
    
(3) proxy_connect_timeout time;
    Defines a timeout for establishing a connection with a proxied server.  
    設置nginx與被代理的服務器嘗試建立連接的超時時長;默認為60s;

示例:

stream {
    upstream nginxsrvs {
        server 192.168.31.201:80; 
        server 192.168.31.203:80; 
        least_conn;
    }

    server {
        listen 192.168.31.200:8080;
        proxy_pass nginxsrvs;
        proxy_timeout 60s;
        proxy_connect_timeout 10s;
    }
}   

結果:

 for i in {1..10};do curl http://192.168.31.200:8080;done
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node3 Server</h1>
<h1>node3 Server</h1>
<h1>node2 Server</h1>
<h1>node2 Server</h1>
<h1>node3 Server</h1>
<h1>node2 Server</h1>
<h1>node3 Server</h1>
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容

  • 1、詳細描述常見nginx常用模塊和模塊的使用示例2、簡述Linux集群類型、系統擴展方式及調度方法3、簡述lvs...
    N33_LvQing閱讀 970評論 0 0
  • 1.簡介: ? Nginx:engine X ,2002年,開源,商業版? http協議:web服務器(類似于ht...
    尛尛大尹閱讀 1,887評論 0 3
  • 大多數 Nginx 新手都會頻繁遇到這樣一個困惑,那就是當同一個location配置塊使用了多個 Nginx 模塊...
    SkTj閱讀 7,785評論 0 12
  • 詳細描述常見nginx常用模塊和模塊的使用示例 nginx常見的模塊分類: 核心模塊:core moduleNgi...
    dabule閱讀 2,074評論 1 4
  • 詳細描述常見nginx常用模塊和模塊的使用示例 nginx常見的模塊分類: 核心模塊:core moduleNgi...
    家有豬寶_閱讀 963評論 0 0