天天看點

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

一、Nginx Rewrite 規則

1. Nginx rewrite規則

Rewrite規則含義就是某個URL重寫成特定的URL(類似于Redirect),從某種意義上說為了美觀或者對搜尋引擎友好,提高收錄量及排名等。

文法:

rewrite <regex> <replacement> [flag]

關鍵字 || 正則 || 替代内容 || flag标記

Rewrite規則的flag标記主要有以下幾種:

  • last :相當于Apache裡的(L)标記,表示完成rewrite;
  • break:本條規則比對完成後,終止比對,不再比對後面的規則
  • redirect:傳回302臨時重定向,浏覽器位址會顯示跳轉後的URL位址
  • permanent:傳回301永久重定向,浏覽器位址欄會顯示跳轉後的URL位址

last和break用來實作URL重寫,浏覽器位址欄URL位址不變

2. Nginx rewrite例子

a) 例如使用者通路www.dbspread.com,想直接跳轉到網站下面的某個頁面,www.dbspread.com/new.index.html如何來實作呢?我們可以使用Nginx Rewrite 來實作這個需求,具體如下:在server中加入如下語句即可:

server {
    listen       80; #監聽80端口
    server_name  www.dbspread.com; #域名
    #rewrite規則
    index  index.jsp index.html index.htm;
    root   /usr/local/nginx/html; #定義伺服器的預設網站根目錄位置



    #監聽完成以後通過斜杆(/)攔截請求轉發到後端的tomcat伺服器
    location / 
        {
            #如果後端的伺服器傳回502、504、執行逾時等錯誤,自動将請求轉發到upstream負載均衡池中的另一台伺服器,實作故障轉移。
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_set_header Host  $host; #擷取用戶端的主機名存到變量Host裡面,進而讓tomcat取到用戶端機器的資訊
            proxy_set_header X-Real-IP $remote_addr; #擷取用戶端的主機名存到變量X-Real-IP裡面,進而讓tomcat取到用戶端機器的資訊
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            rewrite     ^/$    http://www.dbspread.com/new.index.html  permanent;
            proxy_pass http://web1; #跳轉到對應的應用web1
        }
}
           

複制

效果圖如下:

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!
rewrite     ^/$    http://www.dbspread.com/new.index.html  permanent;           

複制

對應如下文法:

rewrite <regex> <replacement> [flag];

關鍵字 || 正則 || 替代内容 || flag标記

正規表達式說明:

*代表前面0或更多個字元 +代表前面1或更多個字元 ?代表前面0或1個字元 ^代表字元串的開始位置 $代表字元串結束的位置 。為通配符,代表任何字元

b)例如多個域名跳轉到同一個域名,nginx rewrite規則寫法如下:

server {
    listen       80; #監聽80端口
    server_name  www.dbspread.com; #域名
    #rewrite規則
    index  index.jsp index.html index.htm;
    root   /usr/local/nginx/html; #定義伺服器的預設網站根目錄位置

    if ($host != 'www.dbspread.com' ){ 
            rewrite ^/(.*)$  http://www.dbspread.com/$1  permanent;
            }
}
           

複制

格式:

rewrite <regex> <replacement> [flag];

關鍵字 || 正則 || 替代内容 || flag标記

說明:

  • rewrite為固定關鍵字,表示開始進行rewrite比對規則、
  • regex部分是

    ^/(.*)

    ,這是一個正規表達式,比對完整的域名和後面的路徑位址
  • replacement部分是http://www.dbspread.com/1,1是取自regex部分( )裡的内容。比對成功後跳轉到的URL。
  • flag部分 permanent表示永久301重定向标記,即跳轉到新的

    http://www.dbspread.com/$1

    位址上

二、Nginx 防盜鍊

1. 什麼是防盜鍊

比如http://www.dbspread.com/download/av123.rmvb 這個視訊下載下傳位址被其他網站引用,比如在www.test.com的index.html引用download/av123.rmvb就叫盜鍊,我們要禁止這種引用就叫做防盜鍊

2. 怎麼實作防盜鍊

在nginx的nginx.conf的server裡面配置如下代碼

