用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

相关文章
|
1月前
|
负载均衡 应用服务中间件 API
Nginx配置文件详解Nginx负载均衡Nginx静态配置Nginx反向代理
Nginx配置文件详解Nginx负载均衡Nginx静态配置Nginx反向代理
44 4
|
4天前
|
域名解析 弹性计算 应用服务中间件
基于nginx反向代理实现OSS固定域名IP访问
本文基于阿里云OSS手册:https://help.aliyun.com/zh/oss/use-cases/use-an-ecs-instance-that-runs-centos-to-configure-a-reverse-proxy-for-access-to-oss,继续深入讨论如何利用nginx反向代理,实现固定的IP/域名访问OSS bucket。官方文档能够解决大部分的反向代理固定IP访问oss bucket的场景,但是对于必须使用域名作为endpoint的系统,会出现signatrue鉴权问题。本文继续在官方文档的基础上,将反向代理需要域名作为endpoint的场景补齐方案。
|
18天前
|
负载均衡 监控 Unix
[AIGC] Nginx:一个高性能的 Web 服务器和反向代理
[AIGC] Nginx:一个高性能的 Web 服务器和反向代理
|
1月前
|
负载均衡 JavaScript 前端开发
Nginx实现反向代理、负责均衡、动静分离
Nginx实现反向代理、负责均衡、动静分离
|
1月前
|
应用服务中间件 nginx
nginx进行反向代理的配置
在Nginx中设置反向代理的步骤:编辑`/etc/nginx/nginx.conf`,在http段加入配置,创建一个监听80端口、服务器名为example.com的虚拟主机。通过`location /`将请求代理到本地3000端口,并设置代理头。保存配置后,使用`sudo nginx -s reload`重载服务。完成配置,通过example.com访问代理服务器。
27 0
|
1月前
|
应用服务中间件 Nacos nginx
nacos 2.3.2模式 standalone 使用nginx 反向代理之后访问nacos控制台静
nacos 2.3.2模式 standalone 使用nginx 反向代理之后访问nacos控制台静
|
2月前
|
运维 前端开发 应用服务中间件
LNMP详解(七)——Nginx反向代理配置实战
LNMP详解(七)——Nginx反向代理配置实战
24 1
|
4月前
|
负载均衡 安全 前端开发
百度搜索:蓝易云【Nginx与Tomcat负载均衡-动静分离教程】
这些是将Nginx与Tomcat结合使用实现负载均衡和动静分离的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
50 1
|
10月前
|
负载均衡 Java 应用服务中间件
Nginx专题:nginx+tomcat实现动静分离
Nginx专题:nginx+tomcat实现动静分离
106 0
|
8月前
|
缓存 负载均衡 算法
nginx+Tomcat实现负载均衡、动静分离集群部署
nginx+Tomcat实现负载均衡、动静分离集群部署
109 1