版权声明:本文为博主原创文章,未经博主允许不得转载。

 

目录(?)[+]

 

Nginx是一款HTTP和反向代理服务器,有关它的介绍可以到网上搜一下,很多很多,不再累述。这里,我们记录一下Nginx的安装过程,以及如何配置Nginx来实现Tomcat集群的负载均衡。

基本思路

假如现在我们有一个使用Java实现的Web搜索服务器,用户可以通过Web页面输入关键词,搜索服务器处理搜索请求并向用户展示搜索结果。如果用户访问量很大的话,我们的这台搜索服务器承受的压力会很大,很可能由于搜索服务器的处理能力达到上限,在某一个时刻无法再处理用户新到来的请求。所以,我们就考虑将用户请求的压力分散开,即在多台服务器上部署同一套搜索服务器程序,然后通过一个负载均衡策略,将请求的压力分摊在多台搜索服务器上,这样,在用户请求量很大的情况下,很好解决单台服务器的无法处理请求的问题。

我们的想法就是,通过一台服务器做代理,使用负载均衡软件实现请求的代理转发,将用户的请求转发到多台搜索服务器上去处理,就能实现多台搜索服务器的负载均衡,而不致于单一服务器处理所有请求。

假设,我们现在有三台机器,各台服务器如下所示:

  1. 搜索服务器:192.168.0.174 RHEL 5
  2. 搜索服务器:192.168.0.181 Win 7
  3. 代理服务器: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下面,然后安装过程如下所示:

  1. cd /home/shirdrn/tools
  2. tar -xvf pcre-8.13.tar.bz2
  3. tar -xzvf nginx-1.0.8.tar.gz
  4. cd /home/shirdrn/tools/nginx-1.0.8
  5. ./configure --with-http_stub_status_module --prefix=/home/shirdrn/servers/nginx --with-pcre=/home/shirdrn/tools/pcre-8.13
  6. make
  7. 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的配置内容如下所示:

  1. proxy_redirect          off;
  2. proxy_set_header        Host $host;
  3. proxy_set_header        X-Real-IP $remote_addr;
  4. proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  5. client_max_body_size    10m;
  6. client_body_buffer_size 128k;
  7. proxy_connect_timeout   300;
  8. proxy_send_timeout      300;
  9. proxy_read_timeout      300;
  10. proxy_buffer_size       4k;
  11. proxy_buffers           4 32k;
  12. proxy_busy_buffers_size 64k;
  13. proxy_temp_file_write_size 64k;

各配置项的含义,可以通过查阅相关文档了解。下面看conf/nginx.conf的配置,我们根据实践操作所做的修改,并对相关基本配来做适当的说明,如下所示:

  1. user  root root; # Nginx所在的用户和用户组
  2. worker_processes  3; # 启动的工作进程数量
  3. #error_log  logs/error.log;
  4. #error_log  logs/error.log  notice;
  5. #error_log  logs/error.log  info;
  6. pid        logs/nginx.pid; # Nginx进程ID
  7. events {
  8. worker_connections  1024;
  9. }
  10. http {
  11. include       mime.types;
  12. default_type  application/octet-stream;
  13. #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  14. #                  '$status $body_bytes_sent "$http_referer" '
  15. #                  '"$http_user_agent" "$http_x_forwarded_for"';
  16. #access_log  logs/access.log  main;
  17. sendfile        on;
  18. #tcp_nopush     on;
  19. #keepalive_timeout  0;
  20. keepalive_timeout  65;
  21. #gzip  on;
  22. upstream localhost { # 发到localhost上的请求,通过Nginx转发到实际处理请求的服务器
  23. server 192.168.0.181:8080 weight=1;
  24. server 192.168.0.184:8080 weight=1;
  25. }
  26. server {
  27. listen       8888; # Nginx监听的端口,默认为80
  28. server_name  localhost; # Nginx所在主机的名称
  29. #charset koi8-r;
  30. #access_log  logs/host.access.log  main;
  31. location / {
  32. root   html/solr; # 请求资源的路径(代理:/home/shirdrn/servers/nginx/tml/solr/,该目录下没有任何数据)
  33. index  index.html index.htm;
  34. proxy_pass   http://localhost; # 代理:对发送到localhost上请求进行代理
  35. include proxy.conf; # 引入proxy.conf配置
  36. }
  37. #error_page  404              /404.html;
  38. # redirect server error pages to the static page /50x.html
  39. #
  40. error_page   500 502 503 504  /50x.html;
  41. location = /50x.html {
  42. root   html;
  43. }
  44. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  45. #
  46. #location ~ \.php$ {
  47. #    proxy_pass   http://127.0.0.1;
  48. #}
  49. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  50. #
  51. #location ~ \.php$ {
  52. #    root           html;
  53. #    fastcgi_pass   127.0.0.1:9000;
  54. #    fastcgi_index  index.php;
  55. #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
  56. #    include        fastcgi_params;
  57. #}
  58. # deny access to .htaccess files, if Apache's document root
  59. # concurs with nginx's one
  60. #
  61. #location ~ /\.ht {
  62. #    deny  all;
  63. #}
  64. }
  65. # another virtual host using mix of IP-, name-, and port-based configuration
  66. #
  67. #server {
  68. #    listen       8000;
  69. #    listen       somename:8080;
  70. #    server_name  somename  alias  another.alias;
  71. #    location / {
  72. #        root   html;
  73. #        index  index.html index.htm;
  74. #    }
  75. #}
  76. # HTTPS server
  77. #
  78. #server {
  79. #    listen       443;
  80. #    server_name  localhost;
  81. #    ssl                  on;
  82. #    ssl_certificate      cert.pem;
  83. #    ssl_certificate_key  cert.key;
  84. #    ssl_session_timeout  5m;
  85. #    ssl_protocols  SSLv2 SSLv3 TLSv1;
  86. #    ssl_ciphers  HIGH:!aNULL:!MD5;
  87. #    ssl_prefer_server_ciphers   on;
  88. #    location / {
  89. #        root   html;
  90. #        index  index.html index.htm;
  91. #    }
  92. #}
  93. }
  • 启动Nginx