server {
        listen       80;
        server_name  www.dbspread.com *.dbspread.com;
        location ~* \.(rmvb|jpg|png|swf|flv)$ { #rmvb|jpg|png|swf|flv表示對rmvb|jpg|png|swf|flv字尾的檔案實行防盜鍊
                valid_referers none blocked  www.dbspread.com; #表示對www.dbspread.com此域名開通白名單,比如在www.test.com的index.html引用download/av123.rmvb,無效
                root   html/b;
                if ($invalid_referer) { #如果請求不是從www.dbspread.com白名單發出來的請求,直接重定向到403.html這個頁面或者傳回403 
                     #rewrite ^/ http://www.dbspread.com/403.html;
                     return 403;
                }
        }

    }
           

複制

三、Nginx 動靜分離

1. 動靜分離是什麼

Nginx動靜分離是讓動态網站裡的動态網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以後,我們就可以根據靜态資源的特點将其做緩存操作,這就是網站靜态化處理的核心思路。

2. 動靜分離原理圖

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

3. Nginx動靜分離應該注意的地方

  • WEB項目開發時要注意,将靜态資源盡量放在一個static檔案夾
  • 将static靜态資源檔案夾放到Nginx可以取到的位置
  • 頁面要建立全局變量路徑,友善修改路徑
  • 修改nginx.conf的location, 比對靜态資源請求

4. Nginx動靜分離步驟

4.1 準備一個靜态資源button.css

body {
    margin: 10px 20px;
    text-align: center;
    font-family: Arial, sans-serif;
    background-color: red;
}           

複制

4.2 在/var/local下建立一個static檔案夾用來存放靜态資源button.css

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

4.3 在tomcat-8080/webapps/ROOT下的index.html裡面引入button.css

<html>
  <head>
    <link rel="stylesheet" type="text/css" href="http://www.static.com/button.css" />
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="renderer" content="webkit">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <title>test</title>
  </head>
  <body>

    歡迎來到8080端口tomcat
  </body>
</html>
           

複制

4.4 在nginx的nginx.conf中server節點新增靜态資源分離的配置

server {
    listen       80; #監聽80端口
    server_name  www.dbspread.com; #域名
    #rewrite規則
    index  index.jsp index.html index.htm;
    root   /usr/local/nginx/html; #定義伺服器的預設網站根目錄位置
    #重定向
    if ($host != 'www.dbspread.com' ){ 
            rewrite ^/(.*)$  http://www.dbspread.com/$1  permanent;
            }

    #防盜鍊
     location ~* \.(rmvb|jpg|png|swf|flv)$ { #rmvb|jpg|png|swf|flv表示對rmvb|jpg|png|swf|flv字尾的檔案實行防盜鍊
                valid_referers none blocked  www.dbspread.com; #表示對www.dbspread.com此域名開通白名單,比如在www.test.com的index.html引用download/av123.rmvb,無效
                root   html/b;
                if ($invalid_referer) { #如果請求不是從www.dbspread.com白名單發出來的請求,直接重定向到403.html這個頁面或者傳回403 
                     #rewrite ^/ http://www.dbspread.com/403.html;
                     return 403;
                }
        }

    #監聽完成以後通過斜杆(/)攔截請求轉發到後端的tomcat伺服器
    location / 
        {
            #如果後端的伺服器傳回502、504、執行逾時等錯誤,自動将請求轉發到upstream負載均衡池中的另一台伺服器,實作故障轉移。
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_set_header Host  $host; #擷取用戶端的主機名存到變量Host裡面,進而讓tomcat取到用戶端機器的資訊
            proxy_set_header X-Real-IP $remote_addr; #擷取用戶端的主機名存到變量X-Real-IP裡面,進而讓tomcat取到用戶端機器的資訊
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #rewrite     ^/$    http://www.dbspread.com/new.index.html  permanent;#使用者通路www.dbspread.com,想直接跳轉到網站下面的某個頁面:www.dbspread.com/new.index.html
            proxy_pass http://web1; #跳轉到對應的應用web1
        }

       # location ~ .*\.(php|jsp|cgi|shtml)?$ #動态分離 ~比對 以.*結尾(以PHP JSP結尾走這段)
       #  {
       #     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://jvm_web2;
       # }

        #靜态分離 ~比對 以.*結尾(以html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css結尾走這段),當然不是越久越好,如果有10000個使用者線上,都儲存幾個月,系統托跨
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ 
        {
            root /var/local/static; #靜态資源存放在nginx的安裝機器上
            #proxy_pass http://www.static.com; #靜态資源也可存放在遠端伺服器上
            expires    30d; #30天之内隻要通路過一次就從緩存拿
        }

        #日志級别有[debug|info|notice|warn|error|crit]  error_log 級别分為 debug, info, notice, warn, error, crit  預設為crit, 生産環境用error 
        #crit 記錄的日志最少,而debug記錄的日志最多
        access_log  /usr/local/logs/web2/access.log main;
        error_log   /usr/local/logs/web2/error.log  crit;

    }
           

