Nginx之反向代理、日誌格式、集羣、緩存、壓縮、URl 重寫,讀寫分離配置

location的模式匹配按照優先級由低到高有如下四種:php


  Nginx做爲一個優秀的Web服務器,不只在處理靜態內容上比Apache優秀,還常常被用來作反向代理服務器,且支持緩存,URL重寫,自定義格式,讀寫分離等功能,而且支持在TCP/IP第七層實現集羣功能,基於AIO(異步I/O)event_driven(事件驅動)mmap(內存映射)等機制和功能,具備輕量級、高性能、消耗低、特性豐富、配置簡單等特色html


實驗環境:前端

     node1:192.168.139.2node

     node2:192.168.139.4nginx

     node4:192.168.139.8web

     node5:192.168.139.9正則表達式


     node一、node2裝有Nginx,其中node1爲備用,本實驗全部與Nginx相關的配置都在node2進行算法

     node四、node5裝有httpd,主要用來作後端RS_Serverapache


1:location = URI { }花括號在的規則只對當前URI匹配,若是爲目錄只對目錄匹配vim

2:location ^~URI { }不用正則表達式進行逐字符匹配

3:location ~* URI{ }不區分大小寫花括號在的規則對URI進行模式匹配,URI能夠用正則表達式

  location ~ URI { }區分大小寫花括號在的規則對URI進行模式匹配,URI能夠用正則表達式

4:location URI  { }花括號中的規則對URI中全部路徑包括子目錄都匹配


location URI { } 花括號中的規則對URI中全部路徑包括子目錄都匹配

  如 location ~ \.php$ {

                fastcgi_pass 127.0.0.1:9000;

              }

   全部的以.php結尾的URI都有fastcgi轉發到本機的9000端口處理(php監聽在9000端口)


不用模式匹配的location定義

  

     location /forum/ {

                 proxy_pass http://192.168.139.8:8080/bbs/;

              }

    如訪問www.baidu.com/forum/ 則至關於訪問後端的http://192.168.139.8:8080/bbs/


使用模式匹配定義location時,後面的http://路徑只能寫到端口處,不能出現URI

  

 如 location ~* ^/forum {

                 proxy_pass http://192.168.139.8:8080;

             }

  不區分大小寫匹配全部以forum開頭的URI,轉發到 http://192.168.139.8:8080/forum 

  如訪問www.baidu.com/forum至關於訪問http://192.168.139.8:8080/forum


[root@node2 html]# vim /etc/nginx/nginx.conf


  location /forum {

                         proxy_pass http://192.168.139.8/bbs;

        }


[root@node2 html]# service nginx reload

[root@node4 bbs]# vim /var/www/html/bbs/index.html 


<h1>Nginx on Backup</h1>

[root@node4 bbs]# service httpd restart


wKioL1heRD3jSltZAABkxOs_iag817.png

[root@node2 html]# vim /etc/nginx/nginx.conf

        location ~ ^/hehe {

                         proxy_pass http://192.168.139.8;

        }


[root@node2 html]# service nginx reload

[root@node4 bbs]# vim /var/www/html/hehe/index.html 

<h1>This Backup Server</h1>


[root@node4 html]# service httpd restart


wKioL1heSWSCSJtpAABkstVux_s119.png

將全部的請求都轉發到後端192.168.139.8/bbs/

 location /   {

                         proxy_pass http://192.168.139.8/bbs;

        }


經過分析後端server的日誌能夠看到全部的訪問client_ip都是來自node2(node2只是個代理服務器,記錄他的ip不能進行client來源分析)沒有記錄真正的client_ip

[root@node4 bbs]# tail /var/log/httpd/access_log 

192.168.139.4 - - [24/Dec/2016:18:05:59 +0800] "GET /hehe HTTP/1.0" 301 313 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"

192.168.139.4 - - [24/Dec/2016:18:05:59 +0800] "GET /hehe/ HTTP/1.0" 200 28 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"


日誌變量有:

$remote_addr client_ip

$remote_port client_port

$remote_user client_user (基於用戶認證時)

$request_body 請求主題

$request_method 請求方法  #put get post delete options trace connection head

$server_addr server_ip

$server_port server_port

