Nginx+Tomcat实现负载均衡

一、环境准备

  • Tomcat1:192.168.31.103
  • Tomcat2:192.168.31.117
  • Nginx:192.168.31.154

在103和117上分别部署相同的Tomcat程序,修改index.jsp页面,把内容改为各自的IP地址。

二、修改配置文件nginx.conf

在http节点中增加:

## user-api 
    upstream user-api { 
        server 192.168.31.103:8080 weight = 3; 
        服务器192.168.31.117:8080重量= 3; 
    } 
   server { 
        listen 80; 
        server_name 192.168.31.154; 
        location / { 
            proxy_pass http:// user-api /; 
        } 
    }
  • upstream为Nginx的负载均衡模块,里面定义了负载应用的列表。
  • server{}为虚拟主机配置
  • server_name为虚拟主机的IP或者域名,多个域名之间用空格隔开
  • listen为监听的端口
  • location / 表示监听80端口下面的所有请求
  • proxy_pass配置为:http + upstream名称

以上配置完成后,执行./nginx -t命令检测配置是否有错,再执行./ngin -s reload命令进行更新。

三、配置说明:

upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低廉。

但缺点是:可靠性低和负载分配不均衡。适用于图片服务器集群和纯静态页面服务器集群。

除此之外,upstream还有其它的分配策略,分别如下:

weight(权重) 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。如下所示,10.0.0.88的访问比率要比10.0.0.77的访问比率高一倍。

上游linuxidc { 
    server 10.0.0.77 weight = 5; 
    服务器10.0.0.88重量= 10; 
}
  • ip_hash(访问ip) 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
上游favresin { 
   ip_hash; 
   server 10.0.0.10:8080; 
   server 10.0.0.11:8080; 
}
  • fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。
upstream favresin {       
    server 10.0.0.10:8080; 
    server 10.0.0.11:8080; 
    公平; 
}

url_hash(第三方) 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

   upstream resinserver { 
    server 10.0.0.10:7777; 
    server 10.0.0.11:8888; 
    hash $ request_uri; 
    hash_method crc32; 
}

upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:

  • down 表示单前的server暂时不参与负载.
  • weight 默认为1.weight越大,负载的权重就越大。
  • max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
  • fail_timeout : max_fails次失败后,暂停的时间。
  • backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
上游bakend {#定义负载均衡设备的Ip及设备状态
    ip_hash; 
    服务器10.0.0.11:9090下来; 
    server 10.0.0.11:8080 weight = 2; 
    server 10.0.0.11:6060; 
    server 10.0.0.11:7070 backup; 
}

四、测试

访问http://192.168.31.154/dreyer-user-api/index.jsp

不断的刷新页面,我们会发现应用会在117和103之间随机切换,这表明通过Nginx来实现Tomcat应用的负载均衡目的达到。

五、附录实例

nginx.conf

