Nginx+Tomcat+Keepalived+Memcache 負載均衡動靜分離技術

1、概述javascript

   Nginx 做負載均衡器的優勢許多,簡單歸納爲:php

   ①實現了可彈性化的架構,在壓力增大的時候能夠臨時添加Tomcat服務器添加到這個架構裏面去;css

   ②upstream具備負載均衡能力,能夠自動判斷下面的機器,而且自動踢出不能正常提供服務的機器;html

Keepalived 可實現 Nginx負載均衡器雙機互備,任意一臺機器發生故障,對方都可以將虛擬IP接管過去。java

Memcache能夠實現Tomcat服務器的Sission共享整個拓補以下:mysql

 

 

注意:linux

 一、因爲服務器有限,IP相同的爲同一臺機。只是端口不同。nginx

 二、mysql部分本文再也不描述,請看以前的文章MYSQL + MHA +keepalive + VIP安裝配置.c++

2、環境web

服務器:192.168.1.201 安裝軟件:Keepalived一、Memcache一、Nginx1(反向代理)
服務器:192.168.1.205 安裝軟件:Keepalived二、Memcache二、Nginx2(反向代理)
服務器:192.168.1.231 安裝軟件:Tomcat一、Nginx1(靜態處理)
服務器:192.168.1.232 安裝軟件:Tomcat二、Nginx2(靜態處理)

3、Nginx的安裝

一、下載最新有穩定包:

shell>wget http://nginx.org/download/nginx-1.4.7.tar.gz

二、安裝相關組件

#先安裝環境
shell>yum -y install gcc openssl-devel zlib-devel pcre-devel
shell>yum -y install gcc gcc-c++ autoconf automake         //安裝編譯gcc環境
shell>useradd -s /sbin/nologin -M nginx        //添加nginx 用戶,沒有登陸shell,沒有家目錄.
shell>wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.zip //下載依賴組件,固然還有其它組件。
shell>unzip pcre-8.35.zip
shell>cd pcre-8.35
shell>./configure --prefix=/opt/pcre/
shell>make && make install

 注意:可能還有其它組件要安裝,請看:Linux Nginx 安裝配置

三、安裝Nginx

shell>tar -zxvf nginx-1.4.7.tar.gz
shell>#./configure \ 
  --prefix=/opt/nginx \                             //安裝路徑
  --sbin-path=/usr/sbin/nginx \                           //可執行文件路徑
  --conf-path=/etc/nginx/nginx.conf \                //默認爲<prefix>/conf/nginx.conf 最好定義到/etc下
  --pid-path=/var/run/nginx/nginx.pid  \                  //pid文件存放位置,後面將會用到
  --error-log-path=/var/log/nginx/error.log \             //錯誤日誌文件,默認爲<prefix>/logs/error.log
  --http-log-path=/var/log/nginx/access.log \             //訪問日誌,默認爲<prefix>/logs/access.log
  --lock-path=/var/lock/nginx.lock \           
  --user=nginx \
  --group=nginx \ 
  --with-http_stub_status_module \                        //以取得一些nginx的運行狀態
  --with-http_ssl_module \                                //支持https加密鏈接
  --with-http_gzip_static_module \                        //靜態緩存模塊
  --with-http_realip_module  \                            //讓Nginx透明獲取客戶端IP
  --http-client-body-temp-path=/var/tmp/nginx/client/ \   //指定http客戶端請求緩存文件存放目錄
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \          //指定http反向代理緩存文件存放目錄
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/         //指定FastCGI緩存文件存放目錄
   --with-pcre=/opt/pcre/
shell>make 
shell>make install

 注意:./configure 中不少註解,執行時多注意。

四、讓Nginx以服務形式啓動

vim /etc/init.d/nginx

#!/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: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/sbin/nginx
nginx_config=/etc/nginx/nginx.conf
nginx_pid=/var/run/nginx/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

注意:nginx各文件的安裝路徑要與實際安裝的一致。

保存nginxd腳本,賦予執行權限,添加服務和開機啓動
#chmod +x /etc/init.d/nginx
#chkconfig --add nginx

五、啓動

shell>service nginx start
shell>service nginx restart
shell>service nginx stop

 訪問:http://127.0.0.1/      

 注意:iptables 是否開放80端口

六、Nginx 負載均衡的配置

vim /etc/nginx/nginx.conf

(1)、在http{}中增長:

gzip  on;
 gzip_min_length  1100;
 gzip_buffers     4 8k;
 gzip_types       text/plain text/css application/x-javascript image/bmp application/javascript;
 
 upstream tomcat_server{  #tomcat負載均衡配置
       server 192.168.1.231:8080 weight=1;  
       server 192.168.1.232:8080 weight=1;
 }
 upstream nginx_server { #nginx負載均衡配置
       server 192.168.1.231 weight=1;
       server 192.168.1.232 weight=1;
 }

 

(2)、在http中的server以下:

server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        <span style="color: #ff0000;">location ~ .*\.    (htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$  {
           expires      30d;
           proxy_pass http://nginx_server;   #反向代理,靜態的由nginx來處理。
        }</span>
       <span style="color: #ff0000;"> location ~ .*\.(js|css)?$ {
           expires      1h;
           proxy_pass http://nginx_server;   #反向代理,靜態的由nginx來處理。
        }
      
        location / {
           proxy_set_header  Host $host;
           proxy_set_header  X-Real-IP  $remote_addr;
           proxy_pass http://tomcat_server; #反向代理,其它的由tomcat來處理。
        }</span>
        
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
       # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
 
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
 
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
}

 

七、反射代理兩臺(192.168.1.201\205)Nginx 配製如上。

八、靜態處理兩臺(192.168.1.231\232)Nginx  不用配置第6步:Nginx 負載均衡的配置就能夠了。

