用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=$?
- echo
- [ $retval -eq 0 ] && rm -f $lockfile
- return $retval
- }
- restart() {
- configtest || return $?
- stop
- sleep 1
- start
- }
- reload() {
- configtest || return $?
- echo -n $"Reloading $prog: "
- killproc $nginx -HUP
- RETVAL=$?
- echo
- }
- 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
- $1
- ;;
- restart|configtest)
- $1
- ;;
- reload)
- rh_status_q || exit 7
- $1
- ;;
- force-reload)
- force_reload
- ;;
- status)
- rh_status
- ;;
- condrestart|try-restart)
- rh_status_q || exit 0
- ;;
- *)
- 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
配置完成后测试结果如下:
这个图片说明了,用户访问了jvm1这个服务器,然后把jvm1服务停止后结果如下:
由此可知session已经共享成功
下面来看一下,后台的健康检测
在浏览器中输入:http://192.168.1.222/status 结果如下:
当把一台服务停止后:
这个会很清楚的看到那个服务宕机了。
关于Nginx的内容简单的说到这里了。