複制

4.5 通路頁面檢視效果

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

四、Nginx+keepalived 實作高可用

1. keepalived是什麼

Keepalived軟體起初是專為LVS負載均衡軟體設計的,用來管理并監控LVS叢集系統中各個服務節點的狀态,後來又加入了可以實作高可用的VRRP (Virtual Router Redundancy Protocol ,虛拟路由器備援協定)功能。

是以,Keepalived除了能夠管理LVS軟體外,還可以作為其他服務(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟體。

2. keepalived主要功能

  • 管理LVS負載均衡軟體
  • 實作LVS叢集節點的健康檢查
  • 作為系統網絡服務的高可用性(failover)

3. keepalived故障轉移

Keepalived高可用服務之間的故障切換轉移,是通過 VRRP 來實作的。

在 Keepalived服務正常工作時,主 Master節點會不斷地向備節點發送(多點傳播的方式)心跳消息,用以告訴備Backup節點自己還活着,當主 Master節點發生故障時,就無法發送心跳消息,備節點也就是以無法繼續檢測到來自主 Master節點的心跳了,于是調用自身的接管程式,接管主Master節點的 IP資源及服務。

而當主 Master節點恢複時,備Backup節點又會釋放主節點故障時自身接管的IP資源及服務,恢複到原來的備用角色。

說明:keepalived的主從切換和redis的主從切換是不一樣的,keepalived的主節點挂了以後,從節點變為主節點,之前的主節點恢複以後繼續做主節點。redis的主節點挂了以後,重新恢複以後變為從節點

4. keepalived高可用架構示意圖

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

說明:

  • 虛拟ip(VIP):192.168.152.200,對外提供服務的ip,也可稱作浮動ip
  • 192.168.152.130:nginx + keepalived master 主
  • 192.168.152.129:nginx + keepalived backup 從
  • 192.168.152.129:tomcat-8080
  • 192.168.152.129:tomcat-8081

5. keepalived安裝

環境準備:

centos6、jdk
  • 虛拟ip(VIP):192.168.152.200,對外提供服務的ip,也可稱作浮動ip
  • 192.168.152.130:nginx + keepalived master 主
  • 192.168.152.129:nginx + keepalived backup 從
  • 192.168.152.129:tomcat-8080
  • 192.168.152.129:tomcat-8081

5.1 安裝keepalived的步驟:

注:192.168.152.129(keepalived從節點) 與 192.168.152.130(keepalived主節點)先安裝好nginx + keepalived

下載下傳壓縮包:

wget www.keepalived.org/software/keepalived-1.3.5.tar.gz           

複制

解壓縮:

tar -zxvf keepalived-1.3.5.tar.gz           

複制

進入解壓縮以後的檔案目錄:

cd keepalived-1.3.5           

複制

編譯安裝:

./configure --prefix=/usr/local/keepalived           

複制

系統提示警告

*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS. yum -y install libnl libnl-devel

再次執行

./configure --prefix=/usr/local/keepalived           

複制

系統提示錯誤

configure: error: libnfnetlink headers missing yum install -y libnfnetlink-devel

再次執行

./configure --prefix=/usr/local/keepalived

make && make install           

複制

到此keepalived安裝完成,但是接下來還有最關鍵的一步,如果這一步沒有做後面啟動keepalived的時候會報找不到配置檔案的錯誤

Configuration file '/etc/keepalived/keepalived.conf' is not a regular non-executable file           

複制

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

安裝完成後,進入安裝目錄的etc目錄下,将keepalived相應的配置檔案拷貝到系統相應的目錄當中。keepalived啟動時會從/etc/keepalived目錄下查找keepalived.conf配置檔案

mkdir /etc/keepalived

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived           

複制

5.2 修改keepalived主節點192.168.152.130的/etc/keepalived/keepalived.conf配置檔案

#全局配置
global_defs {             
    notification_email {
        [email protected]  #設定報警郵件位址,可以設定多個,每行一個。需要開啟sendmail服務。
    }
    notification_email_from [email protected]
    smtp_server smtp.hysec.com   #設定SMTP Server位址
    smtp_connection_timeout 30   #設定SMTP Server的逾時時間
    router_id nginx_master       #表示運作Keepalived伺服器的一個辨別,唯一的
}
#檢測腳本
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh" #心跳執行的腳本,檢測nginx是否啟動
    interval 2                          #(檢測腳本執行的間隔,機關是秒)
    weight 2                            #權重
}
#vrrp 執行個體定義部分
vrrp_instance VI_1 {        
    state MASTER            # 指定keepalived的角色,MASTER為主,BACKUP為備
    interface eth0         # 目前進行vrrp通訊的網絡接口卡(目前centos的網卡) 用ifconfig檢視你具體的網卡
    virtual_router_id 66    # 虛拟路由編号,主從要一直
    priority 100            # 優先級,數值越大,擷取處理請求的優先級越高
    advert_int 1            # 檢查間隔,預設為1s(vrrp多點傳播周期秒數)
    #授權通路
    authentication {
        auth_type PASS #設定驗證類型和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通信
        auth_pass 1111
    }
    track_script {
        chk_http_port            #(調用檢測腳本)
    }
    virtual_ipaddress {
        192.168.152.200            # 定義虛拟ip(VIP),可多設,每行一個
    }
}
           

