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

[经验分享] Nginx 服务器 之Nginx与tomcat实现负载均衡

[复制链接]

尚未签到

发表于 2018-11-15 11:47:31 | 显示全部楼层 |阅读模式
http://images2015.cnblogs.com/blog/704904/201612/704904-20161201135814990-1773388573.png
  本文讲解我们如何使用Nginx做反向带服务器,实现nginx与tomcat服务器集群做负载均衡。
一、nginx与tomcat实现负载均衡
  1、在/usr/local/ngnix/conf  创建文件 nginx-tomcat.conf
  文件内容:

user  nobody;  
worker_processes  2;
  
events {
  
    worker_connections  1024;
  
}
  
http{    # upstream 配置一组后端服务器,
  
    # 请求转发到upstream后,nginx按策略将请求指派出某一服务器
  
    # 即配置用于负载均衡的服务器群信息    upstream tomcats{
  
        fair;
  
        server 121.42.41.143:8080;
  
        server 219.133.55.36;
  
    }
  
    server {
  
        listen       80;
  
        server_name  121.42.41.143;
  
        access_log  logs/tomcat-nginx.access.log  combined;        # 反向代理设置,将所有/路径下请求发给本机上的tomcat
  
        location / {            #root   html;            index  index.html index.htm;            #==========Nginx提供的代理============
  
            proxy_set_header X-Forwarded-Host $host;
  
            proxy_set_header X-Forwarded-Server $host;
  
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  
            proxy_pass http://tomcats;
  
        }
  
   }
  
}

  2、使用该配置文件启动nginx (启动前先关闭nginx)
  [root@iZ28b4kreuaZ bin]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx-tomcat.conf
二、配置文件详解:

三、fair策略的安装
  fair策略:根据各个服务器的性能的不同,自动选择使用响应能力强的服务器。该策略是第三方提供的,所以要先安装。
  安装步骤
  1、下载 gnosek-nginx-upstream-fair-a18b409.tar.gz
  2、解压  tar zxvf gnosek-nginx-upstream-fair-a18b409.tar.gz
  3、将解压后的文件移动到 /usr/local目录下并 改名为 nginx-upstream-fair

  4、将该模块添加到我们安装的nginx中
  a、首先进入nginx-1.8.1源文件目录下在执行:
  [root@iZ28b4kreuaZ nginx-1.8.1]# ./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx-upstream-fair/
  b、执行:make    进行编译
  c、进入 nginx-1.8.1/objs/下将最新的nginx启动项 覆盖原来的 /usr/local/nginx/sbin/nginx启动项。
  [root@iZ28b4kreuaZ objs]# cp nginx /usr/local/nginx/sbin
  d、开启Nginx 看看是可以使用
四、在分布式服务器集群中session共享问题
  问题:当我们的用户在tomcat1服务器上登录后,tomcat1会保存用户的登录信息,但当用户的请求被代理服务器分配给tomcat2/tomcat3服务器时,这时就会出现tomcat2/tomcat3无法获取用户登录信息,从而导致用户需要重新登录的现象。我们有三种解决方案:
  1、同一个用户的请求锁定在同一台服务器上,这样就不会存在session在不同服务器之间共享问题。这种方案简单,但缺乏容错性(一旦服务器故障,那用户的请求将被分配给其他服务器,这时就需要重新登录)
  实现方式:设置集群策略为 ip_hash ;
upstream tomcats{  
        ip_hash;
  
    }
  2、session复制方式: 当任何服务器中session值发生改变,他都会将该改变广播给其他服务器,当其他服务器收到广播后也做相应的改变,从而实现session在所有服务器中一直。缺点 当集群中tomcat服务器很多时会增加网络负荷,性能低下。实现方式:
  a、在tomcat的server.xml中配置session广播

        
      
  
        
  
            
  
        
  
      

  b、在我们的分布式应用的web.xml 中添加 标签
  :作用是公告我们的应用可以处于集群环境中。
  3、通过创建额外的共享空间用来管理session,一般我们使用分布式缓存技术redis、memcached缓存技术,在这里我么使用memcached。
  a、memcached的安装:http://www.cnblogs.com/jalja/p/6121978.html
  b、memcached 的 session共享原理
  粘性共享:

  非粘性:

  c、tomcat访问memcached的相关环境(我们使用的是tomcat7)
  1. 复制jar包到tomcat/lib目录,jar分三类
  1)spymemcached.jar memcached java客户端
  2)memcached相关的包  memcached-session-manager-{version}.jar       核心包         memcached-session-manager-tc{tomcat-version}-{version}.jar   Tomcat版本相关的包
  3)序列化工具包,有多种可选方案,不设置时使用jdk自带序列化,其它可选kryo,javolution,xstream,flexjson等   msm-{tools}-serializer-{version}.jar  其它序列化工具相关包  一般第三方序列化工具不需要实现serializable接口

  d、配置Context,加入处理session的Manager  MemcachedBackupSessionManager
  Context配置查找顺序:
  1)conf/context.xml 全局配置,作用于所有应用
  2) conf/[enginename]/[hostname]/context.xml.default 全局配置,作用于指定host下全部应用
  3) conf/[enginename]/[hostname]/[contextpath].xml 只作用于contextpath指定的应用
  4) 应用META-INF/context.xml 只作用于本应用
  5) conf/server.xml 下 作用于Context docBase指定的应用
  如果只希望session管理作用于特定应用,最好用3,4方式设置,希望作用全体,可用1,2,5设置
  conf/context.xml的配置:

  四、集群环境开发注意事项
  1、实体类要序列化( implements Serializable)
  private static final long serialVersionUID = 3349238980725146825L;
  2、获取客户端请求地址的方式 。在nginx-tomcat.conf中添加如下配置:
   server {  
        location / {
  
            proxy_set_header   X-Real-IP        $remote_addr; # 真实的客户端IP        }
  
   }
  java代码:
public static String  getIp(HttpServletRequest request){  
        String remoteIp =request.getRemoteAddr();
  
        String headIp=request.getHeader("X-Real-IP");        return headIp==null?remoteIp:headIp;
  
    }
  3、动静分离
  把静态文件放在nginx服务器中(css、js、图片)



运维网声明 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-635404-1-1.html 上篇帖子: centos7安装配置nginx-12163069 下篇帖子: 如何在CentOS 7上使用uWSGI和Nginx来运行Django应用程序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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