启动Nginx比较简单,有两种方式:一种是直接使用默认安装路径下的nginx.conf,启动命令如下所示:

  1. /home/shirdrn/servers/nginx-1.0.8/sbin/nginx

另一种是,nginx.conf配置可以放到其他目录下面,启动时通过-c选项指定配置文件路径即可,启动命令如下所示:

  1. /home/shirdrn/servers/nginx-1.0.8/sbin/nginx -c /home/shirdrn/servers/nginx-1.0.8/conf/nginx.conf

可以查看启动进程:

  1. root@dev2:~$ ps -ef | grep nginx
  2. root     15952     1  0 18:56 ?        00:00:00 nginx: master process sbin/nginx
  3. root     15953 15952  0 18:56 ?        00:00:00 nginx: worker process
  4. root     15954 15952  0 18:56 ?        00:00:00 nginx: worker process
  5. root     15955 15952  0 18:56 ?        00:00:00 nginx: worker process
  6. ubuntu   22988 22887  0 22:19 pts/0    00:00:00 grep --color=auto nginx

查看Nginx监听的端口号:

  1. root@dev2:/home/ubuntu# netstat -nap | grep '8888'
  2. tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      15952/nginx
  • Tomcat配置

无论在Windows下还是Linux下,Tomcat的配置无需做额外的配置,只要能够发布你的Web应用即可。但是,我们通过Nginx进行反向代理请求,必须保证多个Tomcat下的Web应用的请求路径相一致,例如,我们配置的两台搜索服务器的单独请求路径,分别如下所示:

  1. http://192.168.0.174:8080/solr/core0/search/?q=九寨沟&start=0&rows=10
  2. http://192.168.0.181:8080/solr/core0/search/?q=马尔代夫&start=0&rows=10

我们将我们的搜索服务器程序,分别发布到这两台搜索服务器的Tomcat上,可以通过实际接口进行单独接收请求并处理。

测试验证

下面,来测试一下,验证我们上述配置的内容,是否能够按照开始设计的思路,实现负载均衡。由于在Nginx的配置中,我们设置了两台搜索服务器处理请求的权重为1:1,所以在测试的过程中很容易就能看到。由于所有的请求都是先到达代理服务器,通过代理服务器进行转发,所以对外部只有一个统一的接口:

  1. http://192.168.0.184:8888/solr/core0/search/?q=普吉岛&start=0&rows=10

根据代理配置,代理服务器只是转发请求和相应,而不做请求的处理等工作,所以负荷会小一些。通过负载分摊,两个搜索服务器的负荷也会比单台的情况下有所好转。上面代理的请求链接,实际会转换为如下两者之一:

  1. http://192.168.0.174:8080/solr/core0/search/?q=普吉岛&start=0&rows=10
  2. http://192.168.0.181:8080/solr/core0/search/?q=普吉岛&start=0&rows=10

我们看一下,各台服务器实际执行时的日志记录。如下4个请求:

  1. http://192.168.0.184:8888/solr/core0/search/?q=九寨沟&start=0&rows=10
  2. http://192.168.0.184:8888/solr/core0/search/?q=普吉岛&start=0&rows=10
  3. http://192.168.0.184:8888/solr/core0/search/?q=马尔代夫&start=0&rows=10
  4. http://192.168.0.184:8888/solr/core0/search/?q=西双版纳&start=0&rows=10