複制

5.3 修改keepalived從節點192.168.152.129的/etc/keepalived/keepalived.conf配置檔案

#全局配置
global_defs {
    notification_email {
         [email protected]  #設定報警郵件位址,可以設定多個,每行一個。需要開啟sendmail服務。
    }
    notification_email_from [email protected]
    smtp_server smtp.hysec.com #設定SMTP Server位址
    smtp_connection_timeout 30 #設定SMTP Server的逾時時間
    router_id nginx_backup              # 設定nginx backup的id,在一個網絡應該是唯一的
}
#檢測腳本
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh" #心跳執行的腳本,檢測nginx是否啟動
    interval 2                          #(檢測腳本執行的間隔)
    weight 2                            #權重
}
#vrrp 執行個體定義部分
vrrp_instance VI_1 {
    state BACKUP                        # 指定keepalived的角色,MASTER為主,BACKUP為備
    interface eth0                      # 目前進行vrrp通訊的網絡接口卡(目前centos的網卡) 用ifconfig檢視你具體的網卡
    virtual_router_id 66                # 虛拟路由編号,主從要一直
    priority 99                         # 優先級,數值越大,擷取處理請求的優先級越高
    advert_int 1                        # 檢查間隔,預設為1s(vrrp多點傳播周期秒數)
    #授權通路
    authentication {
        auth_type PASS #設定驗證類型和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通信
        auth_pass 1111
    }
    track_script {
        chk_http_port                   #(調用檢測腳本)
    }
    virtual_ipaddress {
        192.168.152.200                   # 定義虛拟ip(VIP),可多設,每行一個
    }
}
           

複制

5.4 檢查nginx是否啟動的shell腳本

/usr/local/src/check_nginx_pid.sh
#!/bin/bash
#檢測nginx是否啟動了
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then    #如果nginx沒有啟動就啟動nginx                        
      /usr/local/nginx/sbin/nginx                #重新開機nginx
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重新開機失敗,則停掉keepalived服務,進行VIP轉移
              killall keepalived                    
      fi
fi
           

複制

5.5 192.168.152.130(keepalived主節點)和 192.168.152.129(keepalived從節點)的nginx的配置檔案nginx.conf

user root root; #使用什麼使用者啟動NGINX 在運作時使用哪個使用者哪個組
worker_processes 4; #啟動程序數,一般是1或8個,根據你的電腦CPU數,一般8個
worker_cpu_affinity 00000001 00000010 00000100 00001000; #CPU邏輯數——把每個程序分别綁在CPU上面,為每個程序配置設定一個CPU
#pid /usr/local/nginx/logs/nginx.pid
worker_rlimit_nofile 102400; #一個程序打開的最大檔案數目,與NGINX并發連接配接有關系

#工作模式及連接配接數上限
events
{
  use epoll; #多路複用IO 基于LINUX2.6以上核心,可以大大提高NGINX的性能 uname -a檢視核心版本号
  worker_connections 102400; #單個worker process最大連接配接數,其中NGINX最大連接配接數=連接配接數*程序數,一般1GB記憶體的機器上可以打開的最大數大約是10萬左右
  multi_accept on;   #盡可能多的接受請求,預設是關閉狀态
}

