Nginx反向代理,負載均衡,redis session共享,keepalived高可用(轉)

相關知識自行搜索,直接上乾貨。。。javascript

使用的資源:css

nginx主服務器一臺,nginx備服務器一臺,使用keepalived進行宕機切換。html

tomcat服務器兩臺,由nginx進行反向代理和負載均衡,此處可搭建服務器集羣。前端

redis服務器一臺,用於session的分離共享。java

nginx主服務器:192.168.50.133node

nginx備服務器:192.168.50.135linux

tomcat項目服務器1:192.168.50.137nginx

tomcat項目服務器2:192.168.50.139c++

redis服務器:192.168.50.140web

注意訪問時須要配置防火牆規則,或者關閉防火牆

 

首先進行的通用安裝:

總的須要模擬五臺服務器,使用vmware,所有使用centos6.5 64位,五臺服務器所有安裝jdk,我使用的是jdk1.8.

1.安裝VMware虛擬機,安裝linux系統,此處使用centOS6.5 64位,安裝linux命令行工具,上傳文件工具,此處使用SecureCRT,SecureFX 。安裝教程再也不贅述,百度一大堆..........

這步有問題請使勁點:www.baidu.com

 

 

2.在linux上安裝jdk:

安裝jdk:卸載openjdk版本,上傳解壓jdk,配置環境變量----參考:http://jingyan.baidu.com/article/ab0b56308966acc15afa7d18.html

 

1、Nginx反向代理與負載均衡:

架構圖:

 

此時須要用到三臺服務器,一臺nginx服務器,兩臺正式部署項目的服務器:選擇的是192.168.50.133主nginx和192.168.50.137,192.168.50.139兩臺tomcat服務器

首先在兩臺服務器上安裝tomcat:這個也是簡單,很少說

安裝tomcat:上傳解壓便可使用,bin目錄下 startup.sh啓動,shutdown.sh關閉

配置防火牆端口:vim /etc/sysconfig/iptables 編輯,開放8080端口,80端口等一些經常使用端口,固然後邊有用到一些端口都是須要配置開放的,不建議關閉防火牆

編輯好後 service iptables restart 從新加載防火牆配置

 

若是是本身測試嫌配置麻煩,關閉防火牆: service iptables stop 重啓後防火牆打開,即在這次開機狀態下有效,徹底關閉再使用 chkconfig iptables off ,即會在重啓後也關閉防火牆,注意有時候服務都起了但訪問出錯,可能就是防火牆問題哦

啓動tomcat訪問:192.168.50.137:8080,192.168.50.139:8080,打開tomcat首頁即成功。

而後編寫測試項目,部署到兩臺tomcat上,eclipse新建web項目,項目名爲testproject,在webapp下新建一個jsp頁面爲index.jsp,添加以下內容

將項目中web.xml中的訪問順序<welcome-file>index.jsp</welcome-file>上移到第一個訪問

 

而後右鍵導出爲war包,testproject.war,將該war包上傳到兩臺服務器的tomcat的webapps中

 

 而後修改tomcat的server.xml文件,在tomcat conf目錄中:可使用notepad++的插件NppFTP直接連上linux,而後使用notepad++修改文件哦,保存記得使用UTF-8無BOM格式,具體去百度吧,哈哈

修改Engine標籤中,添加jvmRoute,用於標識nginx訪問的是哪一個服務器tomcat,137服務器標識爲137Server1,139服務器標識爲139Server2

在兩臺tomcat的server.xml文件,Host標籤中添加:<Context path="" docBase="testproject"/>,path標識訪問路徑,docBase爲項目名,表示訪問項目

此時,從新啓動tomcat,訪問192.168.50.137:8080,192.168.50.139:8080,顯示index.jsp內容:兩臺服務器訪問顯示以下

 

至此,兩臺tomcat服務器搭建完成。

 

在nginx主機192.168.50.133上安裝nginx:

 先使用yum命令安裝gcc,安裝pcre,zlib,openssl:

1
2
3
4
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

 在/usr/local/目錄下新建nginx-src目錄,將nginx-1.8.0.tar.gz放到此處,解壓 

1
tar -zxvf nginx-1.8.0.tar.gz

進入解壓後目錄

依次執行命令:

1
2
3
4
5
./configure
 
make
 
