Nginx的geo模塊不只能夠有限速白名單的做用,還能夠作全局負載均衡,能夠要根據客戶端ip訪問到不一樣的server。好比,能夠將電信的用戶訪問定向到電信服務器,網通的用戶重 定向到網通服務器」,從而實現智能DNS的做用。前面介紹過nginx域名訪問的白名單配置梳理,下面對nginx的geo模塊使用作一梳理(參考Geo模塊-Nginx中文文檔)php
geo指令是經過ngx_http_geo_module模塊提供的。默認狀況下,nginx安裝時是會自動加載這個模塊,除非安裝時人爲的手動添加--without-http_geo_module。 ngx_http_geo_module模塊能夠用來建立變量,其值依賴於客戶端IP地址。 geo指令 語法: geo [$address] $variable { ... } 默認值: — 配置段: http 定義從指定的變量獲取客戶端的IP地址。默認狀況下,nginx從$remote_addr變量取得客戶端IP地址,但也能夠從其餘變量得到。 例如: geo $remote_addr $geo { default 0; 127.0.0.1 1; } geo $arg_ttlsa_com $geo { default 0; 127.0.0.1 1; } 若是該變量的值不能表明一個合法的IP地址,那麼nginx將使用地址"255.255.255.255"。 nginx經過CIDR或者地址段來描述地址,支持下面幾個參數: 1)delete:刪除指定的網絡 2)default:若是客戶端地址不能匹配任意一個定義的地址,nginx將使用此值。 若是使用CIDR,能夠用"0.0.0.0/0"代替default。 3)include: 包含一個定義地址和值的文件,能夠包含多個。 4)proxy:定義可信地址。 若是請求來自可信地址,nginx將使用其「X-Forwarded-For」頭來得到地址。 相對於普通地址,可信地址是順序檢測的。 5)proxy_recursive:開啓遞歸查找地址。 若是關閉遞歸查找,在客戶端地址與某個可信地址匹配時,nginx將使用"X-Forwarded-For"中的最後一個地址來代替原始客戶端地址。若是開啓遞歸查找,在客戶端地址與某個可信地址匹配時,nginx將使用"X-Forwarded-For"中最後一個與全部可信地址都不匹配的地址來代替原始客戶端地址。 6)ranges:使用以地址段的形式定義地址,這個參數必須放在首位。爲了加速裝載地址庫,地址應按升序定義。 geo $country { default ZZ; include conf/geo.conf; delete 127.0.0.0/16; proxy 192.168.100.0/24; proxy 2001:0db8::/32; 127.0.0.0/24 US; 127.0.0.1/32 RU; 10.1.0.0/16 RU; 192.168.1.0/24 UK; } # vim conf/geo.conf //編輯conf/geo.cong文件 10.2.0.0/16 RU; 192.168.2.0/24 RU; 地址段例子: geo $country { ranges; default ZZ; 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; } geo指令主要是根據IP來對變量進行賦值的。所以geo塊下只能定義IP或網絡段,不然會報錯。
====================nginx利用geo模塊作限速白名單操做======================html
nginx的限速白名單須要結合geo和map指令來實現,map指令使用ngx_http_map_module模塊提供的。默認狀況下,nginx安裝時是會自動加載這個模塊,除非安裝時人爲手動添加--without-http_map_module。 ngx_http_map_module模塊能夠建立變量,這些變量的值與另外的變量值相關聯。容許分類或者同時映射多個值到多個不一樣值並儲存到一個變量中,map指令用來建立變量,可是僅在變量被接受的時候執行視 圖映射操做,對於處理沒有引用變量的請求時,這個模塊並無性能上的缺失。 配置以下: http { geo $whiteiplist { default 1; 127.0.0.1 0; 192.0.0.0/8 0; 103.20.102.0/24 0; } map $whiteiplist $limit { 1 $binary_remote_addr; 0 ""; } limit_conn_zone $limit zone=limit:10m; server { listen 80; server_name test.huanqiu.com; location ^~ /download/ { limit_conn limit 4; limit_rate 200k; alias /data/www.huanqiu.com/data/download/; } } } ------------------------以下是一個nginx中geo限速白名單的配置實例-------------------------- [root@localhost ~]# cat /usr/local/nginx/conf/vhosts/wangshibo.conf geo $whiteiplist { default 1; 127.0.0.1 0; 192.168.0.0/16 0; 58.68.230.0/24 0; } map $whiteiplist $limit { 1 $binary_remote_addr; 0 ""; } limit_conn_zone $limit zone=limit:10m; server { listen 80; server_name dev.wangshibo.com wangshibo.com *.wangshibo.com; access_log /usr/local/nginx/logs/8080-access.log main; error_log /usr/local/nginx/logs/8080-error.log; location ~ / { root /var/www/html/8080; index index.html index.php index.htm; } location ^~ /download/ { limit_conn limit 4; //最大的併發鏈接數 limit_rate 200k; //每一個鏈接的帶寬 alias /data/wangshibo/download/; } } 配置要點解釋: 1)geo指令定義一個白名單$whiteiplist, 默認值爲1, 全部都受限制。 若是客戶端IP與白名單列出的IP相匹配,則$whiteiplist值爲0也就是不受限制。 2)map指令是將$whiteiplist值爲1的,也就是受限制的IP,映射爲客戶端IP。將$whiteiplist值爲0的,也就是白名單IP,映射爲空的字符串。 3)limit_conn_zone和limit_req_zone指令對於鍵爲空值的將會被忽略,從而實現對於列出來的IP不作限制。 測試方法 [root@localhost vhosts]# ab -c 100 -n 300 http://dev.wangshibo.com/download/docs/pdf/kevingarce.pdf
==============Nginx利用geo模塊作負載均衡的操做記錄===============nginx
本次測試的機器ip信息以下: server1: 113.110.86.28 server2: 113.110.86.25 server3: 188.84.155.239 客戶端1:113.110.86.23 客戶端2:113.110.86.51 客戶端3:113.110.86.19 三臺server機器上都部署了nginx環境,爲了測試效果,特地配置了server1和server2的9090端口的首頁,以下: [root@localhost ~]# curl http://113.110.86.28:9090 this is server1:113.110.86.28 [root@localhost ~]# curl http://113.110.86.25:9090 this is server2:113.110.86.25 配置server3,在server3上實現利用geo模塊作負載均衡的目的,server3的nginx配置以下: [root@localhost vhosts]# cat test.conf geo $geo { default default; 113.110.86.19/32 uk; 113.110.86.51/32 us; } #這裏我是單網測試,因此掩碼是32位;若是是vlan,能夠是24位掩碼,好比: # 113.110.86.0/24 tw; upstream uk.server { server 113.110.86.28:9090; } upstream us.server { server 113.110.86.25:9090; } upstream default.server { server 188.84.155.239:9090; } server { listen 80; server_name 188.84.155.239; index index.html index.htm; root /var/www/html/80; location / { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://$geo.server$request_uri; } } server { listen 9090; server_name 188.84.155.239; location / { root /var/www/html/9090; index index.html index.htm; } } 訪問server3的9090端口 [root@localhost vhosts]# curl http://188.84.155.239:9090 this is server3:188.84.155.239 ------------------------接下來就開始測試------------------------- 1)在客戶端1上訪問http://188.84.155.239,以下: [root@localhost ~]# curl http://188.84.155.239 this is server3:188.84.155.239 由於客戶端1的IP地址爲113.110.86.23,按照上面server3中nginx的配置,它訪問的很明顯是server3的9090端口! 2)在客戶端2上訪問http://188.84.155.239,以下: [root@localhost ~]# curl http://188.84.155.239 this is server2:113.110.86.25 按照server3的nginx配置,客戶端2訪問server3的80端口就會被負載到server2的9090端口上! 3)在客戶端3上訪問http://188.84.155.239,以下: [root@jenkins-server ~]# curl http://188.84.155.239 this is server1:113.110.86.28 按照server3的nginx配置,客戶端3訪問server3的80端口就會被負載到server1的9090端口上! ------------------------------------------------------------ 經過上面的測試,很明顯能看到geo模塊起到了負載均衡的做用。這樣就能夠把三臺服務器分別放到不一樣的IDC機房。而後在數據同步就能夠了。 這樣作的好處就是省去了在DNS上作手腳,由於智能DNS有時候按照來訪IP解析的時候會解析對方的DNS地址,把它匹配到一臺服務器,若是對方是 網通用戶,它用的電信DNS,會直接把它匹配到電信的服務器。而nginx的geo模塊就是根據來訪問IP來匹配服務器的,這樣只要咱們把各地區的IP段收集起來就能夠了~~