Nginx日志,如下所示:

  1. 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"
  2. 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"
  3. 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"
  4. 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请求处理日志:

  1. 2011-10-5 21:42:12 org.apache.solr.core.SolrCore execute
  2. 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=普吉岛&rows=10} hits=16 status=0 QTime=48
  3. 2011-10-5 21:42:32 org.apache.solr.core.SolrCore execute
  4. 信息: [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请求处理日志:

  1. 2011-10-5 21:42:06 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
  2. 信息: create new Seg ...
  3. 2011-10-5 21:42:06 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
  4. 信息: use complex mode
  5. 2011-10-5 21:42:08 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
  6. 信息: create new Seg ...
  7. 2011-10-5 21:42:08 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
  8. 信息: use complex mode
  9. 2011-10-5 21:42:08 org.apache.solr.core.SolrCore execute
  10. 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=九寨沟0&rows=10} hits=54 status=0 QTime=2116
  11. 2011-10-5 21:42:27 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
  12. 信息: create new Seg ...
  13. 2011-10-5 21:42:27 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
  14. 信息: use complex mode
  15. 2011-10-5 21:42:28 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
  16. 信息: create new Seg ...
  17. 2011-10-5 21:42:28 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
  18. 信息: use complex mode
  19. 2011-10-5 21:42:29 org.apache.solr.core.SolrCore execute
  20. 信息: [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集群负载均衡的更多相关文章

  1. 使用Nginx实现Tomcat集群负载均衡

    概述 要解决的问题 环境准备以及问题解决思路 配置 测试 小结 一.概述 使用Nginx主要是来解决高并发情况下的负载均衡问题. 二.要解决的问题 1.最主要是负载均衡请求分发. 2.文件上传功能,只 ...

  2. Apache + Tomcat集群 + 负载均衡

    Part I: 取经处: http://www.ramkitech.com/2012/10/tomcat-clustering-series-simple-load.html  http://blog ...

  3. ngnix apache tomcat集群负载均衡配置

    http://w.gdu.me/wiki/Java/tomcat_cluster.html 参考: Tomcat与Apache或Nginx的集群负载均衡设置: http://huangrs.blog. ...

  4. nginx+tomcat集群负载均衡(实现session复制)

    转自:http://talangniao.iteye.com/blog/341512 架构描述 前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面( ...

  5. Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)

    说明 本文只为方便日后查阅,不对一些概念再做赘述,网上都有很多明确的解释,也请大家先了解相关概念. 两台搭建HA的服务器是华为云上的ECS(不要忘记开通VPC,保证我们的服务器都处在一个内网环境),由 ...

  6. windows下使用nginx配置tomcat集群

    转自:https://blog.csdn.net/csdn15698845876/article/details/80658599

  7. 【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享

    今天想着将项目优化一下,就想的实现集群分布,在本机测试:利用nginx+tomcat实现 通过上一篇博客(http://www.cnblogs.com/qlqwjy/p/8535235.html),N ...

  8. 图文解说:Nginx+tomcat配置集群负载均衡

    图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用  作者:niumd Blog:http://ari.iteye ...

  9. 转】Nginx+tomcat配置集群负载均衡

    原博文出自于:http://blog.csdn.net/bruce_6/article/details/38228299         感谢! 相信很多人都听过nginx,这个小巧的东西慢慢地在吞食 ...

随机推荐

  1. 时光煮雨 Unity3D实现2D人物移动-总结篇

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...

  2. Network Experiment Environment Construction

    In order to provide an environment for network experiments in the future, I use VirutalBox to create ...

  3. C#迭代重载等

    迭代器 迭代器是作为一个容器,将要遍历的数据放入,通过统一的接口返回相同类型的值 迭代器代码使用 yield return 语句依次返回每个元素.yield break 将终止迭代 类中实现多个迭代器 ...

  4. 原生的强大DOM选择器querySelector

    在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id ...

  5. POJ 2826 An Easy Problem?! --计算几何,叉积

    题意: 在墙上钉两块木板,问能装多少水.即两条线段所夹的中间开口向上的面积(到短板的水平线截止) 解法: 如图: 先看是否相交,不相交肯定不行,然后就要求出P与A,B / C,D中谁形成的向量是指向上 ...

  6. 贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)

    程序效果: 代码: //main.cpp 1 #include <iostream> #include<fstream> #include <graphics.h> ...

  7. CF 407B Long Path[观察性质 DP]

    B. Long Path time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  8. Canon

    .打开压缩包发现2个文件,1个是加密的zip.zip,另一个是music.mp3.猜测zip.zip的解压密码隐藏在music.mp3里 .用MP3Stego解密music.mp3,密码就是标题的Ca ...

  9. NOIP模拟赛 夕阳

    题目描述 “我有个愿望,我希望在灿烂千阳时遇见你.” 这是个有n个点的世界,有m条无向边连接着这n个点,但是不保证点之间能够互相到达. “这个世界的夕阳,只在奇数长的简单路径的尽头.”一个神如是说. ...

  10. 当元素的样式为display:none时获取他的宽高

    其实这里可以用一个偷梁换柱的办法,把display:none改为 display:block;visibility:hidden;position:absolute; 在jquery的swap方法中实 ...