Linux下Nginx+多Tomcat负载均衡实现详解

姓名:郑红                                  学号:17101223385

本文转自http://server.51cto.com/sOS-560862.htm

【嵌牛导读】:Nginx作为反向代理服务器,实现负载均衡。首先浏览器发起请求,到达Nginx,由Nginx将请求地址转发给相应的tomcat服务器,再由tomcat服务器将结果返回给Nginx,Nginx将结果再转发给浏览器。

【嵌牛鼻子】:Linux    Nginx      Tomcat

【嵌牛提问】:什么是Nginx?

【嵌牛正文】:

一、简介

【Nginx】 大名鼎鼎,麻雀虽小五脏俱全,它拥有小而稳且高效的特性。为目前大多数中小企业所使用。nginx可以做以下几件事:

反向代理

负载均衡

动静分离

网页、图片缓存

【Tomcat】 是一个免费开放源代码的 Web 应用服务器,具有开源免费、容易安装、 容易使 用、占用资源小、易于和其他软件集成等优点。

Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载

平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感 兴趣的程序员都可以更改它或在其中加入新的功能。

【N+T的负载均衡】

然而他们的组合将是一把无与伦比的利刃。首先说明一下它的请求原理(路径走向)

Nginx作为反向代理服务器,实现负载均衡。首先浏览器发起请求,到达Nginx,由Nginx将请求地址转发给相应的tomcat服务器,再由tomcat服务器将结果返回给Nginx,Nginx将结果再转发给浏览器。

下面上图:

图中的信息显而易见,以nginx服务器作为中转分发请求,以达到负载均衡的目的。

二、环境需求

【由于博主的主机(脸红~)配置低,所以只开一开虚拟机作为这次负载均衡的测试。一个ip三个端口既可实现上图所述的效果了】

主机A:192.168.0.144/24

apache-tomcat-6.0.35.tar.gz   tomcat 6  使用的主要端口:18080

apache-tomcat-7.0.82.tar.gz   tomcat 7  使用的主要端口:28080

apache-tomcat-8.5.23.tar.gz   tomcat 8  使用的主要端口: 8088

nginx-1.0.12.tar.gz

jdk7u79linuxx64.tar.gz

(其他一些基础环境比如gcc-c++的自己补全吧)

三、各个环境的搭建

3.1 Nginx搭建

先把所有准备好的软件工具放到一个目录下(都先准备好必用软件,不然配置起来才去找软件是很烦人的)

[root@N+T lhl]# ll

total 175172

-rw-r--r-- 1 root root   9472492 Dec  1  2017 apache-tomcat-8.5.23.tar.gz

-rw-r--r-- 1 root root 153512879 Dec  7  2017 jdk7u79linuxx64.tar.gz

-rw-r--r-- 1 root root    691002 May  9  2012 nginx-1.0.12.tar.gz

-rw-r--r-- 1 root root  15692490 Nov 29  2017 Tomcat6-7.zip

接下来安装一下开发环境

[root@N+T lhl]# yum -y install gcc gcc-c++

在/usr目录下面创建一个nginx的目录,并把nginx包移动到该目录下,再解压到该目录下面

[root@N+T lhl]# mkdir -p /usr/nginx

[root@N+T lhl]# mv nginx-1.0.12.tar.gz /usr/nginx/ &&cd /usr/nginx/&&tar -zxvf nginx-1.0.12.tar.gz

最好进入nginx-1.0.12目录,再编译安装

[root@N+T nginx-1.0.12]# ./configure &&make &&make install

一般编译安装都默认在/usr/local/nginx/ 目录下面 ,下面这个就是nginx的主程序。

[root@N+T sbin]# ll /usr/local/nginx/sbin/nginx

-rwxr-xr-x 1 root root 954836 Aug 16 04:43 /usr/local/nginx/sbin/nginx

本博文为了搭建的方便直接把这个主程序拉倒/usr/bin/ 目录下了

[root@N+T sbin]# cp -a /usr/local/nginx/sbin/nginx /usr/bin/

下面是配置文件

[root@N+T sbin]# ll /usr/local/nginx/conf/nginx.conf

简单的配置了一下配置文件

#####nginx+3 T 负载均衡测试############

#####最简化的配置文件了--###############

usernobody;   #对于用户有安全性限制的伙伴可以创建一个账户去使用

worker_processes 1;

events {

use epoll;

worker_connections  1024;

}

http