#處理http請求的一個應用配置段
http
{
  #引用mime.types,這個類型定義了很多,當web伺服器收到靜态的資源檔案請求時,依據請求檔案的字尾名在伺服器的MIME配置檔案中找到對應的MIME #Type,根據MIMETYPE設定并response響應類型(Content-type)
  include       mime.types; 
  default_type  application/octet-stream; #定義的資料流,有的時候預設類型可以指定為text,這跟我們的網頁釋出還是資源下載下傳是有關系的
  fastcgi_intercept_errors on; #表示接收fastcgi輸出的http 1.0 response code
  charset utf-8;
  server_names_hash_bucket_size 128; #儲存伺服器名字的hash表
  #用來緩存請求頭資訊的,容量4K,如果header頭資訊請求超過了,nginx會直接傳回400錯誤,先根據client_header_buffer_size配置的值配置設定一個buffer,如果##配置設定的buffer無法容納request_line/request_header,那麼就會##再次根據large_client_header_buffers配置的參數配置設定large_buffer,如果large_buffer還是無#法容納,那麼就會傳回414(處理request_line)/400(處理request_header)錯誤。
  client_header_buffer_size 4k; 
  large_client_header_buffers 4 32k;
  client_max_body_size 300m; #允許用戶端請求的最大單檔案位元組數 上傳檔案時根據需求設定這個參數
  #指定NGINX是否調用這個函數來輸出檔案,對于普通的檔案我們必須設定為ON,如果NGINX專門做為一個下載下傳端的話可以關掉,好處是降低磁盤與網絡的IO處理數及#系統的UPTIME
  sendfile on; 
  #autoindex on;開啟目錄清單通路,适合下載下傳伺服器
  tcp_nopush on; #防止網絡阻塞
  #非常重要,根據實際情況設定值,逾時時間,用戶端到服務端的連接配接持續有效時間,60秒内可避免重建立立連接配接,時間也不能設太長,太長的話,若請求數10000##,都占用連接配接會把服務托死
  keepalive_timeout 60;
  tcp_nodelay on; #提高資料的實時響應性
  client_body_buffer_size 512k; #緩沖區代理緩沖使用者端請求的最大位元組數(請求多)

  proxy_connect_timeout   5; #nginx跟後端伺服器連接配接逾時時間(代理連接配接逾時)
  proxy_read_timeout      60; #連接配接成功後,後端伺服器響應時間(代理接收逾時)
  proxy_send_timeout      5; #後端伺服器資料回傳時間(代理發送逾時)
  proxy_buffer_size       16k; #設定代理伺服器(nginx)儲存使用者頭資訊的緩沖區大小
  proxy_buffers           4 64k; #proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設定
  proxy_busy_buffers_size 128k; #高負荷下緩沖大小
  proxy_temp_file_write_size 128k; #設定緩存檔案夾大小,大于這個值,将從upstream伺服器傳

  gzip on; #NGINX可以壓縮靜态資源,比如我的靜态資源有10M,壓縮後隻有2M,那麼浏覽器下載下傳的就少了
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.1;
  gzip_comp_level 2; #壓縮級别大小,最小1,最大9.值越小,壓縮後比例越小,CPU處理更快,為1時,原10M壓縮完後8M,但設為9時,壓縮完可能隻有2M了。一般設定為2
  gzip_types       text/plain application/x-javascript text/css application/xml; #壓縮類型:text,js css xml 都會被壓縮
  gzip_vary on; #作用是在http響應中增加一行目的是改變反向代理伺服器的緩存政策

#日志格式 
log_format  main '$remote_addr - $remote_user [$time_local] "$request" ' #ip 遠端使用者 當地時間  請求URL
                 '$status $body_bytes_sent "$http_referer" ' #狀态  發送的大小  響應的頭
         '"$http_user_agent" $request_time'; #用戶端使用的浏覽器  頁面響應的時間

#動态轉發         
upstream web1 {
    #每個請求按通路ip的hash結果配置設定,這樣每個訪客固定通路一個後端伺服器,可以解決session的問題。配置了ip_hash就沒有負載均衡的效果了,每次通路的都是同一個tomcat
    #ip_hash; 
    #轉發的後端的tomcat伺服器,weight表示轉發的權重,越大轉發的次數越多,機器性能不一樣配置的weight值不一樣     
     server   192.168.152.129:8080 weight=1 max_fails=2 fail_timeout=30s;
     server   192.168.152.129:8081 weight=1 max_fails=2 fail_timeout=30s;
}
upstream web2 {
     server   192.168.152.129:8090 weight=1 max_fails=2 fail_timeout=30s;
     server   192.168.152.129:8091 weight=1 max_fails=2 fail_timeout=30s;
}

server {
    listen       80; #監聽80端口
    server_name  www.dbspread.com; #域名
    #rewrite規則
    index  index.jsp index.html index.htm;
    root   /usr/local/nginx/html; #定義伺服器的預設網站根目錄位置
    #重定向
    if ($host != 'www.dbspread.com' ){ 
            rewrite ^/(.*)$  http://www.dbspread.com/$1  permanent;
            }

    #防盜鍊
     location ~* \.(rmvb|jpg|png|swf|flv)$ { #rmvb|jpg|png|swf|flv表示對rmvb|jpg|png|swf|flv字尾的檔案實行防盜鍊
                valid_referers none blocked  www.dbspread.com; #表示對www.dbspread.com此域名開通白名單,比如在www.test.com的index.html引用download/av123.rmvb,無效
                root   html/b;
                if ($invalid_referer) { #如果請求不是從www.dbspread.com白名單發出來的請求,直接重定向到403.html這個頁面或者傳回403 
                     #rewrite ^/ http://www.dbspread.com/403.html;
                     return 403;
                }
        }

    #監聽完成以後通過斜杆(/)攔截請求轉發到後端的tomcat伺服器
    location / 
        {
            #如果後端的伺服器傳回502、504、執行逾時等錯誤,自動将請求轉發到upstream負載均衡池中的另一台伺服器,實作故障轉移。
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_set_header Host  $host; #擷取用戶端的主機名存到變量Host裡面,進而讓tomcat取到用戶端機器的資訊
            proxy_set_header X-Real-IP $remote_addr; #擷取用戶端的主機名存到變量X-Real-IP裡面,進而讓tomcat取到用戶端機器的資訊
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #rewrite     ^/$    http://www.dbspread.com/new.index.html  permanent;#使用者通路www.dbspread.com,想直接跳轉到網站下面的某個頁面:www.dbspread.com/new.index.html
            proxy_pass http://web1; #跳轉到對應的應用web1
        }

       # location ~ .*\.(php|jsp|cgi|shtml)?$ #動态分離 ~比對 以.*結尾(以PHP JSP結尾走這段)
       #  {
       #     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://jvm_web2;
       # }

        #靜态分離 ~比對 以.*結尾(以html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css結尾走這段),當然不是越久越好,如果有10000個使用者線上,都儲存幾個月,系統托跨
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ 
        {
            root /var/local/static; #靜态資源存放在nginx的安裝機器上
            #proxy_pass http://www.static.com; #靜态資源也可存放在遠端伺服器上
            expires    30d;
        }

        #日志級别有[debug|info|notice|warn|error|crit]  error_log 級别分為 debug, info, notice, warn, error, crit  預設為crit, 生産環境用error 
        #crit 記錄的日志最少,而debug記錄的日志最多
        access_log  /usr/local/logs/web2/access.log main;
        error_log   /usr/local/logs/web2/error.log  crit;

    }


}
           

