设为首页 收藏本站
查看: 1105|回复: 0

[经验分享] Nginx+tomcat 做负载均衡

[复制链接]

尚未签到

发表于 2018-12-6 12:40:38 | 显示全部楼层 |阅读模式
Nginx+tomcat 做负载均衡  架构描述
  前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面(注:没做动静分离,静态动态全部都转给tomcat)
  优点:实现了可弹性化的架构,在压力增大的时候可以临时添加tomcat服务器添加到这个架构里面去
  一,配置nginx
  1, 下载包
  Wget http://sysoev.ru/nginx/nginx-0.6.32.tar.gz
  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
  2, 安装nginx包
  a.安装pcre
  tar zxvf pcre-7.2.tar.gz
  cd pcre
  ./configure --prefix = /pcre
  Make;make install
  b,安装nginx
  tar zxvf nginx-0.6.32.tar.gz
  cd nginx-0.6.32
  ./configure --prefix=/nginx –with-pcre=/pcre --with-http_rewrite_module
  Make;make install
  3, 修改配置文件
  Vi /nginx/conf/nginx.conf
  #用户组
  user nobody nobody;
  #cpu个数,可以按照实际服务器来计算
  worker_processes 8;
  worker_rlimit_nofile 51200;
  events {
  use epoll;
  #连接数
  worker_connections 8192 ;
  }
  http {
  include mime.types;
  default_type application/octet-stream;
  server_names_hash_bucket_size 128;
  # access_log off;
  # access_log logs/access.log;
  #缓存的时间,(可以根据不同文件设置不同时间)
  # expires 2h;
  tcp_nodelay on;
  keepalive_timeout 30;
  gzip on;
  gzip_min_length 10;
  gzip_buffers 4 8k;
  gzip_http_version 1.1;
  gzip_types text/plain application/x-javascript text/css text/html application/xml;
  sendfile on;
  tcp_nopush on;
  reset_timedout_connection on;
  client_max_body_size 30m;
  #设定负载均衡列表
  upstream backend
  {
  server 172.23.254.2:8080;
  server 172.23.254.3:8080;
  }
  #设定虚拟主机
  server {
  listen 80;
  server_name www.abc.com;
  #对 / 所有做负载均衡(本机nginx采用完全转发,所有请求都转发到后端的tomcat集群)
  location / {
  root /web/www ;
  index index.jsp index.htm index.html;
  proxy_redirect off;
  #保留用户真实信息
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://backend;
  }
  }
  }
  主要在配置proxy与upstream
  Upstream具有负载均衡能力,可以自动判断下面的机器,并且自动踢出不能正常提供服务的机器。
  4,启动程序
  /nginx/sbin/nginx
  5,编写启动脚本
  Vi nginx.sh
  #!/bin/sh
  CWD=`pwd`
  case $1 in
  start)
  /nginx/sbin/nginx;
  ;;
  stop)
  kill -2 `ps -ef|grep "/nginx/sbin/nginx"|grep -v "grep"|awk '{print $2}' `
  ;;
  restart)
  cd "$CMD"
  $0 stop
  $0 start
  ;;
  *)
  echo $"Usage: $0 {start|stop|restart}"
  exit 1
  esac
  exit 0
  二,配置tomcat
  1, 下载tomcat5.59
  tar zxvf tomcat5.59
  2,修改配置文件
  a,配置数据源
  b,优化tomcat最大并发数
  
  c,添加虚拟主机
  (注,主转发的虚拟主机必须用localhost,否则nginx不能通过内网ip转发,而只有通过域名转发
  d,测试
  打开http://ip:8080
  页面能访问则正常
  2, 其他的tomcat服务器也用同样的配置
  三,做tomcat集群
  两台机器 172.23.254.2 172.23.254.3
  做集群需要修改的文件配置有三个地方
  1,修改conf/server.xml配置文件
  a. 找到Engine标签,加入属性 jvmRoute="worker1"
  b.找到Cluster标签,去掉注释,同时修改tcpListenAddress为本机ip 172.23.254.2 (注:这一段Cluster必须放在hosts里面)
  2, 修改应用的web.xml
  修改web应用里面WEB-INF目录下的web.xml文件,加入标签
  
  直接加在之前就可以了
  这个是加入tomcat的session复制的,做tomcat集群必须需要这一步,否则用户的session就无法正常使用。
  3, 开启防火墙
  这两个tomcat之间必须开启防火墙信任。
  分别启动两个tomcat,查看每一个tomcat是否都启动了8080端口以及4001端口
  再用netstat –an 查看链接情况
  tcp 0 0 172.23.254.2:43320 172.23.254.3:4001 ESTABLISHED
  tcp 0 0 172.23.254.2:46544 172.23.254.3:4001 TIME_WAIT
  tcp 0 0 172.23.254.2:40118 172.23.254.3:4001 ESTABLISHED
  tcp 0 0 172.23.254.2:4001 172.23.254.3:48804 ESTABLISHED
  tcp 0 0 172.23.254.2:4001 172.23.254.3:34254 ESTABLISHED
  如果两台机器的4001端口分别建立了连接,则说明集群配置成功,可以进行session复制。
  可能存在的问题
  1, session复制问题
  以前用apache做负载均衡的时候,是选择了用 session sticky的模式,这样的话,用户每次进来都会是同一个服务器中的session,不会被转发到其他的服务器上。在这样的情况下,tomcat即使不做session复制也不会影响用户访问。但是nginx并不支持sticky功能。所以必须要做session复制。否则很多地方就根本没法用。比如登录过程,先等到了第一个tomcat上,产生了一个session,在刷新页面,刷到另外一个tomcat的机器上,没有这个session,就会出现问题了。所以程序员在写jsp的时候也要注意这一点
  举个简单的例子,比如我们在单机应用情况下修改SESSION中用户的某一个数据,那么通常就是:
  User user = (User)request.getSession().getAttribute(“user”);
  User.setName(“my name”);
  这样我们就是直接存取出来,然后进行修改,虽然在单机情况下没有问题,但是在集群条件下,这样就导致了多台WEB服务器上的SESSION不同步的问题,因为SESSION并没有改变,Tomcat无法监视session中某个数据的值是否发生了变化。因此,我们还需要执行如下操作以保证SESSION的同步:
  Request.getSession().setAttribute(“user”, user);
  所以,我们在操作SESSION的时候要特别注意!另外的建议就是,我们应该尽可能的不要修改SESSION中的数据。
  可能经常会遇到session复制不正常的情况。除了在服务端找原因再也程序上找下原因。都是有可能导致session复制不正常的
  2.页面同步
  为确保后面tomcat的服务器上的页面程序是一致的,可以采用如下方式
  a,rsync同步,或者做成页面按钮,提供给编辑,修改了程序即使点击同步
  b,共享区域存储,或者采取drbd网络raid模式
  3,确认nginx可以转发成功,
  在nginx上wget一下后面转发的url(包过端口),如果可以打开,那就可以转发过去。如果不能打开,则无法转发


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-643988-1-1.html 上篇帖子: 配置tomcat启动时的优化参数 下篇帖子: ginx+Tomcat负载均衡配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表