Ubuntu下基于Nginx实现Tomcat集群负载均衡
版权声明:本文为博主原创文章,未经博主允许不得转载。
Nginx是一款HTTP和反向代理服务器,有关它的介绍可以到网上搜一下,很多很多,不再累述。这里,我们记录一下Nginx的安装过程,以及如何配置Nginx来实现Tomcat集群的负载均衡。
基本思路
假如现在我们有一个使用Java实现的Web搜索服务器,用户可以通过Web页面输入关键词,搜索服务器处理搜索请求并向用户展示搜索结果。如果用户访问量很大的话,我们的这台搜索服务器承受的压力会很大,很可能由于搜索服务器的处理能力达到上限,在某一个时刻无法再处理用户新到来的请求。所以,我们就考虑将用户请求的压力分散开,即在多台服务器上部署同一套搜索服务器程序,然后通过一个负载均衡策略,将请求的压力分摊在多台搜索服务器上,这样,在用户请求量很大的情况下,很好解决单台服务器的无法处理请求的问题。
我们的想法就是,通过一台服务器做代理,使用负载均衡软件实现请求的代理转发,将用户的请求转发到多台搜索服务器上去处理,就能实现多台搜索服务器的负载均衡,而不致于单一服务器处理所有请求。
假设,我们现在有三台机器,各台服务器如下所示:
- 搜索服务器:192.168.0.174 RHEL 5
- 搜索服务器:192.168.0.181 Win 7
- 代理服务器:192.168.0.184 Ubuntu 11.04.1
通过使用Nginx做反向代理,安装在192.168.0.184上。另外两台服务器均为搜索服务器,并且都安装了Tomcat Web服务器软件,搜索服务器程序就部署在Tomcat中。服务器192.168.0.184接收搜索请求,并通过Nginx将请求转发到两台搜索服务器上进行处理,然后返回结果,通过Nginx代理响应的搜索结果。
配置资源
这里,说明一下我们各台服务器的软件配置,及其应用端口,如下所示:
服务器IP:端口 |
软件配置 |
192.168.0.174:8080 | OpenJDK 1.6.0_22, apache-tomcat-7.0.22.tar |
192.168.0.181:8080 | Sun JDK 1.6.0_17, apache-tomcat-6.0.20.exe |
192.168.0.184:8888 | nginx-1.0.8.targz, pcre-8.13.tar.gz |
安装配置过程
Nginx安装
下载nginx-1.0.8.targz, pcre-8.13.tar.gz这两个安装包,并解压缩到目录/home/shirdrn/tools下面,然后安装过程如下所示:
- cd /home/shirdrn/tools
- tar -xvf pcre-8.13.tar.bz2
- tar -xzvf nginx-1.0.8.tar.gz
- cd /home/shirdrn/tools/nginx-1.0.8
- ./configure --with-http_stub_status_module --prefix=/home/shirdrn/servers/nginx --with-pcre=/home/shirdrn/tools/pcre-8.13
- make
- make install
执行上述命令,需要使用超级用户权限,将我们的Nginx安装到/home/shirdrn/servers/nginx-1.0.8下面,由于指定了--with-pcre=/home/shirdrn/tools/pcre-8.13,即pcre的源码路径,在安装的过程首先编译pcre并安装,然后才开始配置安装Nginx。
验证是否安装成功,只需要在浏览器输入http://192.168.0.184:8888/即可,默认Nginx使用80端口,这里我的80端口被占用了,所以修改为8888(有关Nginx的基本配置在下面说明)。
Ngin负载均衡配置
下面,我们看一下我们实现Nginx负载均衡的配置。配置文件为conf/nginx.conf,由于我们进行的代理的配置,通过使用一个单独的代理配置文件conf/proxy.conf,在conf/nginx.conf中引入该代理配置即可。
conf/proxy.conf的配置内容如下所示:
- 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;
- client_max_body_size 10m;
- client_body_buffer_size 128k;
- proxy_connect_timeout 300;
- proxy_send_timeout 300;
- proxy_read_timeout 300;
- proxy_buffer_size 4k;
- proxy_buffers 4 32k;
- proxy_busy_buffers_size 64k;
- proxy_temp_file_write_size 64k;
各配置项的含义,可以通过查阅相关文档了解。下面看conf/nginx.conf的配置,我们根据实践操作所做的修改,并对相关基本配来做适当的说明,如下所示:
- user root root; # Nginx所在的用户和用户组
- worker_processes 3; # 启动的工作进程数量
- #error_log logs/error.log;
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
- pid logs/nginx.pid; # Nginx进程ID
- events {
- worker_connections 1024;
- }
- 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;
- #keepalive_timeout 0;
- keepalive_timeout 65;
- #gzip on;
- upstream localhost { # 发到localhost上的请求,通过Nginx转发到实际处理请求的服务器
- server 192.168.0.181:8080 weight=1;
- server 192.168.0.184:8080 weight=1;
- }
- server {
- listen 8888; # Nginx监听的端口,默认为80
- server_name localhost; # Nginx所在主机的名称
- #charset koi8-r;
- #access_log logs/host.access.log main;
- location / {
- root html/solr; # 请求资源的路径(代理:/home/shirdrn/servers/nginx/tml/solr/,该目录下没有任何数据)
- index index.html index.htm;
- proxy_pass http://localhost; # 代理:对发送到localhost上请求进行代理
- include proxy.conf; # 引入proxy.conf配置
- }
- #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;
- }
- # proxy the PHP scripts to Apache listening on 127.0.0.1:80
- #
- #location ~ \.php$ {
- # proxy_pass http://127.0.0.1;
- #}
- # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
- #
- #location ~ \.php$ {
- # root html;
- # fastcgi_pass 127.0.0.1:9000;
- # fastcgi_index index.php;
- # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
- # include fastcgi_params;
- #}
- # deny access to .htaccess files, if Apache's document root
- # concurs with nginx's one
- #
- #location ~ /\.ht {
- # deny all;
- #}
- }
- # another virtual host using mix of IP-, name-, and port-based configuration
- #
- #server {
- # listen 8000;
- # listen somename:8080;
- # server_name somename alias another.alias;
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
- # HTTPS server
- #
- #server {
- # listen 443;
- # server_name localhost;
- # ssl on;
- # ssl_certificate cert.pem;
- # ssl_certificate_key cert.key;
- # ssl_session_timeout 5m;
- # ssl_protocols SSLv2 SSLv3 TLSv1;
- # ssl_ciphers HIGH:!aNULL:!MD5;
- # ssl_prefer_server_ciphers on;
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
- }
启动Nginx
启动Nginx比较简单,有两种方式:一种是直接使用默认安装路径下的nginx.conf,启动命令如下所示:
- /home/shirdrn/servers/nginx-1.0.8/sbin/nginx
另一种是,nginx.conf配置可以放到其他目录下面,启动时通过-c选项指定配置文件路径即可,启动命令如下所示:
- /home/shirdrn/servers/nginx-1.0.8/sbin/nginx -c /home/shirdrn/servers/nginx-1.0.8/conf/nginx.conf
可以查看启动进程:
- root@dev2:~$ ps -ef | grep nginx
- root 15952 1 0 18:56 ? 00:00:00 nginx: master process sbin/nginx
- root 15953 15952 0 18:56 ? 00:00:00 nginx: worker process
- root 15954 15952 0 18:56 ? 00:00:00 nginx: worker process
- root 15955 15952 0 18:56 ? 00:00:00 nginx: worker process
- ubuntu 22988 22887 0 22:19 pts/0 00:00:00 grep --color=auto nginx
查看Nginx监听的端口号:
- root@dev2:/home/ubuntu# netstat -nap | grep '8888'
- tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 15952/nginx
Tomcat配置
无论在Windows下还是Linux下,Tomcat的配置无需做额外的配置,只要能够发布你的Web应用即可。但是,我们通过Nginx进行反向代理请求,必须保证多个Tomcat下的Web应用的请求路径相一致,例如,我们配置的两台搜索服务器的单独请求路径,分别如下所示:
- http://192.168.0.174:8080/solr/core0/search/?q=九寨沟&start=0&rows=10
- http://192.168.0.181:8080/solr/core0/search/?q=马尔代夫&start=0&rows=10
我们将我们的搜索服务器程序,分别发布到这两台搜索服务器的Tomcat上,可以通过实际接口进行单独接收请求并处理。
测试验证
下面,来测试一下,验证我们上述配置的内容,是否能够按照开始设计的思路,实现负载均衡。由于在Nginx的配置中,我们设置了两台搜索服务器处理请求的权重为1:1,所以在测试的过程中很容易就能看到。由于所有的请求都是先到达代理服务器,通过代理服务器进行转发,所以对外部只有一个统一的接口:
- http://192.168.0.184:8888/solr/core0/search/?q=普吉岛&start=0&rows=10
根据代理配置,代理服务器只是转发请求和相应,而不做请求的处理等工作,所以负荷会小一些。通过负载分摊,两个搜索服务器的负荷也会比单台的情况下有所好转。上面代理的请求链接,实际会转换为如下两者之一:
- http://192.168.0.174:8080/solr/core0/search/?q=普吉岛&start=0&rows=10
- http://192.168.0.181:8080/solr/core0/search/?q=普吉岛&start=0&rows=10
我们看一下,各台服务器实际执行时的日志记录。如下4个请求:
- http://192.168.0.184:8888/solr/core0/search/?q=九寨沟&start=0&rows=10
- http://192.168.0.184:8888/solr/core0/search/?q=普吉岛&start=0&rows=10
- http://192.168.0.184:8888/solr/core0/search/?q=马尔代夫&start=0&rows=10
- http://192.168.0.184:8888/solr/core0/search/?q=西双版纳&start=0&rows=10
Nginx日志,如下所示:
- 192.168.0.181 - - [05/Oct/2011:21:42:05 +0800] "GET /solr/core0/search/?q=九寨沟&start=0&rows=10 HTTP/1.1" 200 329495 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30"
- 192.168.0.181 - - [05/Oct/2011:21:42:12 +0800] "GET /solr/core0/search/?q=普吉岛&start=0&rows=10 HTTP/1.1" 200 110349 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30"
- 192.168.0.181 - - [05/Oct/2011:21:42:25 +0800] "GET /solr/core0/search/?q=马尔代夫&start=0&rows=10 HTTP/1.1" 200 85572 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30"
- 192.168.0.181 - - [05/Oct/2011:21:42:32 +0800] "GET /solr/core0/search/?q=西双版纳&start=0&rows=10 HTTP/1.1" 200 141030 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30"
我们看一下,各台搜索服务器接收请求处理的日志:
搜索服务器192.168.0.174请求处理日志:
- 2011-10-5 21:42:12 org.apache.solr.core.SolrCore execute
- 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=普吉岛&rows=10} hits=16 status=0 QTime=48
- 2011-10-5 21:42:32 org.apache.solr.core.SolrCore execute
- 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=西双版纳&rows=10} hits=29 status=0 QTime=54
搜索服务器192.168.0.181请求处理日志:
- 2011-10-5 21:42:06 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: create new Seg ...
- 2011-10-5 21:42:06 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: use complex mode
- 2011-10-5 21:42:08 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: create new Seg ...
- 2011-10-5 21:42:08 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: use complex mode
- 2011-10-5 21:42:08 org.apache.solr.core.SolrCore execute
- 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=九寨沟0&rows=10} hits=54 status=0 QTime=2116
- 2011-10-5 21:42:27 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: create new Seg ...
- 2011-10-5 21:42:27 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: use complex mode
- 2011-10-5 21:42:28 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: create new Seg ...
- 2011-10-5 21:42:28 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: use complex mode
- 2011-10-5 21:42:29 org.apache.solr.core.SolrCore execute
- 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=马尔代夫0&rows=10} hits=57 status=0 QTime=1721
测试发现,虽然只有4个请求,但是在负载权重相等情况下,很好地分摊到两台搜索服务器上去进行请求的实际处理。通过上面日志可以看出,我们基本实现了一开始设计的思路。
From: http://blog.csdn.net/shirdrn/article/details/6845520
Ubuntu下基于Nginx实现Tomcat集群负载均衡的更多相关文章
- 使用Nginx实现Tomcat集群负载均衡
概述 要解决的问题 环境准备以及问题解决思路 配置 测试 小结 一.概述 使用Nginx主要是来解决高并发情况下的负载均衡问题. 二.要解决的问题 1.最主要是负载均衡请求分发. 2.文件上传功能,只 ...
- Apache + Tomcat集群 + 负载均衡
Part I: 取经处: http://www.ramkitech.com/2012/10/tomcat-clustering-series-simple-load.html http://blog ...
- ngnix apache tomcat集群负载均衡配置
http://w.gdu.me/wiki/Java/tomcat_cluster.html 参考: Tomcat与Apache或Nginx的集群负载均衡设置: http://huangrs.blog. ...
- nginx+tomcat集群负载均衡(实现session复制)
转自:http://talangniao.iteye.com/blog/341512 架构描述 前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面( ...
- Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)
说明 本文只为方便日后查阅,不对一些概念再做赘述,网上都有很多明确的解释,也请大家先了解相关概念. 两台搭建HA的服务器是华为云上的ECS(不要忘记开通VPC,保证我们的服务器都处在一个内网环境),由 ...
- windows下使用nginx配置tomcat集群
转自:https://blog.csdn.net/csdn15698845876/article/details/80658599
- 【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享
今天想着将项目优化一下,就想的实现集群分布,在本机测试:利用nginx+tomcat实现 通过上一篇博客(http://www.cnblogs.com/qlqwjy/p/8535235.html),N ...
- 图文解说:Nginx+tomcat配置集群负载均衡
图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用 作者:niumd Blog:http://ari.iteye ...
- 转】Nginx+tomcat配置集群负载均衡
原博文出自于:http://blog.csdn.net/bruce_6/article/details/38228299 感谢! 相信很多人都听过nginx,这个小巧的东西慢慢地在吞食 ...
随机推荐
- #include <NOIP2010 Junior> 三国游戏 ——using namespace wxl;
题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有 N 位武将(N为偶数且不小于 4),任意两个武将之 ...
- stm32中断无电平触发的解决办法
这几天在用stm32读取FPGA中FIFO里的数据,遇到了不少的问题.其中有个自己觉得比较好玩的问题,就拿出来写写.其实这个问题也比较简单,开始我觉得没必要拿出来写,不过,想想后觉得还是写写吧,就当做 ...
- 第8章 用户模式下的线程同步(3)_Slim读写锁(SRWLock)
8.5 Slim读/写锁(SRWLock)——轻量级的读写锁 (1)SRWLock锁的目的 ①允许读者线程同一时刻访问共享资源(因为不存在破坏数据的风险) ②写者线程应独占资源的访问权,任何其他线程( ...
- Collider Collision 区别
Collision 中带有碰撞的信息,例如:速度和撞击到的点 示例 void OnCollisionEnter2D(Collision2D coll) { foreach(ContactPoint c ...
- JVM再了解了解
转自 http://www.cnblogs.com/Coda/p/4331432.html 相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任 ...
- iOS远程推送1
一.APNS 远程推送 1.所有的苹果设备,在联网状态下,都会与苹果服务器建立长连接. 2.长连接:就是只要联网了,就一直建立连接. 3.长连接的作用:时间校准,系统升级,查找我的iPhone. 4. ...
- background-size背景缩放
特别注意:背景图片缩放是相对于背景图片所在容器的宽高而言的,并不是相对背景图片本身的宽高 比如,一个div的宽高是300和200像素,背景图片本身的宽高是100*100的像素,设置div的backgr ...
- Python的高级特性2:列表推导式,生成器与迭代器
一.列表推导式 1.列表推导式是颇具python风格的一种写法.这种写法除了高效,也更简短. In [23]: {i:el for i,el in enumerate(["one" ...
- Jenkins 安装
1. 调整tomcat的jvm配置, 以免内存不够, 在catalina.sh中 #!bin/sh下添加 JAVA_OPTS="-server -Xms1024m -Xmx1024m -XX ...
- php加载xml编码错误,“Error: Input is not proper UTF-8, indicate encoding! ”
最近在给php中解析xml的时候,抛出一个错误: "Warning: DOMDocument::load(): Input is not proper UTF-8, indicate enc ...