4、Keepalived安裝 

一、Keepalived安裝部分參考:MYSQL + MHA +keepalive + VIP安裝配置(三)-----keepalived安裝配置

    注意:只安裝在192.168.1.201\205兩臺服務器上。

二、Keepalived配置,這裏實現兩臺互爲熱備。爲了避免浪費資源,提供了兩個VIP(207\208)能夠同時執行兩個項目。

(1)、服務器:192.168.1.201的配製以下:

! Configuration File for keepalived
 
global_defs {
   notification_email {
     licm@hyxt.com
   }
   notification_email_from sunney888@qq.com
   smtp_server smtp.qq.com
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script check_nginx {
   script "/root/check_nginx.sh"
   interval 2
   weight 2
}
vrrp_sync_group VG1 {
     group {
          VI_1
     }
}
vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 61
    mcast_src_ip 192.168.1.201
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
 
    virtual_ipaddress {
        192.168.1.208
    }
    track_script {
      check_nginx
    }
}
vrrp_instance VI_2 {
    state SLAVE
    interface eth1
    virtual_router_id 60
    mcast_src_ip 192.168.1.201
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
 
    virtual_ipaddress {
        192.168.1.207
    }
    track_script {
      check_nginx
    }
}

(2)、服務器:192.168.1.205的配製以下:

! Configuration File for keepalived
 
global_defs {
   notification_email {
     licm@hyxt.com
   }
   notification_email_from sunney888@qq.com
   smtp_server smtp.qq.com
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script check_nginx {
   script "/root/check_nginx.sh"
   interval 2
   weight 2
}
vrrp_sync_group VG1 {
     group {
          VI_1
     }
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 60
    mcast_src_ip 192.168.1.205
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.207
    }
    track_script {
      check_nginx
    }
}
vrrp_instance VI_2 {
    state SLAVE
    interface eth0
    virtual_router_id 61
    mcast_src_ip 192.168.1.205
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
  }
    virtual_ipaddress {
        192.168.1.208
    }
    track_script {
      check_nginx
    }
}

 

注意:這不說明每一個參數的意義,請查看: MYSQL + MHA +keepalive + VIP安裝配置(三)-----keepalived安裝配置 只是配置不同。

5、Tomcat安裝

一、Tomcat下載,下載最新的吧。

shell>http://apache.fayea.com/apache-mirror/tomcat/tomcat-7/v7.0.53/bin/apache-tomcat-7.0.53.tar.gz
shell>tar -zxvf apache-tomcat-7.0.53.tar.gz

注意:這裏解壓就能夠不用安裝。

二、啓動與中止

shell>/usr/local/apache-tomcat-7.0.53/bin/startup.sh 
shell>/usr/local/apache-tomcat-7.0.53/bin/shutdown.sh 

 

 注意:tomcat默認端口是8080,確保 iptable是否開通端口。

          固然你也能夠配置成以服務的形式來啓動/中止。這不在處理。

6、Memcache安裝與配置

一、memcache安裝,詳細安裝請看這:linux MemCache安裝手冊 這不在說明。

     服務器(192.168.1.201/205)安裝方法同樣。

     注意:memcache默認端口是11211,確保 iptable是否開通端口。

二、memcache的啓動

/usr/local/bin/memcached -d -m 50 -u root -l 192.168.1.201 -p 11211 -c 2048 -P /tmp/memcached.pid
沒錯誤提示的話,證實安裝成功而且啓動了Memcached服務了。
Memcached基本說明:
啓動參數:
-d選項是啓動一個守護進程,
-m是分配給Memcache使用的內存數量,單位是MB
-u是運行Memcache的用戶
-l是監聽的服務器IP地址
-p是設置Memcache監聽的端口
-c選項是最大運行的併發鏈接數,默認是1024
-P是設置保存Memcache的pid文件
結束Memcached進程使用以下語句:
kill `cat /tmp/memcached.pid`

三、memcache測試鏈接

telnet 192.168.1.201 11211 鏈接成功後

7、配置session共享

一、tomcat的context.xml

     vim /usr/local/apache-tomcat-7.0.53/conf/context.xml

     增長以下內容:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
    memcachedNodes="n1:192.168.1.201:11211,n2:192.168.1.205:11211"           
    requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
    sessionBackupAsync="false" 
    sessionBackupTimeout="1800000" 
    copyCollectionsForSerialization="false" 
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>

 注意:memcachedNodes是memcached的節點。能夠有多點。

二、增長jar包

    (1)、下載包,地址:http://repo1.maven.org/maven2/de/javakaffee/msm/   

memcached-session-manager-1.8.1.jar
memcached-session-manager-tc7-1.8.1.jar
msm-flexjson-serializer-1.8.1.jar
msm-javolution-serializer-1.8.1.jar
msm-kryo-serializer-1.8.1.jar
msm-serializer-benchmark-1.8.1.jar
msm-xstream-serializer-1.8.1.jar

  (2)、javolution-5.4.3.1.jar、spymemcached-2.8.4.jar這兩個包要另外下載。

    (3)、把下載的這9個包放到兩臺tomcat服務器上的lib目錄下。

9、測試

    把馬有安裝的服務都啓動。把一個要測試的項目同時放到。兩個tomcat服務器上及兩個Nginx靜態處理服務器上。訪問VIP:http://192.168.1.207/項目名稱。

   注意:

   一、測試方法先確證兩臺tomcat的項目能用他本身的IP能正常訪問。

   二、再訪問VIP:http://192.168.1.207/項目名稱。測試一下圖片、JS及JSP是從哪一個服務器上調用的。

   三、時間有限這不把測試有具體內容放出來。

10、完成

   寫的比較急。若有不正確之處請指出。讓咱們一塊兒學習。謝謝。

相關文章
相關標籤/搜索