{

include       mime.types;

default_type  application/octet-stream;

sendfileon;

keepalive_timeout  60; #简单文本显示格式编辑

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 8 128k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

fastcgi_temp_path /dev/shm;

server{

listen       80;

server_name  localhost;

access_log /var/log/nginx/aeecss.log;

error_log  /var/log/nginx/error.log;

location / {

proxy_pass  http://li7105.com;

proxy_redirectdefault;

}

}

}

下面运行nginx,查看信息

[root@N+T sbin]# /usr/bin/nginx -c /usr/local/nginx/conf/nginx.conf

[root@N+T sbin]# ps -ef | grep nginx

root       1561      1  0 13:04 ?        00:00:00 nginx: master process /usr/bin/nginx -c /usr/local/nginx/conf/nginx.conf

www        1562   1561  0 13:04 ?        00:00:00 nginx: worker process

root       1709   1573  0 18:49 pts/1    00:00:00 grep--color nginx

注意:nginx没有启动起来,麻烦去认真的检查一下nginx配置文件。

PS:开机机动启动的话,直接把启动代码丢进rc.local这个文件里面即可。

[root@N+T lhl]# echo"/usr/bin/nginx  -c /usr/local/nginx/conf/nginx.conf">> /etc/rc.d/rc.local

nginx的基本部署完成!

3.2 Tomcat 的搭建

由于tomcat依赖于jdk环境下运行,所以先搭建jdk环境,配置变量环境

[root@N+T lhl]# mkdir /usr/java/

[root@N+T lhl]# mv jdk7u79linuxx64.tar.gz /usr/java/ && cd /usr/java/ && tar -zxvf jdk7u79linuxx64.tar.gz

[root@N+T java]# ll

total 4

drwxr-xr-x 8 uucp 143 4096 Apr 11  2015 jdk1.7.0_79

[root@N+T java]# cd jdk1.7.0_79/

[root@N+T jdk1.7.0_79]# pwd  #看清楚路径

/usr/java/jdk1.7.0_79

[root@N+T jdk1.7.0_79]#

PS:关于软件依赖的变量环境

就目前来去为一个软件或者环境的运行去搭建变量环境主要用下面三种方法

1、在/etc/profile下配置,这属于大环境的配置了。不过管理上不灵活,属于点到面的管理(本博文由于只有这个tomcat用到,所以在这配置了)

2、在/etc/profile.d/目录下面创建一个专属的变量环境如:tomcat.sh  在里面指的变量路径以及文件路径,这种方式管理很灵活,属于点到点的管理。

3、在软件的某个文本下面去直接添加指定的变量环境,如tomcat的。

[root@N+T bin]# pwd

/usr/tomcatG/tomcat6/bin

[root@N+T bin]# ll

total 612

-rw-r--r-- 1 root root  22705 Nov 28  2011 bootstrap.jar

-rw-r--r-- 1 root root  11830 Nov 28  2011 catalina.bat

-rwxr-xr-x 1 root root  17708 Nov 28  2011 catalina.sh

-rw-r--r-- 1 root root   2374 Nov 28  2011 catalina-tasks.xml

-rw-r--r-- 1 root root  24172 Nov 28  2011 commons-daemon.jar

-rw-r--r-- 1 root root 199623 Nov 28  2011 commons-daemon-native.tar.gz

-rw-r--r-- 1 root root   1342 Nov 28  2011 cpappend.bat

-rw-r--r-- 1 root root   2108 Nov 28  2011 digest.bat

-rwxr-xr-x 1 root root   1689 Nov 28  2011 digest.sh

-rw-r--r-- 1 root root   3150 Nov 28  2011 setclasspath.bat

-rwxr-xr-x 1 root root   4153 Aug 16 10:57 setclasspath.sh ###在这个文件里面指定变量环境

-rw-r--r-- 1 root root   2108 Nov 28  2011 shutdown.bat

-rwxr-xr-x 1 root root   1628 Nov 28  2011 shutdown.sh

-rw-r--r-- 1 root root   2109 Nov 28  2011 startup.bat

-rwxr-xr-x 1 root root   2023 Nov 28  2011 startup.sh

-rw-r--r-- 1 root root  32277 Nov 28  2011 tomcat-juli.jar

-rw-r--r-- 1 root root 249259 Nov 28  2011 tomcat-native.tar.gz

-rw-r--r-- 1 root root   3479 Nov 28  2011 tool-wrapper.bat

-rwxr-xr-x 1 root root   3472 Nov 28  2011 tool-wrapper.sh

-rw-r--r-- 1 root root   2113 Nov 28  2011 version.bat

-rwxr-xr-x 1 root root   1632 Nov 28  2011 version.sh

[root@N+T bin]#

setclasspath.sh  里面指定。软件的不同在不同的文件指定吧,这个可以在度娘查到。第三种办法一般很少用到。