$server_name server_name

$server_protol http1.0/1.1

$uri 請求的真正uri


定義日誌記錄client來源

location ~ ^/hehe {

                         proxy_pass http://192.168.139.8;

                         proxy_set_header X-Real-IP $remote_ddr;

        }


real-ip由前端代理服務器傳過來了,但也要改一下後端server的日誌記錄格式

[root@node4 html]# vim /etc/httpd/conf/httpd.conf

LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

[root@node4 html]# service httpd restart

瀏覽器多訪問幾回 http://192.168.139.4/hehe/ 


[root@node4 html]# tail /var/log/httpd/access_log

192.168.139.1 - - [24/Dec/2016:18:23:28 +0800] "GET /hehe/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"

192.168.139.1 - - [24/Dec/2016:18:23:28 +0800] "GET /hehe/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"

192.168.139.1 - - [24/Dec/2016:18:23:28 +0800] "GET /hehe/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"

192.168.139.1 - - [24/Dec/2016:18:23:29 +0800] "GET /hehe/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"

能夠看到client_ip 192.168.139.1(而不是node2的IP_192.168.139.4)


Nginx的upstream端定義:將多個server作成一個負載均衡的集羣,默認使用wrr調度算法(權重同樣則爲rr,權重爲0 ,則不加入集羣)


[root@node2 html]# vim /etc/nginx/nginx.conf

  upstream my_web_server  { #upstream在server外定義

my_web_server爲集羣名,要引用  server 192.168.139.8 weight=1;

                     server 192.168.139.9 weight=1;

               }

  

        location / {

            root   /web/html;

            index  index.html index.htm;

            proxy_pass http://my_web_server/; #轉發到my_web_server集羣

            proxy_set_header X-Real_IP $remote_addr;


        }


[root@node2 html]# service nginx reload

wKiom1heUKqhjUTVAABcNALmJv8545.png

刷新

wKioL1heUMaRPs20AABW39I_jn4111.png

upstream還能夠爲後端server作健康狀態檢查,萬一兩個後端server都掛了,準備一個sorry頁面

 

[root@node2 html]# vim /etc/nginx/nginx.conf    

upstream my_web_server {

                    server 192.168.139.8 weight=1  max_fails=2 fail_timeout=2 ;#失敗超時2秒                       #失敗兩次就認爲掛了

                    server 192.168.139.9 weight=1  max_fails=2 fail_timeout=2 ;

                    server 127.0.0.1:8080 backup ;

               }


   server { listen 8080;

                 server_name localhost;

                 root /web/error;

                 index index.html;

             }


[root@node2 html]# vim /web/error/index.html


<h1>Sorry......</h1>


[root@node2 html]# service nginx reload

[root@node4 html]# service httpd  stop

[root@node5 html]# service httpd  stop


wKioL1heUzXhJMqNAABWu4Stk4I705.png

[root@node4 html]# service httpd  start

wKiom1heU26jB336AABe8922BlA341.png

[root@node5 ~]# service httpd start


Nginx支持三種負載均衡的調度算法:

1:wrr(weight round robin 加權輪調) 若是權重相同則爲rr(輪調),每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端某臺服務器宕機,故障系統被自動剔除,使用戶訪問不受影響。Weight 指定輪詢權值,Weight值越大,分配到的訪問機率越高,主要用於後端每一個服務器性能不均的狀況下


2:ip_hash (ip_哈希) server端會將client的訪問IP作一個哈希運算,並將結果保存在本地內存中的哈希表中,這樣對IP運算結果的相同的client會被始終分發給通一個後端RS_Server,從而不會出現client由於訪問的是不一樣server形成的沒有session信息的問題(其實要根本解決session問題,仍是要加一個共享存儲,好比那臺server掛了,這時client請求確定會發給其餘server,能夠將session信息保存在memory cache中實現session共享)


3:least_conn (最小鏈接數)比較當前節點上活動鏈接數+非活動鏈接數,輸小給誰發,這是一種動態調度算法,如active*256+inactive


注:使用ip_hash時要將backup去掉,萬必定向到backup_server上,即便RS_Server恢復正常,也不會再給轉發


[root@node2 html]# vim /etc/nginx/nginx.conf