mkae install

 此時nginx安裝完畢,安裝目錄是/usr/local/nginx,nginx默認佔用80端口

其中,sbin目錄爲nginx執行命令,conf目錄下的nginx.conf爲默認加載的配置文件

啓動nginx:

1
./sbin/nginx

關閉nginx:

1
./sbin/nginx -s stop

 啓動nginx後訪問192.168.50.133:80便可訪問nginx:顯示nginx歡迎頁

 

 至此,nginx安裝完畢。

 

 

3.反向代理與負載均衡配置

現有兩臺服務器,一臺爲192.168.50.137,一臺爲192.168.50.139,服務器上各有一臺tomcat,端口均爲8080,在192.168.50.133上有nginx,通過配置nginx,當訪問192.168.50.133:80時,便可訪問192.168.50.137:8080,192.168.50.139:8080中隨機一臺,此時192.168.50.133:80被nginx監聽,當有請求時,代理到192.168.50.137:8080,192.168.50.139:8080隨機一臺便可,即爲nginx反向代理功能,同時此時能夠經過nginx將請求進行轉發,保證了一個入口,將全部請求轉發到兩臺服務器上也減輕了任何一臺的負載壓力,當有大量請求時,能夠搭建大量服務器,在入口代理服務器上使用nginx進行轉發,便是負載均衡功能。

 

 配置便是配置nginx安裝目錄中conf目錄下的nginx.conf文件便可:具體配置以下,重點是紅色部分

#Nginx所用用戶和組
#user  niumd niumd;

#工做的子進程數量(一般等於CPU數量或者2倍於CPU)
worker_processes  2;

#錯誤日誌存放路徑
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;

#指定pid存放文件
pid        logs/nginx.pid;