继续!下面在/etc/profile下配置变量环境

export JAVA_HOME=/usr/java/jdk1.7.0_79/  #路径别弄错

export JAVA_BIN=$JAVA_HOME/bin

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

最后直接执行,使得文件profile生效

[root@N+T /]# source /etc/profile

接着执行 java -version  命令即可看到对应的版本号,说明已经生效了。(在这里有些小伙伴会时常出现一个问题,明明tomcat已经实在用这个

jdk版本了,可是输入命令java -version

显示出来的却不是目前tomcat在用的jdk版本,这时候该注意一下查看tomcat下面的comment目录下的jdk版本是否对应的,不是的话。就把jdk下的替换过去,另外我还有寻找另外一种解决办法,希望各位赐教。)

jdk部署完毕!

3.3 tomcat 的搭建

在/usr 下创建tomcatG 的目录,并且把三个版本的tomcat拉到目录下分别改名为tomcat6、tomcat7、tomcat8。最后分别解压,再修改server.xml  文档的端口

[root@N+T tomcatG]# ll

total 12

drwxr-xr-x 9 root root 4096 Aug 16 10:27 tomcat6

drwxr-xr-x 9 root root 4096 Aug 16 10:49 tomcat7

drwxr-xr-x 9 root root 4096 Aug 16 11:11 tomcat8

[root@N+T tomcatG]#

下面修改tomcat6的server.xml文件:三处地方

1、

connectionTimeout="20000"

redirectPort="8443"/>

2、

3、

剩下的tomcat7和tomcat8以此类推!

下面启动tomcat6-8

启动tomcat6:

[root@N+T bin]# pwd

/usr/tomcatG/tomcat6/bin

[root@N+T bin]# ll

total 612

-rw-r--r-- 1 root root  22705 Nov 28  2011 bootstrap.jar

-rw-r--r-- 1 root root  11830 Nov 28  2011 catalina.bat

-rwxr-xr-x 1 root root  17708 Nov 28  2011 catalina.sh

-rw-r--r-- 1 root root   2374 Nov 28  2011 catalina-tasks.xml

-rw-r--r-- 1 root root  24172 Nov 28  2011 commons-daemon.jar

-rw-r--r-- 1 root root 199623 Nov 28  2011 commons-daemon-native.tar.gz

-rw-r--r-- 1 root root   1342 Nov 28  2011 cpappend.bat

-rw-r--r-- 1 root root   2108 Nov 28  2011 digest.bat

-rwxr-xr-x 1 root root   1689 Nov 28  2011 digest.sh

-rw-r--r-- 1 root root   3150 Nov 28  2011 setclasspath.bat

-rwxr-xr-x 1 root root   4153 Aug 16 10:57 setclasspath.sh

-rw-r--r-- 1 root root   2108 Nov 28  2011 shutdown.bat

-rwxr-xr-x 1 root root   1628 Nov 28  2011 shutdown.sh  #这是停止

-rw-r--r-- 1 root root   2109 Nov 28  2011 startup.bat

-rwxr-xr-x 1 root root   2023 Nov 28  2011 startup.sh  #启动

-rw-r--r-- 1 root root  32277 Nov 28  2011 tomcat-juli.jar

-rw-r--r-- 1 root root 249259 Nov 28  2011 tomcat-native.tar.gz

-rw-r--r-- 1 root root   3479 Nov 28  2011 tool-wrapper.bat

-rwxr-xr-x 1 root root   3472 Nov 28  2011 tool-wrapper.sh

-rw-r--r-- 1 root root   2113 Nov 28  2011 version.bat

-rwxr-xr-x 1 root root   1632 Nov 28  2011 version.sh

[root@N+T bin]# ./startup.sh

如图所示!

tomcat 7-8以此类推!

再看一下三个tomcat启动的进程。

[root@N+T bin]# ps -ef |grep tomcat

root       1278      1  0 13:50 ?        00:00:10 /usr/java/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/usr/tomcatG/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/usr/tomcatG/tomcat7/endorsed -classpath /usr/tomcatG/tomcat7/bin/bootstrap.jar:/usr/tomcatG/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/usr/tomcatG/tomcat7 -Dcatalina.home=/usr/tomcatG/tomcat7 -Djava.io.tmpdir=/usr/tomcatG/tomcat7/temporg.apache.catalina.startup.Bootstrap start start