#user www www; 
用户root; 
worker_processes 4; 
error_log logs / error.log; 
#error_log logs / error.log通知; 
#error_log logs / error.log info; 
pid logs / nginx.pid; 
事件{ 
    使用epoll; 
    worker_connections 40960; 
} #load 
modules编译为动态共享对象(DSO)
## 
delete {#load 
ngx_http_fastcgi_module.so; 
#load ngx_http_rewrite_module.so; 
#} 
http { 
    include mime.types; 
    default_type application / octet-stream; 
    #log_format main'$ remote_addr  -  $ remote_user [$ time_local]“$ request”'
    #'$ status $ body_bytes_sent“$ http_referer”' 
    #'“$ http_user_agent”“$ http_x_forwarded_for”'; 
    #access_log logs / access.log main; 
    sendfile on; 
    #tcp_nopush on; 
    tcp_nodelay on; 
    types_hash_max_size 2048; 
    server_names_hash_max_size 512; 
    server_names_hash_bucket_size 128; 
    #keepalive_timeout 0; 
    keepalive_timeout 280; 
    gzip on; 
    gzip_comp_level 3; 
    gzip_types text / plain text / css text / javascript application / x-javascript application / javascript application / xml application / json; 
    client_header_buffer_size 128k; 
    large_client_header_buffers 4 256k;
    
    proxy_headers_hash_max_size 51200; 
    proxy_headers_hash_bucket_size 6400;     ##配置包含的文件信息    包括/opt/nginx/conf/tools/*.conf;     include /opt/nginx/sites-enabled/*.conf; }
    



在包含的文件信息中摘取几段

## dev-pay-api(单节点)
server { 
    listen 80; 
    server_name xxxx.cn; 
    location / { 
        proxy_pass http://172.16.xx.xx:8089 /; 
        add_header'Access-Control-Allow-Origin''*'; 
        add_header'Access-Control-Allow-Credentials''true'; 
        add_header'Access-Control-Allow-Methods''POST,GET,OPTIONS,PUT,DELETE'; 
        add_header'Access-Control-Allow-Headers''*,token'; 
        proxy_set_header主机$ http_host; 
        proxy_set_header Cookie $ http_cookie; 
        proxy_set_header X-Real-IP $ remote_addr; 
        proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;

        client_max_body_size 100m; 
    } 
}


上游qa_web_pay_api { 
    server 172.16.xx.xx:8089 weight = 3; ## qa-web-pay-api(双机负载均衡)
    server 172.16.xx.xx:8089 weight = 3; 
} 
server { 
    listen 80; 
    server_name xxxx.com; 
    location / { 
        proxy_pass http:// qa_web_pay_api /; 
        add_header'Access-Control-Allow-Origin''*'; 
        add_header'Access-Control-Allow-Credentials''true'; 
        add_header'Access-Control-Allow-Methods''POST,GET,OPTIONS,PUT,DELETE'; 
        add_header'Access-Control-Allow-Headers''*,token'; 
        proxy_set_header主机$ http_host; 
        proxy_set_header Cookie $ http_cookie;

        proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for; 
        proxy_set_header X-Forwarded-Proto $ scheme; 
        client_max_body_size 100m; 
    } 
}

## test-web-b(前端代码,前后端分离的模式)
server { 
    listen 80; 
    server_name xxxx.com; 
    重写^(。*)$ https:// $ host $ 1 permanent; 
    location / { 
        root / usr / local / www / test-web-b; 
        try_files $ uri $ uri / /index.html = 404; 
    } 
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏高性能服务器开发

(一)主线程与工作线程的分工

服务器端为了能流畅处理多个客户端链接,一般在某个线程A里面accept新的客户端连接并生成新连接的socket fd,然后将这些新连接的socketfd给另外开...

3489
来自专栏开源优测

性能测试必备监控技能linux篇14

前言 如果性能测试的目标服务器是linux系统,在如何使用linux自带的命令来实现性能测试过程的监控分析呢? 对于日常性能测试来讲,在linux下或是类Uni...

3656
来自专栏小程序之家

如何实现小程序登录鉴权

为了方便用户使用小程序时,使用微信账号授权快速登录软件,微信小程序提供了相关的授权接口。小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快...

1.6K5
来自专栏梦里茶室

【Chromium中文文档】安全浏览 -- Chrome中的警告都是怎么来的?

安全浏览 浏览保护 启动安全浏览后,在允许内容开始加载前,所有的URL都会被检查。URL通过两个列表进行检查:恶意软件和钓鱼网站。根据匹配到的列表,我们会在一个...

2015
来自专栏玩转JavaEE

Redis集群搭建

1.所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽 2.节点的fail是通过集群中超过半数的节点检测失效时才生效 ...

2010
来自专栏腾讯云TStack专栏

nova backup 剖析

nova backup 可以指定虚拟机备份类型,备份保留的数目,那 nova backup 到底是怎么做到备份虚拟机的?下面为大家拨开层层迷雾。

2800
来自专栏微信公众号:Java团长

Java程序员必备的Intellij插件

地址:https://plugins.jetbrains.com/plugin/7495--ignore

941
来自专栏GreenLeaves

Oracle 事务操作

在看本文之前,请确保你已经了解了Oracle事务和锁的概念即其作用,不过不了解,请参考数据库事务的一致性和原子性浅析和Oracle TM锁和TX锁 1、提交事务...

2446
来自专栏王二麻子IT技术交流园地

十二、VueJs 填坑日记之项目打包发布

通过上一篇博文的学习,我们其实已经完成了我们设想的项目的开发。但是,我们做好的这套东西,是基于 nodejs 开发的。而我们最终希望,我们开发的项目,生成好一堆...

2045
来自专栏ios 技术积累

Maven 初识

才接触Maven的时候也是一头雾水,网上搜索了一些资料后感觉Maven和iOS开发中的cocoapods很像,cocoapods自动下载我们需要的开源类不需要手...

1533

扫码关注云+社区

领取腾讯云代金券