nginx http模塊

官方文檔 http://nginx.org/en/docs/http/ngx_http_core_module.html

中文文檔 http://www.nginx.cn/doc/standard/httpcore.html

翻譯比較詳細中文文檔 http://shouce.jb51.net/nginx/left.html

建議兩個文檔個都看看防止遺漏中文文檔不全

Nginx的HTTP配置主要包括三個區塊,結構如下:

http://shouce.jb51.net/nginx/StandardHTTPModules/HTTPCore.html

location

語法:location [=|~|~*|^~|@] /uri/ { ... } 
默認值:no 
使用字段:server 
這個參數根據URI的不同需求來進行配置,可以使用字符串與正則表達式匹配,如果要使用正則表達式,你必須指定下列前綴:
1、~* 不區分大小寫。
2、~ 區分大小寫。
要確定該指令匹配特定的查詢,程序將首先對字符串進行匹配,字符串匹配將作爲查詢的開始,最確切的匹配將被使用。然後,正則表達式的匹配查詢開始,匹配查詢的第一個正則表達式找到後會停止搜索,如果沒有找到正則表達式,將使用字符串的搜索結果。
在一些操作系統,如Mac OS X和Cygwin,字符串將通過不區分大小寫的方式完成匹配(0.7.7),但是,比較僅限於單字節的語言環境。
正則表達式可以包含捕獲(0.7.40),並用於其它指令中。
可以使用“^~”標記禁止在字符串匹配後檢查正則表達式,如果最確切的匹配location有這個標記,那麼正則表達式不會被檢查。
使用“=”標記可以在URI和location之間定義精確的匹配,在精確匹配完成後並不進行額外的搜索,例如有請求“/”發生,則可以使用“location = /”來加速這個處理。
即使沒有“=”和“^~”標記,精確的匹配location在找到後同樣會停止查詢。
下面是各種查詢方式的總結:
1、前綴“=”表示精確匹配查詢,如果找到,立即停止查詢。
2、指令仍然使用標準字符串,如果匹配使用“^~”前綴,停止查詢。
3、正則表達式按照他們在配置文件中定義的順序。
4、如果第三條產生一個匹配,這個匹配將被使用,否則將使用第二條的匹配。
例:

