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

简介:

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

 

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

实现系统:CentOS 5.5 32bit

一、准备工作:

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

 
  1. # yum groupinstall "Development Libraries" "Development Tools" 

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

 
  1. # 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添加个用户:

 
  1. # groupadd nginx 
  2. # useradd -g nginx nginx 

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

 
  1. # cd /usr/local/src 
  2. 解压那两个扩展模块包 
  3. # unzip nginx-upstream-jvm-route-master.zip 
  4. # unzip nginx_upstream_check_module-master.zip 
  5. 之后再来安装nginx 
  6. # tar zxvf nginx-1.2.5.tar.gz 
  7. # cd nginx-1.2.5 
  8. 下面对nginx加入扩展模块 
  9. # patch -p0 < ../nginx-upstream-jvm-route-master/jvm_route.patch  
  10. # patch -p1 < ../nginx_upstream_check_module-master/check1.2.2+.patch (在nginx 1.2以上的版本都要用这个patch不然后会报错的) 
  11. # ./configure --prefix=/usr/local/nginx \
  12. > --user=nginx --group=nginx --with-http_ssl_module \
  13. > --with-http_flv_module --with-http_stub_status_module \
  14. > --with-http_gzip_static_module --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  15. > --with-pcre \
  16. > --add-module=/usr/local/src/nginx_upstream_check_module-master \
  17. > --add-module=/usr/local/src/nginx-upstream-jvm-route-master 
  18. 如果没有什么报错的话在结尾处会看如下所示的内容: 
  19. configuring additional modules 
  20. adding module in /usr/local/src/nginx_upstream_check_module-master 
  21. checking for ngx_http_upstream_check_module ... found 
  22.  + ngx_http_upstream_check_module was configured 
  23. adding module in /usr/local/src/nginx-upstream-jvm-route-master 
  24.  + ngx_http_upstream_jvm_route_module was configured 
  25. checking for PCRE library ... found 
  26. checking for PCRE JIT support ... not found 
  27. checking for OpenSSL library ... found 
  28. checking for zlib library ... found 
  29. creating objs/Makefile 
  30. 之后就可以make和make install了 
  31. # make 
  32. # make install 

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

 
  1. # vim /etc/init.d/nginx 
  2. 内容如下: 
  3. #!/bin/sh  
  4. # nginx - this script starts and stops the nginx daemon  
  5. # chkconfig:     - 85 15     
  6. # description:    Nginx is an HTTP(S) server, HTTP(S) reverse \  
  7. #                             proxy and IMAP/POP3 proxy server  
  8. # processname: nginx  
  9. # config:            /etc/nginx/nginx.conf  
  10. # config:            /etc/sysconfig/nginx  
  11. # pidfile:         /var/run/nginx.pid  
  12. # Source function library.  
  13. . /etc/rc.d/init.d/functions 
  14. # Source networking configuration.  
  15. . /etc/sysconfig/network 
  16. Check that networking is up.  
  17. "$NETWORKING" = "no" ] && exit 0 
  18. nginx="/usr/local/nginx/sbin/nginx" 
  19. prog=$(basename $nginx) 
  20. NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" 
  21. [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx 
  22. lockfile=/var/lock/subsys/nginx 
  23. make_dirs() { 
  24.      # make required directories  
  25.      user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` 
  26.      options=`$nginx -V 2>&1 | grep 'configure arguments:'
  27.      for opt in $options; do 
  28.              if [ `echo $opt | grep '.*-temp-path'` ]; then 
  29.                      value=`echo $opt | cut -d "=" -f 2` 
  30.                      if [ ! -d "$value" ]; then 
  31.                              # echo "creating" $value  
  32.                              mkdir -p $value && chown -R $user $value 
  33.                      fi 
  34.              fi 
  35.      done 
  36. start() { 
  37.         [ -x $nginx ] || exit 5 
  38.         [ -f $NGINX_CONF_FILE ] || exit 6 
  39.         make_dirs 
  40.         echo -n $"Starting $prog: "  
  41.         daemon $nginx -c $NGINX_CONF_FILE 
  42.         retval=$? 
  43.         echo  
  44.         [ $retval -eq 0 ] && touch $lockfile 
  45.         return $retval 
  46. stop() { 
  47.         echo -n $"Stopping $prog: "  
  48.         killproc $prog -QUIT 
  49.         retval=$? 
  50.         echo  
  51.         [ $retval -eq 0 ] && rm -f $lockfile 
  52.         return $retval 
  53. restart() { 
  54.         configtest || return $? 
  55.         stop 
  56.         sleep 1 
  57.         start 
  58. reload() { 
  59.         configtest || return $? 
  60.         echo -n $"Reloading $prog: "  
  61.         killproc $nginx -HUP 
  62.         RETVAL=$? 
  63.         echo  
  64. force_reload() { 
  65.         restart 
  66. configtest() { 
  67.     $nginx -t -c $NGINX_CONF_FILE 
  68. rh_status() { 
  69.         status $prog 
  70. rh_status_q() { 
  71.         rh_status >/dev/null 2>&1 
  72. case "$1" in 
  73.         start) 
  74.                 rh_status_q && exit 0 
  75.                 $1 
  76.                 ;; 
  77.         stop) 
  78.                 rh_status_q || exit 0 
  79.                 $1 
  80.                 ;; 
  81.         restart|configtest) 
  82.                 $1 
  83.                 ;; 
  84.         reload) 
  85.                 rh_status_q || exit 7 
  86.                 $1 
  87.                 ;; 
  88.         force-reload) 
  89.                 force_reload 
  90.                 ;; 
  91.         status) 
  92.                 rh_status 
  93.                 ;; 
  94.         condrestart|try-restart) 
  95.                 rh_status_q || exit 0 
  96.                         ;; 
  97.         *) 
  98.                 echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"  
  99.                 exit 2 
  100. esac 
  101.  
  102. 保存后退出,并给它一个执行的权限。 
  103. # chmod +x /etc/init.d/nginx 

下面就可以启动了,

 
  1. # service nginx start 
  2. Starting nginx:                                            [  OK  ] 

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

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

 
  1. #user  nobody;   //运行nginx的用户,默认是nobody 
  2. worker_processes  1; //这个是设定nginx开启的进程数,每个进程数据平均消耗10MB-20MB内存,一般一个就够了,如果是多核cpu建议指定和cpu的数量一样多的进程即可。 
  3. #error_log  logs/error.log;  //设定错误日志 
  4. #error_log  logs/error.log  notice; 
  5. #error_log  logs/error.log  info; 
  6. #pid        logs/nginx.pid; //设定进程的id的存储文件位置 
  7. events {    //events指令用来设定Nginx的工作模式及其连接数的上限。 
  8.     use epoll;  //设定epoll为Nginx的工作模式。 
  9.     worker_connections  1024; 
  10. http { 
  11.     include       mime.types; 
  12.     default_type  application/octet-stream; 
  13.     sendfile        on; 
  14.     tcp_nopush     on; 
  15.     keepalive_timeout  60; 
  16.  
  17.     gzip  on; 
  18.     gzip_min_length 1k; 
  19.     gzip_buffers 4 16k; 
  20.     gzip_http_version 1.0; 
  21.     gzip_comp_level 2; 
  22.     gzip_types text/plain application/x-javascript text/css application/xml; 
  23.     gzip_vary on; 
  24.  
  25.     upstream tomcat { 
  26.         ip_hash;  //采用ip_hash调度算法
  27.         server 192.168.1.222:8080; 
  28.         server 192.168.1.222:9080; 
  29.         check interval=3000 rise=2 fall=5 timeout=1000; \\这个是后台的健康检测 
  30.         } 
  31.     server { 
  32.         listen       80; 
  33.         server_name  localhost; 
  34.         index index.jsp index.action; 
  35.         root /usr/local/tomcat/app1/apps/fis; 
  36.  
  37.         location ~ .*\.(jsp|action|js)$ { 
  38.                 proxy_pass      http://tomcat; 
  39.                 proxy_redirect  off; 
  40.                 proxy_set_header        Host    $http_host; 
  41.                 proxy_set_header        X-Real-IP       $remote_addr; 
  42.                 proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for; 
  43.                 chunked_transfer_encoding       off; 
  44.         } 
  45.  
  46.         location /status {          //在网页上查看后台tomcat和状态 
  47.                 check_status; 
  48.                 access_log off; 
  49.         } 
  50.         error_page   500 502 503 504  /50x.html; 
  51.         location = /50x.html { 
  52.             root   html; 
  53.         } 
  54.     } 
  55.                                                               

在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的内容简单的说到这里了。



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

相关文章
|
3月前
|
缓存 前端开发 JavaScript
tomcat核心技术+Nginx性能调优技术
而Tomcat的基本配置,每个配置项也基本上对应了Tomcat的组件结构,如果要用一张图来形象展现一下Tomcat组成的话
39 1
|
3月前
|
Java 应用服务中间件 Apache
简介Nginx,Tomcat和 Apache
简介Nginx,Tomcat和 Apache
简介Nginx,Tomcat和 Apache
|
4月前
|
负载均衡 应用服务中间件 nginx
百度搜索:蓝易云【Nginx和tomcat实现负载均衡教程】
至此,你已经成功地使用Nginx和Tomcat实现了负载均衡。Nginx将根据配置的负载均衡策略将客户端请求分发到多个Tomcat服务器上,以提高系统的性能和可用性。请注意,在实际生产环境中,还需要进行其他配置和优化,如健康检查、会话保持等,以满足具体的需求。
35 0
|
4月前
|
负载均衡 安全 前端开发
百度搜索:蓝易云【Nginx与Tomcat负载均衡-动静分离教程】
这些是将Nginx与Tomcat结合使用实现负载均衡和动静分离的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
49 1
|
11天前
|
运维 Java 应用服务中间件
Nginx+Tomcat动静分离及Nginx优化(企业案例)
Nginx+Tomcat动静分离及Nginx优化(企业案例)
|
5月前
|
负载均衡 安全 应用服务中间件
Nginx + Tomcat+HTTP/HTTPS实现负载均衡实例
Nginx + Tomcat+HTTP/HTTPS实现负载均衡实例
179 0
|
5月前
|
负载均衡 算法 应用服务中间件
Nginx+Tomcat实现反向代理与负载均衡入门
Nginx+Tomcat实现反向代理与负载均衡入门
185 0
|
25天前
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置
|
9天前
|
XML Java 应用服务中间件
Tomcat_servlet部署、编译、配置、打包
Tomcat_servlet部署、编译、配置、打包
14 0
|
23天前
|
运维 Java 应用服务中间件
Tomcat详解(二)——tomcat安装与配置
Tomcat详解(二)——tomcat安装与配置
21 1