upstream my_web_server {

                    server 192.168.139.8 weight=1  max_fails=2 fail_timeout=2 ;

                    server 192.168.139.9 weight=1  max_fails=2 fail_timeout=2 ;

                    ip_hash;

               }


[root@node2 html]# service nginx reload


一直刷新都是定向在node4

wKiom1heWYzjIeblAABibdiaKbY754.png

爲了減輕後端RS的壓力,Nginx應該啓用本地緩存,其緩存有兩種形式

1:在共享內存中,緩存鍵和緩存對象的元數據(主要用於在內存中查找數據)

2:在磁盤空間中,存儲數據(如靜態、或者通過靜態處理的動態數據)在磁盤中,爲了提升效率,能夠用SSD做爲本地磁盤,且能夠將多塊SSD作成一個Raid0,那速度老快了


根據請求方法進行緩存

proxy_cache_methods GET HEAD POST;#這三種請求方法的請求進行緩存


根據狀態碼進行緩存

proxy_cache_valid 200 302 10m ;#狀態碼爲200 302 的請求緩存10min 

proxy_cache_valid 404      1m; #狀態碼爲200 的請求緩存1min

proxy_cache_valid any 5m; #其餘的狀態碼緩存5min


根據相同請求的次數進行緩存

proxy_cache_min_uses 5; #只有當相同請求出現5次纔對其進行緩存


更詳細的緩存介紹請看官網 https://www.nginx.com/resources/admin-guide/content-caching/


proxy_cache_path ; 緩存的保存路徑,不能定義在server{ }段中

keys_zone=first:20m; 用來存儲鍵的區域名叫first,大小爲20M

max_size=1G ; 最多用1 G的內存進行緩存,若是緩存空間滿了,Nginx的cache_manager進程會根據最近最少鏈接原則進行緩存清除


[root@node2 html]# vim /etc/nginx/nginx.conf

    upstream my_web_server {

                    server 192.168.139.8 weight=1  max_fails=2 fail_timeout=2 ;

                    server 192.168.139.9 weight=1  max_fails=2 fail_timeout=2 ;

                    ip_hash;

               }

    proxy_cache_path /nginx/cache/my_cache levels=1:2 keys_zone=first:20M;

    server {

        listen       80;

        server_name  localhost;

        add_header X_cache "$upstream_cache_status from $server_addr"


 配置文件時;前忘了加"結果一直 nginx: [emerg] unexpected end of file, expecting "}" in /etc/nginx/nginx.con,差點將整個文件刪了^_^

        location / {

            root   /web/html;

            index  index.html index.htm;

            proxy_pass http://my_web_server/;

            proxy_set_header X-Real_IP $remote_addr;

            proxy_cache first;

            proxy_cache_valid 200 10m;


        }

.......

}


[root@node2 html]# mkdir -pv /nginx/cache/my_cache

[root@node2 html]# service nginx reload