location = / { # 只匹配 / 的查詢. [ configuration A ] }

location / { # 匹配任何以 / 開始的查詢,但是正則表達式與一些較長的字符串將被首先匹配。 [ configuration B ] }

location ^~ /images/ { # 匹配任何以 /images/ 開始的查詢並且停止搜索,不檢查正則表達式。 [ configuration C ] }

location ~* \.(gif|jpg|jpeg)$ { # 匹配任何以gif, jpg, or jpeg結尾的文件,但是所有 /images/ 目錄的請求將在Configuration C中處理。 [ configuration D ] }

各請求的處理如下例:
·/ -> configuration A 
·/documents/document.html -> configuration B 
·/images/1.gif -> configuration C 
·/documents/1.jpg -> configuration D 
注意你可以以任何順序定義這4個配置並且匹配結果是相同的,但當使用嵌套的location結構時可能會將配置文件變的複雜並且產生一些比較意外的結果。
標記“@”指定一個命名的location,這種location並不會在正常請求中執行,它們僅使用在內部重定向請求中。(查看error_pagetry_files

例如:

1:沒有修飾符 表示:必須以指定模式開始,如:
server {
server_name xxxx.com;
location /abc {
……
}
}
那麼,如下是對的:
http://xxxx.com/abc
http://xxxx.com/abc?p=1
http://xxxx.com/abc/
http://xxxx.com/abcde

2:= 表示:必須與指定的模式精確匹配,如:
server {
server_name xxxx.com;
location = /abc {
……
}
}
那麼,如下是對的:
http://xxxx.com/abc
http://xxxx.com/abc?p=1
如下是錯的:
http://xxxx.com/abc/
http://xxxx.com/abcde
3:~ 表示:指定的正則表達式要區分大小寫,如:
server {
server_name xxxx.com;
location ~ ^/abc$ {
……
}
}
那麼,如下是對的:
http://xxxx.com/abc
http://xxxx.com/abc?p=1
如下是錯的:
http://xxxx.com/ABC
http://xxxx.com/abc/
http://xxxx.com/abcde

4:~* 表示:指定的正則表達式不區分大小寫,如:
server {
server_name xxxx.com;
location ~* ^/abc$ {
……
}
}
那麼,如下是對的:
http://xxxx.com/abc
http://xxxx.com/ABC
http://xxxx.com/abc?p=1
如下是錯的:
http://xxxx.com/abc/
http://xxxx.com/abcde

5:^~ 類似於無修飾符的行爲,也是以指定模式開始,不同的是,如果模式匹配, 那麼就停止搜索其他模式了。

6:@ :定義命名location區段,這些區段客戶段不能訪問,只可以由內部產生的請 求來訪問,如try_files或error_page等

查找順序和優先級

1:帶有“=“的精確匹配優先

2:沒有修飾符的精確匹配

3:正則表達式按照他們在配置文件中定義的順序

4:帶有“^~”修飾符的,開頭匹配

5:帶有“~” 或“~*” 修飾符的,如果正則表達式與URI匹配

6:沒有修飾符的,如果指定字符串與URI開頭匹配

HTTP代理模塊

httpProxy中文文檔 http://shouce.jb51.net/nginx/StandardHTTPModules/HTTPProxy.html

http://www.nginx.cn/doc/standard/httpproxy.html

httpProxy官方文檔 http://nginx.org/en/docs/http/ngx_http_proxy_module.html

Nginx通常被用作後端服務器的反向代理,這樣就可以很方便的實現動靜分離, 以及負載均衡,從而大大提高服務器的處理能力。 http Proxy模塊,功能很多,最常用的是proxy_pass

Nginx實現動靜分離(location),其實就是在反向代理的時候,如果是靜態資源,那麼就直 接從Nginx發佈的路徑去讀取,而不需要從後臺服務器獲取了。

但是要注意:這種情況下需要保證後端跟前端的程序保持一致,可以使用Rsync 做服務端自動同步或者使用NFS、MFS分佈式共享存儲。

HTTP負載均衡模塊

中文文檔http://shouce.jb51.net/nginx/StandardHTTPModules/HTTPUpstream.html

http://www.nginx.cn/doc/standard/httpupstream.html

官方文檔 http://nginx.org/en/docs/http/ngx_http_upstream_module.html

server

語法:server name [parameters] 
默認值:none 
使用字段:upstream 
指定後端服務器的名稱和一些參數,可以使用域名,IP,端口,或者unix socket。如果指定爲域名,則首先將其解析爲IP。
·weight = NUMBER - 設置服務器權重,默認爲1。
·max_fails = NUMBER - 在一定時間內(這個時間在fail_timeout參數中設置)檢查這個服務器是否可用時產生的最多失敗請求數,默認爲1,將其設置爲0可以關閉檢查,這些錯誤在proxy_next_upstream或fastcgi_next_upstream(404錯誤不會使max_fails增加)中定義。
·fail_timeout = TIME - 在這個時間內產生了max_fails所設置大小的失敗嘗試連接請求後這個服務器可能不可用,同樣它指定了服務器不可用的時間(在下一次嘗試連接請求發起之前),默認爲10秒,fail_timeout與前端響應時間沒有直接關係,不過可以使用proxy_connect_timeout和proxy_read_timeout來控制。
·down - 標記服務器處於離線狀態,通常和ip_hash一起使用。
·backup - (0.6.7或更高)如果所有的非備份服務器都宕機或繁忙,則使用本服務器(無法和ip_hash指令搭配使用)。
示例配置

upstream  backend  {
  server   backend1.example.com    weight=5;
  server   127.0.0.1:8080          max_fails=3  fail_timeout=30s;
  server   unix:/tmp/backend3;
}

注意:如果你只使用一臺上游服務器,nginx將設置一個內置變量爲1,即max_fails和fail_timeout參數不會被處理。
結果:如果nginx不能連接到上游,請求將丟失。
解決:使用多臺上游服務器。

upstream

語法:upstream name { ... } 
默認值:none 
使用字段:http 
這個字段設置一羣服務器,可以將這個字段放在proxy_pass和fastcgi_pass指令中作爲一個單獨的實體,它們可以可以是監聽不同端口的服務器,並且也可以是同時監聽TCP和Unix socket的服務器。
服務器可以指定不同的權重,默認爲1。
示例配置

upstream backend {
  server backend1.example.com weight=5;
  server 127.0.0.1:8080       max_fails=3  fail_timeout=30s;
  server unix:/tmp/backend3;
}

請求將按照輪詢的方式分發到後端服務器,但同時也會考慮權重。
在上面的例子中如果每次發生7個請求,5個請求將被髮送到backend1.example.com,其他兩臺將分別得到一個請求,如果有一臺服務器不可用,那麼請求將被轉發到下一臺服務器,直到所有的服務器檢查都通過。如果所有的服務器都無法通過檢查,那麼將返回給客戶端最後一臺工作的服務器產生的結果。

負載均衡算法

 

ll+weight 默認的負載算法:

 

ip_hash : 基於Hash 計算

應用場景:保持session 一至性

url_hash: (第三方)

應用場景:靜態資源緩存,節約存儲,加快速度

least_conn 最少鏈接

least_time 最小的響應時間,計算節點平均響應時間,然後取響應最快的那個,分配更高權重。

ip_hash

語法:ip_hash 
默認值:none 
使用字段:upstream 
這個指令將基於客戶端連接的IP地址來分發請求。
哈希的關鍵字是客戶端的C類網絡地址,這個功能將保證這個客戶端請求總是被轉發到一臺服務器上,但是如果這臺服務器不可用,那麼請求將轉發到另外的服務器上,這將保證某個客戶端有很大概率總是連接到一臺服務器。
無法將權重(weight)與ip_hash聯合使用來分發連接。如果有某臺服務器不可用,你必須標記其爲“down”,如下例:

upstream backend {
  ip_hash;
  server   backend1.example.com;
  server   backend2.example.com;
  server   backend3.example.com  down;
  server   backend4.example.com;
}

請注意:這個方法本質還是輪詢,而且由於客戶端的ip可能是不斷變化的,比如動 態ip,代理,翻牆等等,因此ip_hash並不能完全保證同一個客戶端總是由同一 個服務器來處理。

Geo和GeoIP模塊

geo

語法:geo [$ip_variable] $variable { ... } 
默認值:none 
使用字段:http 
這個指令指定了一個客戶端IP的所屬國家,默認情況下它會查找$remote_addr變量,但在0.7.27版本以後可以手工指定。

 geo  $arg_remote_addr $geo {
   ...;
 }

使用CIDR地址格式,另外,有4個特殊的參數:

·delete - 刪除指定的網絡(0.7.23)
·default - 將一些沒有定義的地址替換爲0.0.0.0/0。
·include - 具有地址信息的文本文件,可以包含多個。
·proxy - 指定代理服務器地址(0.8.7)。
·ranges - 指定使用以地址池的形式定義地址(0.7.23),這個參數必須放在首位。

 

 geo  $country  {
   default          no;
   include          conf/geo.conf;
   127.0.0.0/24     us;
   127.0.0.1/32     ru;
   10.1.0.0/16      ru;
   192.168.1.0/24   uk;
 }

conf/geo.conf文件內容:

 10.2.0.0/16      ru;
 192.168.2.0/24   ru;

該值將使用最大的參數,例如127.0.0.1將爲“ru”,而不是“us”。
一個使用ranges的例子:

 geo  $country  {
   ranges;
   default                    no; 
   127.0.0.0-127.0.0.0        us;
   127.0.0.1-127.0.0.1        ru;
   127.0.0.1-127.0.0.255      us;
   10.1.0.0-10.1.255.255      ru;
   192.168.1.0-192.168.1.255  uk; 
 }

http{
    geo $geo{
        default default;
        202.103.10.1/24 A;
        179.9.0.3/24 B; 
    }
    upstream default.server{
        server 192.168.0.100; 
    }
    upstream A.server{
        server 192.168.0.101;
     }
    upstream B.server{
        server 192.168.0.102;
    }
    server{
        listen 80;
        location / {
            proxy_pass http://$geo.server$request_uri;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章