root       1287      1  0 13:50 ?        00:00:13 /usr/java/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/usr/tomcatG/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /usr/tomcatG/tomcat8/bin/bootstrap.jar:/usr/tomcatG/tomcat8/bin/tomcat-juli.jar -Dcatalina.base=/usr/tomcatG/tomcat8 -Dcatalina.home=/usr/tomcatG/tomcat8 -Djava.io.tmpdir=/usr/tomcatG/tomcat8/temporg.apache.catalina.startup.Bootstrap start start

root       1301      1  0 13:50 ?        00:00:08 /usr/java/jdk1.7.0_79/jre/bin/java -Djava.util.logging.config.file=/usr/tomcatG/tomcat6//conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/tomcatG/tomcat6//endorsed -classpath /usr/tomcatG/tomcat6//bin/bootstrap.jar -Dcatalina.base=/usr/tomcatG/tomcat6/ -Dcatalina.home=/usr/tomcatG/tomcat6/ -Djava.io.tmpdir=/usr/tomcatG/tomcat6//temporg.apache.catalina.startup.Bootstrap start

root       1509   1418  0 15:02 pts/0    00:00:00 grep--color tomcat

[root@N+T bin]#

可以看到,各个端口以及运行的变量环境(jdk)这个排版比较长,需要往后面拉取才能看到所有内容。

3.4 配置负载均衡

在nginx里面添加几条代码即可,下面请看

#####nginx+3 T 负载均衡测试############

usernobody;

worker_processes 1;

events {

use epoll;

worker_connections  1024;

}

http

{

include       mime.types;

default_type  application/octet-stream;

sendfileon;

keepalive_timeout  60;

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 8 128k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

fastcgi_temp_path /dev/shm;

upstream li7105.com {              #在此插入

server 127.0.0.1:18080 weight=1;   #tomcat6分流    weight=1  这是权重分配。

server 127.0.0.1:28080 weight=2;   #tomcat7分流    weight=2 显然2更大,那么它被分配任务的几率也就更大

server 127.0.0.1:8088 weight=2;    #tomcat8分流

}

server{

listen       80;

server_name  localhost;

access_log /var/log/nginx/aeecss.log;

error_log  /var/log/nginx/error.log;

location / {

proxy_pass  http://li7105.com;

proxy_redirectdefault;

}

}

}

【关于nginx的负载均衡的分配方式】

nginx关于这个负载均衡方面的权重分配方式有4种:

1.轮询,默认采取此方式,Nginx会按照请求时间的先后顺序进行轮询分发,若某台Web Server宕机,Nginx自动将其摘掉。

2.weight,权重,即轮询的几率,值越大,被分发的可能性越大,用于后端服务器性能不均的情况。

3. ip_hash ,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决共享session的问题。

4.自定义规则

PS:

down 表示当前的Web Server暂时不参与负载

weight 默认为1.weight越大,负载的权重就越大。

backup: 其它所有的非backup Server down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

四、负载均衡的测试

为了是的测试的效果明了些,我把/usr/tomcatG/tomcat6/webapps/ROOT 目录下的index.jsp 文件的内容全部删除掉,直接改为tomcat6 ,7-8一样如此。

[root@N+T ROOT]# catindex.jsp

I am Tomcat 6666666666666!

在测试之前需要检查一下,下面几个个问题。确保没问题了,就去测试,不然返回来做无用功了。

1、nginx、tomcat、jdk正在运行

2、网页上能够哦正常访问nginx 和  tomcat

3、防火墙

我就在本地主机上面的浏览器测试吧,因为跟物理机是连通的。

在浏览器输入:http://192.168.0.144/index.jsp  然后不停按F5刷新网页,接着网页会不停的在tomcat6、tomcat7、tomcat8的内容标识上面做跳转,显示的内容也会不一样。

如图:

不停的刷新,看着页面的变化。你会发现权重等于1的tomcat6出现的次数会比tomcat7和tomcat8的次数很多的。

上面只是个简单的测试,有兴趣的伙伴可以添加去修改这个jsp文档,哈哈。

上述图片说明了nginx的负载均衡是正在运行中的了。测试完毕!

五、总结

在搭建这个环境需要注意的几点:

1、tomcat的端口,由于是在一台机器上面部署3个tomcat,所以改的端口就有9个了。主机端口的范围,超出范围不然tomcat是无法启动的

2、jdk变量环境的搭建,注意路径。

3、nginx 配置文档的参数、模块注意编写。不然无法启动

4、注意防火墙设置,对于需求安全性的伙伴们。当然测试你可以完全的关闭掉。

nginx和tomcat的负载均衡,基本配置完毕,这类型的负载均衡目前在很多的企业被使用。然而这仅仅是企业网络架构中的一个小小的部分,我期待后面能够给大家讲述更多关于这方面的知识。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容