瀏覽器訪問:192.168.139.4 Ctrl+F5 強制刷新頁面,按F12鍵,彈出開發者頁面,點擊Network即可看到下面內容,在Response Headers段 HIT from 192.168.139.4 (從192.168.139.4命中)



    1. Request URL:

      http://192.168.139.4/

    2. Request Method:

      GET

    3. Status Code:


      304 Not Modified

    4. Remote Address:

      192.168.139.4:80

  1. Response Headersview source

    1. Connection:

      keep-alive

    2. Date:

      Sat, 24 Dec 2016 12:31:37 GMT

    3. ETag:

      "dfea9-17-54411d5f3b69e"

    4. Last-Modified:

      Tue, 20 Dec 2016 07:17:58 GMT

    5. Server:

      nginx/1.10.2

    6. X-cache:

      HIT from 192.168.139.4

  2. Request Headersview source

    1. Accept:

      text/html,application/xhtml+xml,application/xml;q=0.9,p_w_picpath/webp,*/*;q=0.8

    2. Accept-Encoding:

      gzip, deflate, sdch

    3. Accept-Language:

      zh-CN,zh;q=0.8

    4. Cache-Control:

      max-age=0

    5. Connection:

      keep-alive

    6. Host:

      192.168.139.4

    7. If-Modified-Since:

      Tue, 20 Dec 2016 07:17:58 GMT

    8. If-None-Match:

      "dfea9-17-54411d5f3b69e"

    9. Upgrade-Insecure-Requests:

      1

    10. User-Agent:

      Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36


刪除本地緩存再刷新一次

[root@node2 5b]# rm /nginx/cache/my_cache/b/5b/d0f1246dc67a25097fa3a295a393f5bb 


  1. Connection:

    keep-alive

  2. Date:

    Sat, 24 Dec 2016 12:38:29 GMT

  3. ETag:

    "dfea9-17-54411d5f3b69e"

  4. Last-Modified:

    Tue, 20 Dec 2016 07:17:58 GMT

  5. Server:

    nginx/1.10.2

  6. X-cache:

    MISS from 192.168.139.4 #MISS表明緩存未命中


再刷新一次

  1. Connection:

    keep-alive

  2. Date:

    Sat, 24 Dec 2016 12:39:37 GMT

  3. ETag:

    "dfea9-17-54411d5f3b69e"

  4. Last-Modified:

    Tue, 20 Dec 2016 07:17:58 GMT

  5. Server:

    nginx/1.10.2

  6. X-cache:

    HIT from 192.168.139.4 #緩存又命中了


  7. miss :緩存未命中

  8. hit :緩存命中

  9. expired : 緩存已過時

  updating :緩存內容已經更新

  stale : 緩存已經失效


除了以上緩存外,還有fastcgi_cache,能夠緩存php腳本處理的結果,及php代碼編譯的opcode,但通常來講動態響應內容每每不同,只能講那些常常請求的動態資源進行緩存,這時能夠根據最少相同訪問次數來設定緩存,fastcgi也有本身的緩存配置(將盡可能多的動態資源進行靜態化,是一個好的大型站點必須作好的事)


open_log_cache: 還有日誌緩存

open_file_cache:將文件的元數據緩存再Nginx的內存中


對於一個大型站點來講,一個集羣組可能不能知足其需求,這時就須要多個集羣組進行不一樣的分工處理不一樣的請求,能夠採起以下操做解決


1:專門處理php動態請求的集羣

  upstream php_servers { 

               server 192.168.139.11....;

               server 192.168.139.12.....;

               ......

               }


2:專門處理圖片請求的集羣

upstream  img_servers { 

               server 192.168.139.20....;

               server 192.168.139.21.....;

               ......

               }


3:處理其餘請求的集羣

upstream  other_servers { 

               server 192.168.139.30....;

               server 192.168.139.31.....;

               ......

               }


定義location,根據URI進行匹配(記住location幾種模式匹配優先級奧^_^)


location  /     { 

              proxy_pass http://other_servers;

           }


location ~* \.php$ {

               fastcgi_pass http://img_servers;

           }


location ~* "\.(jpg|gpeg|gif|png)$" {

                          proxy_pass http://php_server;

                       }


開啓壓縮


gzip on|off;

gzip_min_length 1000; #定義小於1000個字節的數據不進行壓縮

gzip_proxied; #定義gzip的壓縮代理

gzip_type text/plain application/xml; #定義什麼類型的數據壓縮


須要注意的是,壓縮的主要目是節約帶寬,若是帶寬夠用就不用壓縮,由於壓縮會消耗CPU資源,而對於內存中要緩存的數據通常也不要進行壓縮


rewrite:URL重寫

雙目測試:

     ~ :匹配爲真,不匹配爲假

     !~:不匹配爲真,匹配爲假

     =:等於爲真,不等於爲假

     !=:不等於爲真,等於爲假

     ~*:不區分大小寫,匹配爲真,不匹配爲假

     !~*:不區分大小寫,不匹配爲真,匹配爲假

如:


if ($request_method = "post") {

                    fastcgi_pass 127.0.0.1:9000;

                   }

若是請求方法爲post,則經fastcgi轉發到本機的php處理


if ($request_method = "put") {

                    proxy_pass http://192.168.139.8;

                   }

若是請求方法爲put,則轉發到後端server 192.168.138.8 處理


if ($request_uri ~* "/forum" {

                    proxy_pass http://192.168.139.8/bbs;

                   }

若是請求的URI中不區分大小寫包含forum則轉發到後端http://192.168.139.8/bbs


單目測試


location /photos/ {

            valid_referers none blocked www.zxl.com;

            if ($valid_referer) {

                           returen 403;

                           或者 rewrite http://192.168.139.9/p_w_picpaths/

                          }


            }

 valid_referers 從哪一個頁面進行訪問的

1  none 表示經過瀏覽器輸入來的

2  blocked www.zxl.com 防火牆匹配到 www.zxl.com 


if ($valid_referer) 若是不是1和2兩種方式訪問個人網頁,則放回403(頁面不存在)或者直接URL重寫到rewrite http://192.168.139.9/p_w_picpaths/ (這個頁面下方一個圖片,上面寫着該網站內容只容許本站內部使用)


這樣就能夠防止盜鏈


rewrite指令能夠用在server,location,if的上下文中


支持正則表達式

如 rewrite "^(/download/.*)/media/(.*)\..*$"  $1/mp3/$2.mp3 last;

  rewrite "^(/download/.*)/audio/(.*)\..*$"  $1/mp3/$2.ra last;

  表示以download目錄開頭後面跟任意目錄再跟audio目錄,任意字符的文件名,以任意格式結尾的uri,將其rewrite到/download/.*/mp3/(.*).ra。其中的\爲文件格式.XX中.的脫義符


 location    / {

            root /web/html;

            index index.html index.hml;

            rewrite "^/bbs/(.*)$" http://192.168.139.8/forum/$1;

            }


