天天看点

用Nginx反向代理多个Tomcat实现负载和session共享

 用Nginx反向代理多个Tomcat实现负载和session共享

之前的一篇博文写了用Apache做反向代理实现Tomcat的负载和session,下面来用Nginx来实现。

实现系统:CentOS 5.5 32bit

一、准备工作:

1、安装服务所需的工具,把开发库和开发工具两个包用yum安装上就行了。

# yum groupinstall "Development Libraries" "Development Tools" 

2、安装nginx之前还要安装pcre-devel包

# yum install pcre-devel 

二、安装Nginx

1、Nginx下载地址:www.nginx.org这个是nginx的官方网站。

为了实现session共享还得下载nginx的扩展模块nginx-upstream-jvm-route-master,下载地址:https://github.com/tbje/nginx-upstream-jvm-route

要想实现后面Tomcat的健康检测,还得下载模块nginx_upstream_check_module-master 下载地址:https://nodeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master

在这里所用的软件默认下载到/usr/local/src目录中

2、安装之前要给nginx添加个用户:

# groupadd nginx 

# useradd -g nginx nginx 

3、安装Nignx,并加入所需的扩展模块

# cd /usr/local/src 

解压那两个扩展模块包 

# unzip nginx-upstream-jvm-route-master.zip 

# unzip nginx_upstream_check_module-master.zip 

之后再来安装nginx 

# tar zxvf nginx-1.2.5.tar.gz 

# cd nginx-1.2.5 

下面对nginx加入扩展模块 

# patch -p0 < ../nginx-upstream-jvm-route-master/jvm_route.patch  

# patch -p1 < ../nginx_upstream_check_module-master/check1.2.2+.patch (在nginx 1.2以上的版本都要用这个patch不然后会报错的) 

# ./configure --prefix=/usr/local/nginx \

> --user=nginx --group=nginx --with-http_ssl_module \

> --with-http_flv_module --with-http_stub_status_module \

> --with-http_gzip_static_module --http-proxy-temp-path=/var/tmp/nginx/proxy/ \

> --with-pcre \

> --add-module=/usr/local/src/nginx_upstream_check_module-master \

> --add-module=/usr/local/src/nginx-upstream-jvm-route-master 

如果没有什么报错的话在结尾处会看如下所示的内容: 

configuring additional modules 

adding module in /usr/local/src/nginx_upstream_check_module-master 

checking for ngx_http_upstream_check_module ... found 

 + ngx_http_upstream_check_module was configured 

adding module in /usr/local/src/nginx-upstream-jvm-route-master 

 + ngx_http_upstream_jvm_route_module was configured 

checking for PCRE library ... found 

checking for PCRE JIT support ... not found 

checking for OpenSSL library ... found 

checking for zlib library ... found 

creating objs/Makefile 

之后就可以make和make install了 

# make 

# make install 

这样Nginx就安装好了,下面给nginx制作一个启动脚本

# vim /etc/init.d/nginx 

内容如下: 

#!/bin/sh  

# nginx - this script starts and stops the nginx daemon  

# chkconfig:     - 85 15     

# description:    Nginx is an HTTP(S) server, HTTP(S) reverse \  

#                             proxy and IMAP/POP3 proxy server  

# processname: nginx  

# config:            /etc/nginx/nginx.conf  

# config:            /etc/sysconfig/nginx  

# pidfile:         /var/run/nginx.pid  

# Source function library.  

. /etc/rc.d/init.d/functions 

# Source networking configuration.  

. /etc/sysconfig/network 

# Check that networking is up.  

[ "$NETWORKING" = "no" ] && exit 0 

nginx="/usr/local/nginx/sbin/nginx" 

prog=$(basename $nginx) 

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" 

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx 

lockfile=/var/lock/subsys/nginx 

