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

 

目录(?)[+]

 

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. C++浅析——继承类中构造和析构顺序

    先看测试代码,CTEST 继承自CBase,并包含一个CMember成员对象: static int nIndex = 1; class CMember { public: CMember() { p ...

  2. PCA原理与实践

    在对数据进行预处理时,我们经常会遇到数据的维数非常之大,如果不进行相应的特征处理,那么算法的资源开销会很大,这在很多场景下是我们不能接受的.而对于数据的若干维度之间往往会存在较大的相关性,如果能将数据 ...

  3. For循环案例---九九乘法表

    概述:先创建一个Print99类,类中创建5个方法,分别为Test9901.Test9902.Test9903.Test9904.Test9905,分别打印出不同形状的九九乘法表,该类创建完成后再创建 ...

  4. leetcode-HouseRobber

    这道题比较简单,所以我会介绍的比较粗略: 题目: 有一个小偷想沿着马路上的房子偷东西,每家每户都有一些钱,但这条街上装了监控系统,如果相邻的两户人家都被偷了的话那么就会触发报警器.小偷的目标就是在不触 ...

  5. NOIP2004合并果子

    题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...

  6. 第26章 创建型模式大PK

    26.1 工厂方法模式 VS 建造者模式 26.1.1 按工厂方法建造超人 (1)产品:两类超人,成年超人和未成年超人. (2)工厂:这里选择简单工厂 [编程实验]工厂方法建造超人 //创建型模式大P ...

  7. HTML5 WebSocket 技术介绍

    WebSocket是html5规范新引入的功能,用于解决浏览器与后台服务器双向通讯的问题,使用WebSocket技术,后台可以随时向前端推送消息,以保证前后台状态统一,在传统的无状态HTTP协议中,这 ...

  8. SpringMVC学习系列-后记 解决GET请求时中文乱码的问题

    SpringMVC学习系列-后记 解决GET请求时中文乱码的问题 之前项目中的web.xml中的编码设置: <filter> <filter-name>CharacterEnc ...

  9. [No000002]大学本科文凭贬值了多少?

    <大学本科文凭贬值了多少?> 朋友开网络公司,招应届毕业生.他们是小本经营,人手本就不多,面试的时候,忙不过来就会拉我过去,假装是公司的面试官.主管什么的,算是滥竽充数.我装模作样面试了几 ...

  10. java 27 - 3 反射之 通过反射获取构造方法并使用

    类 Constructor<T>:提供关于类的单个构造方法的信息以及对它的访问权限. 通过反射的方法获取构造方法并使用  ps:先忽略泛型 A.1:获取构造方法的数组: public Co ...