則若是訪問的URI中以bbs開頭,則跳轉到 http://192.168.139.8/forum/$1,$1表示引用第一個括號中內容,至關於正則表達式中的\1


[root@node2 nginx]# mv nginx.conf nginx.conf.proxy

[root@node2 nginx]# cp nginx.conf.default nginx.conf

[root@node2 nginx]# vim nginx.conf

location / {

            root   /web/html;

            index  index.html index.htm;

            rewrite "^/bbs/(.*)$" http://192.168.139.8/forum/$1;

        }

[root@node2 nginx]# service nginx reload


[root@node4 html]# vim /var/www/html/forum/index.html 


<h1>Rewrited.....</h1>

瀏覽器測試


rewrite後面能夠跟四種參數

1 last 表示本次重寫完成後,下次請求還會進行uri檢查(若是還匹配,會再次rewrite),但有時會產生循環,這時循環十次後會break退出

rewrite "^/bbs/(.*)/p_w_picpaths/(.*)\.jpg$"  http://www.zxl.com/bbs/$2/p_w_picpaths/$1.jpg last;


你訪問 http://www.zxl.com/bbs/a/p_w_picpaths/b.jpg 會rewrite到http://222.zxl.com/bbs/b/p_w_picpaths/a.jpg 你在訪問又會rewrite到http://www.zxl.com/bbs/a/p_w_picpaths/b.jpg再訪問又rewrite到http://222.zxl.com/bbs/b/p_w_picpaths/a.jpg 這樣會一直產生循環,直到10此會break


2 break 表示本次重寫後,直接執行後續操做,再也不進行二次重寫


3 redirect 表明臨時重定向,只用於狀態碼顯示


4 permanent 表明永久重定向,只用於狀態碼顯示


有的時候爲了解決session共享的問題,有如下幾種方案:

1 持久鏈接,但持久鏈接也有時間限制

2 rsync + inotify/sersync 但這樣每每只有一個節點爲主節點,其餘備節點只能從這個主節點同步session,萬一DR將請求分發到了備節點,就不能講session同步到其餘節點 

3 實現session的共享,如存在memory cache中(這種方法很好)

4 實現讀寫分離,讀時能夠從A,B主機讀,寫時能夠將session保存在C主機,而後讓C主機進行session文件同步到A,B主機即可解決session共享問題                                   

        

下面將演示Nginx的讀寫分離,node5爲寫入write_server,node4爲read_server,node2爲前段Nginx_server


weDAV(web_based Distributed Authoring and versioning),是一種基於Http1.1協議的通訊協議,它擴展了Http1.1在get,post,head等幾個Http標準方法之外添加了一些新的方法,使應用程序能夠直接對web server進行讀寫,而且支持文件鎖定(Locking)及解鎖(unlock),及支持文件的版本控制