make_dirs() { 

     # make required directories  

     user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` 

     options=`$nginx -V 2>&1 | grep 'configure arguments:'` 

     for opt in $options; do 

             if [ `echo $opt | grep '.*-temp-path'` ]; then 

                     value=`echo $opt | cut -d "=" -f 2` 

                     if [ ! -d "$value" ]; then 

                             # echo "creating" $value  

                             mkdir -p $value && chown -R $user $value 

                     fi 

             fi 

     done 

start() { 

        [ -x $nginx ] || exit 5 

        [ -f $NGINX_CONF_FILE ] || exit 6 

        make_dirs 

        echo -n $"Starting $prog: "  

        daemon $nginx -c $NGINX_CONF_FILE 

        retval=$? 

        echo  

        [ $retval -eq 0 ] && touch $lockfile 

        return $retval 

stop() { 

        echo -n $"Stopping $prog: "  

        killproc $prog -QUIT 

        [ $retval -eq 0 ] && rm -f $lockfile 

restart() { 

        configtest || return $? 

        stop 

        sleep 1 

        start 

reload() { 

        echo -n $"Reloading $prog: "  

        killproc $nginx -HUP 

        RETVAL=$? 

force_reload() { 

        restart 

configtest() { 

    $nginx -t -c $NGINX_CONF_FILE 

rh_status() { 

        status $prog 

rh_status_q() { 

        rh_status >/dev/null 2>&1 

case "$1" in 

        start) 

                rh_status_q && exit 0 

                $1 

                ;; 

        stop) 

                rh_status_q || exit 0 

        restart|configtest) 

        reload) 

                rh_status_q || exit 7 

        force-reload) 

                force_reload 

        status) 

                rh_status 

        condrestart|try-restart) 

                        ;; 

        *) 

                echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"  

                exit 2 

esac 

保存后退出,并给它一个执行的权限。 

# chmod +x /etc/init.d/nginx 

下面就可以启动了,

# service nginx start 

Starting nginx:                                            [  OK  ] 

对于JDK与Tomcat的安装配置前面的博文中有详细的说明,在这里就不重复了,下面来配置一下Ngixn代理tomcat并实现session共享,及后端tomcat的健康检测。

对nginx的配置文件如下所示:

#user  nobody;   //运行nginx的用户,默认是nobody 

worker_processes  1; //这个是设定nginx开启的进程数,每个进程数据平均消耗10MB-20MB内存,一般一个就够了,如果是多核cpu建议指定和cpu的数量一样多的进程即可。 

#error_log  logs/error.log;  //设定错误日志 

#error_log  logs/error.log  notice; 

#error_log  logs/error.log  info; 

#pid        logs/nginx.pid; //设定进程的id的存储文件位置 

events {    //events指令用来设定Nginx的工作模式及其连接数的上限。 

    use epoll;  //设定epoll为Nginx的工作模式。 

    worker_connections  1024; 

http { 

    include       mime.types; 

    default_type  application/octet-stream; 

    sendfile        on; 

    tcp_nopush     on; 

    keepalive_timeout  60; 

    gzip  on; 

    gzip_min_length 1k; 

    gzip_buffers 4 16k; 

    gzip_http_version 1.0; 

    gzip_comp_level 2; 

    gzip_types text/plain application/x-javascript text/css application/xml; 

    gzip_vary on; 

    upstream tomcat { 

        ip_hash;  //采用ip_hash调度算法

        server 192.168.1.222:8080; 

        server 192.168.1.222:9080; 

        check interval=3000 rise=2 fall=5 timeout=1000; \\这个是后台的健康检测 

        } 

    server { 

        listen       80; 

        server_name  localhost; 

        index index.jsp index.action; 

        root /usr/local/tomcat/app1/apps/fis; 

        location ~ .*\.(jsp|action|js)$ { 

                proxy_pass      http://tomcat; 

                proxy_redirect  off; 

                proxy_set_header        Host    $http_host; 

                proxy_set_header        X-Real-IP       $remote_addr; 

                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for; 

                chunked_transfer_encoding       off; 

        location /status {          //在网页上查看后台tomcat和状态 

                check_status; 

                access_log off; 

        error_page   500 502 503 504  /50x.html; 

        location = /50x.html { 

            root   html; 

    } 

在Nginx端设置完成了,在这里要说明一下这个配置文件中采用了ip_hash调度算法,还有其他工作模式,在这里就不一一介绍了,说一下ip_hash工作模式,对于每个请求按访问ip的hash结果分配,这样来自同一个ip的访问用户固定访问一个后台的服务器,这个能有效解决动态网页session共享问题。

下面来配置tomcat,主要在sever.xml文件中配置,所需配置和在Apache代理时相同,请参考:

http://zhou123.blog.51cto.com/4355617/981560

配置完成后测试结果如下:

<a href="http://blog.51cto.com/attachment/201303/184808762.jpg" target="_blank"></a>

这个图片说明了,用户访问了jvm1这个服务器,然后把jvm1服务停止后结果如下:

<a href="http://blog.51cto.com/attachment/201303/184906664.jpg" target="_blank"></a>

由此可知session已经共享成功

下面来看一下,后台的健康检测

在浏览器中输入:http://192.168.1.222/status 结果如下:

<a href="http://blog.51cto.com/attachment/201303/185109324.jpg" target="_blank"></a>

当把一台服务停止后:

<a href="http://blog.51cto.com/attachment/201303/185135656.jpg" target="_blank"></a>

这个会很清楚的看到那个服务宕机了。

关于Nginx的内容简单的说到这里了。

本文转自 ZhouLS 51CTO博客,原文链接:http://blog.51cto.com/zhou123/1163090