用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