複制

到這一步環境準備已完成,相關的配置也修改完成,下面我們來檢視效果

5.6 配置hosts域名映射

192.168.152.200  www.dbspread.com           

複制

注意:這裡192.168.152.200 是keepalived裡面virtual_ipaddress配置的虛拟ip
virtual_ipaddress {
        192.168.152.200 # 定義虛拟ip(VIP),可多設,每行一個
    }           

複制

到這一步環境準備已完成,相關的配置也修改完成,下面我們來檢視效果

5.7 分别啟動192.168.152.129的兩個tomcat

5.8 分别啟動192.168.152.130(keepalived主節點)和 192.168.152.129(keepalived從節點)的keepalived的

啟動指令:

/usr/local/keepalived/sbin/keepalived             

複制

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

可以看到keepalived和nginx都啟動了

在浏覽器輸入www.dpspread.com域名通路

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

5.9 下面我們停掉主節點192.168.152.130的keepalived和nginx

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

可以看到從節點變為主節點了

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

在浏覽器輸入位址www.dpspread.com通路,可以看到通路正常

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

5.10 下面我們重新啟動主節點192.168.152.130

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

可以看到主節點重新啟動以後變為主節點了

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

之前變為主節點的從節點又變回從節點了

Nginx+keepalived 實作高可用,防盜鍊及動靜分離配置,寫得太好了!

到此keepalived+nginx的高可用完美完成,可以安安心心的睡個好覺了! Victory!!!!