0

0

Nginx 服务器 之Nginx与tomcat实现负载均衡

高洛峰

高洛峰

发布时间:2016-12-01 16:56:38

|

1508人浏览过

|

来源于php中文网

原创

22.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;
        }
   }
}

、使用该配置文件启动nginx (启动前先关闭nginx)

    [root@iZ28b4kreuaZ bin]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx-tomcat.conf

二、配置文件详解:

worker_processes  2;

events {   
    worker_connections  1024;    
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    # upstream 配置一组后端服务器,
    # 请求转发到upstream后,nginx按策略将请求指派出某一服务器
    # 即配置用于负载均衡的服务器群信息
    upstream backends {
        #=========均衡策略=============
        #none 轮询(权重由weight决定)
        #ip_hash  通过hash算法将用户的请求与第一次请求的服务器进行绑定,后续该用户所有的请求都将被分配到该服务器上。除非该服务器挂掉。
        #==============  第三方 均衡策略===========
        #fair  根据各个服务器的性能的不同,自动选择使用响应能力强的服务器。
        #url_hash 根据url选择服务器。 

        #===============服务器集==============
        server 192.168.1.62:8080;
        server 192.168.1.63;
        
        #==========weight权重策略:权重值越高负载越大==========
        # server 192.168.1.64 weight=5;

        
        #===============backup:备份机,只有非备份机都挂掉了才启用===============
        server 192.168.1.64 backup;
        
        #==============down: 停机标志,不会被访问(对临时维护的服务器设置)=============
        server 192.168.1.65 down;

        # max_fails:达到指定次数认为服务器挂掉;
        # fail_timeout:挂掉之后过多久再去测试是否已恢复
        server 192.168.1.66 max_fails=2 fail_timeout=60s;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        
        # 反向代理设置,将所有/proxy_test/路径下请求发给本机上的tomcat
        location /proxy_test/ {
            proxy_pass http://localhost:8080;
        }
        
        # 负载均衡设置,将所有jsp请求发送到upstream backends指定的服务器群上
        location ~ \.jsp$ {
            proxy_pass http://backends;
            
            # 真实的客户端IP
            proxy_set_header   X-Real-IP        $remote_addr; 
            # 请求头中Host信息
            proxy_set_header   Host             $host; 
            # 代理路由信息,此处取IP有安全隐患
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            # 真实的用户访问协议
            proxy_set_header   X-Forwarded-Proto $scheme;
            # 默认值default,
            # 后端response 302时 tomcat header中location的host是http://192.168.1.62:8080
            # 因为tomcat收到的请求是nginx发过去的, nginx发起的请求url host是http://192.168.1.62:8080
            # 设置为default后,nginx自动把响应头中location host部分替换成当前用户请求的host部分
            # 网上很多教程将此值设置成 off,禁用了替换,
            # 这样用户浏览器收到302后跳到http://192.168.1.62:8080,直接将后端服务器暴露给浏览器
            # 所以除非特殊需要,不要设置这种画蛇添足的配置
            proxy_redirect default;
        }
        
        # 一个url重写的例子,浏览器请求 /page.go时,url被重写成/test/page.jsp
        location ~ \.go$ {
            rewrite ^(.*)\.go$ /test/$1\.jsp last;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
}

三、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

22.png

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 中添加 标签

Pi智能演示文档
Pi智能演示文档

领先的AI PPT生成工具

下载

:作用是公告我们的应用可以处于集群环境中。

 3、通过创建额外的共享空间用来管理session,一般我们使用分布式缓存技术redis、memcached缓存技术,在这里我么使用memcached。

  a、memcached的安装:http://www.cnblogs.com/jalja/p/6121978.html

  b、memcached 的 session共享原理

   粘性共享:

22.png

非粘性:

22.png

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接口

22.png

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的配置:





    WEB-INF/web.xml
    ${catalina.base}/conf/web.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、图片)

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

204

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号