因此要讓node5支持put請求(put爲寫操做),必須編輯vim /etc/httpd/conf/httpd.conf

[root@node5 ~]# vim /etc/httpd/conf/httpd.conf 

<Directory "/var/www/html">

  加入 Dav on


[root@node5 ~]# service httpd restart


[root@node2 nginx]# curl http://192.168.139.9 -T /etc/passwd

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<html><head>

<title>403 Forbidden</title>

</head><body>

<h1>Forbidden</h1>

<p>You don't have permission to access /passwd

on this server.</p>

<hr>

<address>Apache/2.2.15 (CentOS) Server at 192.168.139.9 Port 80</address>

</body></html>

能夠看到node5的/var/www/html目錄不容許Apache寫操做,目錄屬主和屬組都是root

[root@node5 html]# ll

total 4

-rw-r--r--. 1 root root 23 Dec 22 16:25 index.html

[root@node5 html]# setfacl -m u:apache:rwx /var/www/html/

[root@node2 nginx]# curl http://192.168.139.9 -T /etc/passwd

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<html><head>

<title>201 Created</title>

</head><body>

<h1>Created</h1>

<p>Resource /passwd has been created.</p>

<hr />

<address>Apache/2.2.15 (CentOS) Server at 192.168.139.9 Port 80</address>

</body></html>

編輯Nginx的配置文件

[root@node2 nginx]# vim nginx.conf

    location / {


      proxy_pass http://192.168.139.8;

              #PUT必定要大寫

      if ( $request_method = "PUT") {

             proxy_pass http://192.168.139.9;


              }

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node4.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node4.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node4.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node4.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node4.zxl.com</h1>

[root@node2 nginx]# curl -T /etc/fstab  http://192.168.139.4

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<html><head>

<title>201 Created</title>

</head><body>

<h1>Created</h1>

<p>Resource /fstab has been created.</p>

<hr />

<address>Apache/2.2.15 (CentOS) Server at 192.168.139.9 Port 80</address>

</body></html>


讀寫分離到兩個不一樣的集羣

[root@node2 nginx]# vim nginx.conf

upstream read_group {

                            server 192.168.139.2 weight=1;

                            server 192.168.139.8 weight=2;

                       }

    upstream write_group {

                            server 192.168.139.9 weight=2;

                       }

    server {

        listen       80;

        server_name  localhost;


        #charset koi8-r;


        #access_log  logs/host.access.log  main;

        location / {


             proxy_pass http://read_group;


      if ( $request_method = "PUT") {

             proxy_pass http://write_group;


              }


[root@node2 nginx]# service nginx reload

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

Reloading nginx:                                           [  OK  ]

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node4.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node1.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node4.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node4.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node1.zxl.com</h1>

用curl上傳文件

[root@node2 nginx]# curl -T /etc/passwd  http://192.168.139.4

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<html><head>

<title>201 Created</title>

</head><body>

<h1>Created</h1>

<p>Resource /passwd has been created.</p>

<hr />

<address>Apache/2.2.15 (CentOS) Server at write_group Port 80</address>

</body></html>


[root@node5 html]# ll

total 12

-rw-r--r--. 1 apache apache  779 Dec 25 19:44 fstab

-rw-r--r--. 1 root   root   23 Dec 22 16:25 index.html

-rw-r--r--. 1 apache apache  1519 Dec 25 19:48 passwd


準備備用節點,平時不用,只有全部節點掛了才加入集羣

[root@node2 nginx]# vim nginx.conf

 upstream  group {       

                            server 192.168.139.2 weight=1;

                            server 192.168.139.8 weight=2; 

                            server 192.168.139.9 weight=2  backup;

                       }


location / {


                    proxy_pass http://group;


        }

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node4.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node1.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node4.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node4.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node1.zxl.com</h1>

[root@node4 html]# service httpd stop

[root@node1 web]# service nginx stop

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node5.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node5.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node5.zxl.com</h1>

[root@node2 nginx]# curl  http://192.168.139.4

<h1>node5.zxl.com</h1>

相關文章
相關標籤/搜索