events {
    #使用網絡IO模型linux建議epoll,FreeBSD建議採用kqueue
    #use epoll;
    
    #容許最大鏈接數
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;


    #定義日誌格式
    #log_format  main  '$remote_addr - $remote_user [$time_local] $request '
    #                  '"$status" $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  off;
    access_log  logs/access.log;

    client_header_timeout  3m;
    client_body_timeout    3m;
    send_timeout           3m;
 
    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    #fastcgi_intercept_errors on; 
   
    error_page 404  /404.html;

    #keepalive_timeout  75 20;

    gzip                 on;
    gzip_min_length      1000;
    gzip_types           text/plain text/css application/x-javascript;

    #配置被代理的服務器
  upstream blank-cc { #ip_hash; server 192.168.50.137:8080; server 192.168.50.139:8080; } 
    server {
            #nginx監聽80端口,請求該端口時轉發到真實目標
            listen 80;
            #配置訪問域名
            server_name localhost;                 
        
            location / {
                #這裏配置代理是指上面定義的兩個被代理目標,blank-cc名字必須一致
                proxy_pass http://blank-cc;
                
                #proxy_redirect          off;
                #若是是非80端口,配置爲Host $host:端口號,目的是將代理服務器收到的用戶的信息傳到真實服務器上
                proxy_set_header Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
                client_body_buffer_size 128k;
                proxy_connect_timeout   300;
                proxy_send_timeout      300;
                proxy_read_timeout      300;
                proxy_buffer_size       4k;
                proxy_buffers           4 32k;
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;
                add_header Access-Control-Allow-Origin *;
            }
            
            #此處定義500 502 503 504的錯誤頁面
            error_page   500 502 503 504  /50x.html;
            #錯誤頁面位置
            location = /50x.html {
            #root表示路徑 html爲nginx安裝目錄中的html文件夾
            #位於/usr/local/nginx/html/下
               root   html;
            }        
    }
}

 

啓動兩臺tomcat,從新啓動nginx:

訪問192.168.50.133:80將會隨機訪問192.168.50.137:8080和192.168.50.139:8080其中一臺。(問題:每次刷新nginx服務器地址sessionid會變,session不能共享。)

 

 

nginx輪詢策略:

nginx負載均衡到多臺服務器上時,默認採用輪詢策略:

常見策略:

一、輪詢

每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。

二、weight
指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況,數字越大命中率越高。
例如:輪詢概率是2:1
upstream bakend {
server 192.168.0.14 weight=2;
server 192.168.0.15 weight=1;
}

二、ip_hash
每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

其餘策略能夠自行查詢學習,nginx還有不少其餘可配置項,靜態資源緩存,重定向等,想深刻的童鞋請自行學習

nginx配置詳解:http://blog.csdn.net/tjcyjd/article/details/50695922

 

實際問題:雖然解決了,可是不是很理解,記錄一下

其中192.168.50.133:80是有外網映射的,外網55.125.55.55:5555映射到192.168.50.133:80上,此時使用55.125.55.55:5555訪問,會映射到192.168.50.133:80上,而後會被轉發到192.168.50.137:8080或192.168.50.139:8080,可是此時卻出現圖片,js,css等靜態文件沒法訪問的狀況,經過兩種方法解決。

<1>.映射非80端口

讓55.125.55.55:5555映射192.168.50.133的非80端口,例如55.125.55.55:5555映射192.168.50.133:5555,而後再在nginx配置文件中配置以下,注意紅色加大部分:這地方不理解

........ upstream blank { #ip_hash; server 192.168.50.137:8080; server 192.168.50.139:8080; } server { #nginx監聽5555端口,請求該端口時轉發到真實目標 listen 5555; #配置訪問域名 server_name 192.168.11.133; location / { #這裏配置代理是指上面定義的兩個被代理目標,blank名字必須一致 proxy_pass http://blank;
 #proxy_redirect off; #非80端口使用,目的是將代理服務器收到的用戶的信息傳到真實服務器上 proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; add_header Access-Control-Allow-Origin *;
  }........

此時訪問55.125.55.55:5555,映射到192.168.50.133:5555上,而後轉發到192.168.50.137:8080或192.168.50.139:8080上,此時靜態文件均能訪問。

 <2>.使用域名在外網服務器上使用nginx進行轉發

將55.125.55.55綁定域名爲test.baidubaidu.com,此時在55.125.55.55服務器上使用nginx,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
........location / {
         #加入判斷,若是域名爲test.baidubaidu.com,轉發到 192.168 . 50.133 : 80 ,而後再進行轉發,注意,此處未進行測試,貌似是這麼寫的,$host爲nginx變量,能夠獲取域名    
         if ($host =  "test.baidubaidu.com"  ){
           proxy_pass http: //192.168.50.133:80;
         }
                 
         #proxy_redirect          off;
         #非 80 端口使用,目的是將代理服務器收到的用戶的信息傳到真實服務器上,我也不是很理解
         proxy_set_header        Host $host:$server_port;
         proxy_set_header        X-Real-IP $remote_addr;
         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
         client_max_body_size    10m;
         client_body_buffer_size 128k;
         proxy_connect_timeout    300 ;
         proxy_send_timeout       300 ;
         proxy_read_timeout       300 ;
         proxy_buffer_size       4k;
         proxy_buffers            4  32k;
         proxy_busy_buffers_size 64k;
         proxy_temp_file_write_size 64k;
         add_header Access-Control-Allow-Origin *;
             }........

 以上即nginx反向代理與負載均衡介紹,通過這次學習,發現nginx確實是博大精深,一個配置文件搞得我不要不要的。。。

 

2、session共享問題:

因爲nginx是隨機分配請求,假設一個用戶登陸時訪問網站登陸時被分配到192.168.50.137:8080上,而後進行了登陸操做,此時該服務器上就會有該用戶登陸的session信息,而後登錄後重定向到網站首頁或我的中心時,此時若是被分配到192.168.50.139:8080上,那麼這臺服務器上沒有該用戶session信息,因而又會變成未登陸狀態,因此因爲nginx的負載均衡會致使session共享的問題。

解決方法:

1.nginx提供了ip_hash策略,能夠保持用戶ip進行hash值計算固定分配到某臺服務器上,而後只要是該ip則會保持分配到該服務器上,保證用戶訪問的是同一臺服務器,那麼session問題就不存在了。這也是解決session共享的一種方式,也稱爲黏性session。可是假設一臺tomcat服務器掛了的話,那麼session也會丟失。因此比較好的方案是抽取session。

2.session存在memcache或者redis中,以這種方式來同步session,把session抽取出來,放到內存級數據庫裏面,解決了session共享問題,同時讀取速度也是很是之快。

 

本例中:

 

 

Redis解決session共享:

在redis服務器192.168.50.140上搭建redis,redis默認端口爲6379

Redis搭建:

redis依賴gcc,先安裝:

1
yum install -y gcc-c++

下載redis,我使用的是redis-3.2.1.tar.gz,上傳至linux /usr/local/redis-src/中,解壓

進入解壓後目錄redis-3.2.1,執行make命令進行編譯

安裝到目錄/usr/local/redis

執行:

1
make PREFIX=/usr/local/redis install

安裝完成以後將redis配置文件拷貝到安裝目錄下,redis.conf是redis的配置文件,redis.conf在redis源碼目錄,port默認6379。

執行命令:

1
cp /usr/local/redis-src/redis- 3.2 . 1 /redis.conf /usr/local/redis/

在redis安裝目錄啓動和關閉redis:

啓動:

1
./bin/redis-server ./redis.conf

這種啓動方式叫作前端啓動,必須保持在當前窗口,若是ctrl + c 退出,那麼redis也就退出了,不建議使用

那麼後端啓動:

首先修改redis.conf中daemonize的值,打開能夠看到默認是no,修改成daemonize yes,啓動便可。也能夠在該配置文件中修改redis默認端口6379爲其餘值。

關閉redis:

1
./bin/redis-cli shutdown

 

 至此,redis服務器搭建完成。

 

 tomcat與redis集成實現session共享:

環境爲tomcat7 + jdk1.6的話:

在全部須要共享session的服務器的tomcat中目錄下:

lib目錄中添加如下三個jar包,注意版本最好一致,否則極容易出現錯誤,下邊的測試是可用的:

conf目錄中content.xml中加入:配置redis服務

1
2
3
4
5
6
<Valve className= "com.radiadesign.catalina.session.RedisSessionHandlerValve" /> 
<Manager className= "com.radiadesign.catalina.session.RedisSessionManager"
host= "192.168.50.140"
port= "6379"
database= "0"  
maxInactiveInterval= "60"  />

 

環境爲tomcat7 + jdk1.7或1.8的話:

在全部須要共享session的服務器的tomcat中目錄下:

lib目錄中添加如下三個jar包,測試經過:

conf目錄中content.xml中加入:配置redis服務

1
2
3
4
5
6
<Valve className= "com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"  />       
<Manager className= "com.orangefunction.tomcat.redissessions.RedisSessionManager"
host= "192.168.50.140"  
port= "6379"  
database= "0"              
maxInactiveInterval= "60" />

 

根據我這測試,是jkd1.8+tomcat7,在137和139兩臺tomcat中加入jar包且進行如上配置:

上傳jar包

 修改content.xml

啓動redis服務,從新啓動全部tomcat,啓動nginx,刷新nginx頁面,兩臺tomcat頁面能夠看到sessionid值不變,關閉某臺tomcat,nginx中sessionid不變,說明session是共享的。

問題:

有可能此時訪問會報錯,redis沒法訪問,這是因爲redis的安全機制,默認只有127.0.0.1才能訪問,在redis.conf中能夠找到bind 127.0.0.1,你能夠將此ip改成訪問者ip,

若是有多個訪問者,也能夠把bind 127.0.0.1註釋掉,而後在配置文件中找到protected-mode,修改protected-mode yes改成protected-mode no 關閉redis保護模式便可

詳細能夠參考這:http://www.cnblogs.com/liusxg/p/5712493.html

 

通過大牛指點:添加兩個注意點:

1.按照如上配置,使用redis數據庫,放入session中的對象必需要實現java.io.Serializable接口,使用memcache的能夠不用實現Serializable接口

緣由是:由於tomcat裏使用的將session放置redis使用的工具類,是使用的jdk序列化模式存儲的,這一點也是很容易理解的,session.setAttribute(String key, Object value),存儲Object類型

object放入redis中又要能取出來,只能是序列化進行存儲了,而後取出的時候進行反序列化。

因此咱們在session中存儲的任何對象,都必須實現序列化接口。

2.按照如上配置,使用redis作session存儲空間時,web應用的session-time的時間單位會變成[秒],而不是本來的[分]

緣由是:由於tomcat裏使用的將session放置redis使用的工具類,在存儲時爲對tomcat容器時間作轉換,

在redis中設置過時時間是使用秒做爲單位的,有個命令叫expire能夠設置redis鍵值過時時間,因此在context.xml配置文件中咱們須要制定session過時時間(默認是60秒,配成1800即30分鐘),這一點很重要。

 

請注意!!!!

context.xml配置說明:

1
2
3
4
5
6
7
8
9
10
<Valve className= "com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"  />      
<Manager className= "com.orangefunction.tomcat.redissessions.RedisSessionManager"
//這裏是redis服務器地址
host= "192.168.50.140"
//這裏是redis端口,redis默認端口是6379
port= "6379"
//這裏是redis數據庫中的標識,標識第0個,默認使用0便可
database= "0"            
//須要注意的是這裏因爲redis過時時間默認設置爲60,單位是秒,session過時時間爲30分鐘,因此須要設置爲1800對應30分鐘
maxInactiveInterval= "1800" />

 

3、keepalived高可用:

架構圖:

上圖畫的不對稱好難看,將就下吧

根據上邊一路走來,已是搭好了從nginx主到服務器的這條線的,那麼同理,使用nginx備機192.168.50.135上再搭建nginx,也是代理192.168.137和139兩臺服務器。搞了一次以後也就簡單了

在192.168.50.135上安裝nginx,配置nginx配置便可,再也不贅述,nginx備機配置以下:

配置和上邊的是同樣的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
........upstream blank {
         #ip_hash;
         server  192.168 . 50.137 : 8080 ;
         server  192.168 . 50.139 : 8080 ;
}
     
     server {
         listen        80 ;
         server_name  localhost;
 
         #charset koi8-r;
 
         #access_log  logs/host.access.log  main;
 
         location / {
             proxy_pass http: //blank;
             root   html;
             index  index.html index.htm;
         }........

 

那麼如今就是至關於有兩套nginx了,代理的服務器是同樣的,爲何要搞兩套?

假設只有一臺nginx的話,這個nginx服務器掛了。那怎麼辦?

因此須要一臺備份nginx。

正常狀況下,主nginx做爲反向代理服務器便可,假設nginx服務器掛了的話,可以當即切換到備份機上,保證用戶能夠訪問,而後運維人員把主nginx服務器故障修好以後,又可以自動切換到主nginx提供服務。經過keepalived來監測兩臺服務器,正常狀況時,將nginx主服務器ip(192.168.50.133)綁定到keepalived定義的一個虛擬ip(我設置爲192.168.50.88)上,經過這個虛擬IP能夠訪問nginx,而後備機(192.168.50.135)啥事不幹,就是每隔一小段時間(設置爲1秒)keepalived會告訴備機,你不用管,我還活着呢,若是忽然主機死了,那麼就會超過一秒備機沒有收到主機或者的消息,那麼備機立刻接管主機,keeplived將虛擬ip綁定到備機身上,網站繼續提供服務。

忽然主機又復活了(運維人員排除故障了),那麼備機又將收到主機的活着的消息,因而將管理權交回給主機,虛擬ip又綁到主機上,大概就是這麼個過程,我的理解。

 

 先在兩臺nginx服務器(主備)上都裝上keepalived:

 下載:這裏使用rpm安裝,是區分32,64位的,不要搞錯了哦

keepalived-1.2.7-3.el6.x86_64.rpm

openssl-1.0.1e-30.el6_6.4.x86_64.rpm

要求必須是openssl-1.0.1e或以上才行、若是版本已經符合(由於安裝nginx時已經安裝openssl,使用yum安裝應該是符合的)、不用再安裝openssl,使用 rpm -q openssl 查看當前openssl版本,我這已是1.0.1e 48的,因此就不安裝了

將兩個rpm安裝包上傳到兩臺nginx服務器,進入上傳到的目錄,運行如下命令安裝:--nodeps是忽略依賴包,固然最好是把依賴包裝上,去掉--nodeps能夠看到錯誤,須要哪些依賴包

若是須要安裝openssl

1
rpm –Uvh --nodeps ./openssl- 1.0 .1e- 30 .el6_6. 4 .x86_64.rpm

 安裝keepalived:

1
  rpm -Uvh --nodeps ./keepalived- 1.2 . 7 - 3 .el6.x86_64.rpm

安裝完畢後再/etc/keepalived/目錄下有個文件 keepalived.conf便是本臺服務器keepalived的核心配置文件了:

重點:keepalived配置,配置文件上邊部分按照下面的配置就好了,配置文件後面的內容能夠不用管,尚未去研究其餘部分

先配置主機192.168.50.133的keepalived,按下邊進行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
! Configuration File  for  keepalived
 
#這是全局配置
global_defs {
    #指定keepalived在發生切換時須要發送email到的對象,一行一個
    notification_email {
      acassen @firewall .loc
      failover @firewall .loc
      sysadmin @firewall .loc
    }
    #指定發件人
    notification_email_from Alexandre.Cassen @firewall .loc
    #指定smtp服務器地址
    #smtp_server  192.168 . 200.1
    #指定smtp鏈接超時時間
    #smtp_connect_timeout  30
    #運行keepalived機器的一個標識
    router_id LVS_DEVEL
}
 
#主備配置
vrrp_instance VI_1 {
     #標示狀態爲MASTER 備份機爲BACKUP
     state MASTER
     #設置keepalived實例綁定的服務器網卡,通常爲eth0,linux使用ifconfig命令可查看當前服務器網卡標識名
     interface  eth0
     #同一實例下(即同一組主備機下)virtual_router_id必須相同
     virtual_router_id  51
     #MASTER權重要高於BACKUP,MASTER爲 100 則BACKUP最大爲 99
     priority  100
     #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒,設置爲 1
     advert_int  1
     #設置認證
     authentication {
         #主從服務器驗證方式,PASS爲明文密碼驗證
         auth_type PASS
         #密碼
         auth_pass  1111
     }
     #設置虛擬IP,與咱們的主備機在同一網段下,最後一位隨便給就是拉,能夠設置多個,換行便可
     virtual_ipaddress {
         192.168 . 50.88
     }
}

 

備機192.168.50.135的keepalived配置:

備機配置注意的地方:須要修改state爲BACKUP , priority比MASTER低,virtual_router_id和master的值一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
! Configuration File  for  keepalived
 
#這是全局配置
global_defs {
    #指定keepalived在發生切換時須要發送email到的對象,一行一個
    notification_email {
      acassen @firewall .loc
      failover @firewall .loc
      sysadmin @firewall .loc
    }
    #指定發件人
    notification_email_from Alexandre.Cassen @firewall .loc
    #指定smtp服務器地址
    #smtp_server  192.168 . 200.1
    #指定smtp鏈接超時時間
    #smtp_connect_timeout  30
    #運行keepalived機器的一個標識
    router_id LVS_DEVEL
}
 
#主備配置
vrrp_instance VI_1 {
     #備機爲BACKUP
     state BACKUP
     #備機網卡標識,通常都是eth0,先查詢一下
     interface  eth0
     #virtual_router_id必須與主機相同
     virtual_router_id  51
     #權重,備機必須比主機小
     priority  99
     #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒,設置爲 1
     advert_int  1
     #認證,與主機一致
     authentication {
         auth_type PASS
         auth_pass  1111
     }
     #虛擬IP,綁定的虛擬ip與主機一致
     virtual_ipaddress {
         192.168 . 50.135
     }
}

 

醬紫,keepalived就配置完成了。

keeplived啓動關閉命令:

1
2
service keepalived start
service keepalived stop

 

啓動兩臺nginx,啓動主機keepalived,啓動備機keepalived服務。

這時,nginx主機在提供服務,備機是閒着的,虛擬ip是192.168.50.88,在主機和備機上使用命令

1
ip addr

 能夠發現:

主機:能夠看到,192.168.50.133 帶有虛擬ip192.168.50.88,在瀏覽器中輸入192.168.50.88,便可訪問到主nginx192.168.50.133.而後轉發到tomcat服務器上

 

瀏覽器訪問虛擬ip:192.168.50.88,效果以下

 

 

 

 備機:ip addr命令執行:能夠看到,備機nginx沒有綁定虛擬ip

 

 以上是初始狀態下的狀況,也是正常服務的狀況。

 

如今測試高可用,假設主機nginx服務器掛了,模擬爲關閉nginx主機或者將keepalived服務中止,那麼主機上keepalived死了就沒辦法告訴備機本身活着,而備機超過1秒沒有接收到主機給本身的消息,立刻接管虛擬ip,同時在配置文件中配置切換主備機時發送郵件,此時開發團隊收到郵件即知道主機掛了,立刻去排除主機的故障。

將主機上的keepalived服務中止,service keepalived stop ,而後查看虛擬ip綁定狀況,

主機掛了:能夠看到虛擬ip就沒有綁在主機上

備機狀況:虛擬ip已經綁定到備機,此時主機雖然掛了,可是切換到備機上了(發現故障和切換的時間差最大也就是1秒),虛擬ip也綁到備機上了,訪問虛擬ip,就會請求備機nginx而後轉發到web服務器實現高可用。

 

 

 運維人員收到郵件後就去排除主機故障了,搞定以後(模擬爲keepalived服務啓動),這時主機告訴備機,我又活了,因而備機將管理權又交給主機(切換爲主機nginx提供服務):

主機keepalived服務啓動後,即吧主機維護好以後:能夠看到,虛擬ip又自動綁到了主機上

 

 

 備機狀況,主機活了以後,備機轉交管理權,虛擬ip切換到主機上,備機不綁定虛擬ip,貌似啓動keepalived服務以後並不能立刻切回,應該是起服務須要點時間吧,可是不影響,這段時間仍是備機綁定虛擬IP的

 

 這就是keepalived高可用的模擬。

 

注意問題:

主機掛了以後,主機nginx恢復時,必定要將nginx也啓動,不然即便虛擬ip切換到了主機上,可是主機nginx沒起那也是無法轉發的。因此要把nginx啓動要加在開機啓動中。

 

4、Nginx服務開機自啓動:

 

在linux系統的/etc/init.d/目錄下建立nginx文件,使用以下命令:(vim命令不會的本身去學吧哈哈)

 

1
vi /etc/init.d/nginx

 

 

 

將以下內容搞到該文件中:注意紅色部分修改爲你的路徑便可,nginxd值是啓動nginx的nginx路徑,nginx_config值是nginx配置文件nginx.conf路徑,nginx_pid值是nginx.pid所在路徑,若是按照我方法安裝的話,是在nginx安裝目錄的logs裏邊的

#!/bin/bash # nginx Startup script for the Nginx HTTP Server # it is v.0.0.2 version. # chkconfig: - 85 15 # description: Nginx is a high-performance web and proxy server. # It has a lot of features, but it's not for everyone. # processname: nginx # pidfile: /usr/local/nginx/logs/nginx.pid # config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx nginx_config=/usr/local/nginx/conf/nginx.conf nginx_pid=/usr/local/nginx/logs/nginx.pid RETVAL=0 prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions # Source networking configuration.
. /etc/sysconfig/network # Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0 [ -x $nginxd ] || exit 0 # Start nginx daemons functions.
start() { if [ -e $nginx_pid ];then echo "nginx already running...." exit 1 fi echo -n $"Starting $prog: " daemon $nginxd -c ${nginx_config} RETVAL=$? echo [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx return $RETVAL } # Stop nginx daemons functions.
stop() { echo -n $"Stopping $prog: " killproc $nginxd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid } # reload nginx service functions.
reload() { echo -n $"Reloading $prog: "
    #kill -HUP `cat ${nginx_pid}`
    killproc $nginxd -HUP RETVAL=$? echo } # See how we were called.
case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|reload|status|help}" exit 1 esac exit $RETVAL

 

 

而後設置該文件的訪問權限:執行如下命令,意爲全部用戶可訪問

 

1
chmod a+x /etc/init.d/nginx

 

 最後將ngix加入到rc.local文件中,這樣開機的時候nginx就默認啓動了

 

1
vi /etc/rc.local

 

添加

 

1
/etc/init.d/nginx start

 

 

 

保存並退出,下次重啓就會生效,nginx的開機自啓動。測試無誤的。

 

 

4、解決nginx進程和keepalived不一樣時存在問題:

 

keepalived是經過檢測keepalived進程是否存在判斷服務器是否宕機,若是keepalived進程在,可是nginx進程不在了,那麼keepalived是不會作主備切換。由於是nginx掛了,而後沒法作代理,keepalived還在不會切換到備機。

因此一直檢測nginx是否還在,若是不在,那麼讓keepalived也中止,同生共死。

注:只須要在主機上搞就好了,備機不必檢測nginx,由於基本是主機在服務。

解決:寫個腳原本監控nginx進程是否存在,若是nginx不存在就將keepalived進程殺掉。

注:keepalived不須要開機啓動,假如開機自啓的話,若是keepalived比nginx 更快啓動的話,腳本檢測會把keepalived停掉的,因此不必,只須要nginx開機啓動,啓動主機後自行手動的把keepalived服務啓動便可。

 

在主nginx上編寫nginx進程檢測腳本(check_nginx_dead.sh),在keepalived配置文件目錄下建立腳本:

 

1
vi /etc/keepalived/check_nginx_dead.sh

 

把下邊這些內容搞到腳本文件中,內容以下:

 

1
2
3
4
5
6
#!/bin/bash
# 若是進程中沒有nginx則將keepalived進程kill掉
A=`ps -C nginx --no-header |wc -l`      ## 查看是否有 nginx進程 把值賦給變量A
if  [ $A -eq  0  ];then                    ## 若是沒有進程值得爲 零
        service keepalived stop          ## 則結束 keepalived 進程
fi

 

給訪問權限:否則不行哦,這裏卡了我半小時

1
chmod a+x /etc/keepalived/check_nginx_dead.sh

 

 

先測試一下腳本:

把nginx停了,此時keepalived還在運行,因此不會切換,虛擬ip沒法訪問到web服務器

而後執行腳本:

主機腳本檢測nginx不在了,把keepalived停掉,從輸出能夠看到確實中止了,主機虛擬沒有綁定虛擬ip

備機:成功綁定虛擬ip

 

 

因此,只須要讓該腳本一直執行,即一直檢測nginx進程是否在,若是沒得了,那麼直接中止主機keepalived,切換備機,保證可以訪問web服務器。

按以下修改keepalived配置文件keepalived.conf,添加腳本定義檢測:

只須要在正確的位置添加紅色部分便可:那麼腳本則是兩秒執行一次,一旦發現主機nginx不在了,keepalived中止,切換備機

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
! Configuration File  for  keepalived
 
#這是全局配置
global_defs {
    #指定keepalived在發生切換時須要發送email到的對象,一行一個
    notification_email {
      acassen @firewall .loc
      failover @firewall .loc
      sysadmin @firewall .loc
    }
    #指定發件人
    notification_email_from Alexandre.Cassen @firewall .loc
    #指定smtp服務器地址
    #smtp_server  192.168 . 200.1
    #指定smtp鏈接超時時間
    #smtp_connect_timeout  30
    #運行keepalived機器的一個標識
    router_id LVS_DEVEL
}
 
vrrp_script check_nginx_dead {
     ##監控腳本路徑
     script  "/etc/keepalived/check_nginx_dead.sh"
     ##時間間隔, 2
     interval  2
     ##權重
     weight  2                                            
}
 
#主備配置
vrrp_instance VI_1 {
     #標示狀態爲MASTER 備份機爲BACKUP
     state MASTER
     #設置keepalived實例綁定的服務器網卡,通常爲eth0,linux使用ifconfig命令可查看當前服務器網卡標識名
     interface  eth0
     #同一實例下(即同一組主備機下)virtual_router_id必須相同
     virtual_router_id  51
     #MASTER權重要高於BACKUP,MASTER爲 100 則BACKUP最大爲 99
     priority  100
     #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒,設置爲 1
     advert_int  1
     #設置認證
     authentication {
     #主從服務器驗證方式,PASS爲明文密碼驗證
         auth_type PASS
     #密碼
         auth_pass  1111
     }
     
     track_script {
     #監控腳本
         check_nginx_dead     
     }
     
     #設置虛擬IP,與咱們的主備機在同一網段下,最後一位隨便給就是拉,能夠設置多個,換行便可
     virtual_ipaddress {
         192.168 . 50.88
     }
}

 

保存後,從新啓動主機keepalived服務便可。

 

測試:

回到負載均衡高可用的初始狀態,保證主、備上的keepalived、nginx所有啓動。

中止主nginx服務:

主機查看keepalived進程,發現沒有,說明已經中止了,虛擬ip也沒有綁在主機上

 

 備機:綁定虛擬ip,切換成功。

 

 

 測試經過,若是主機nginx掛了以後,keepalived也會隨着掛掉,而後切換備機。

 

轉載自:http://blog.coocap.com/?p=92

相關文章
相關標籤/搜索