Nginx反向代理实现Tomcat负载均衡
这篇短文主要介绍Tomcat
的集群和用Nginx
反向代理实现Tomcat
负载均衡。
1、首先需要对一些知识点进行扫盲(对自己进行扫盲,囧):
- 集群(Cluster)
简单来说就是用N台服务器构成一个松耦合的多处理器系统(对外是一个服务器),内部通过网络实现通信。让N台服务器之间相互协作,共同承载一个网站的请求压力。用知乎上一个作者的话来说就是“同一个业务,部署在多个服务器上”,这就是集群。 集群中比较重要的是任务调度。 - 负载均衡(Load Balance)
简单来说就是根据某种负载策略把请求分发到集群中的每一台服务器上,让整个服务器群来处理网站的请求,从而共同完成工作任务。
2、安装环境如下:
- 腾讯云主机,安装的是
Centos7.3 64bits
Nginx 1.7.4
-
JDK8
和Tomcat8
3、具体安装步骤:
- JDK安装请参照 点我试试
- Nginx安装请参照 点我试试
-
配置Nginx web反向代理, 实现两个Tomcat负载均衡:
–安装及配置Tomcat
tar -zxvf apache-tomcat-8.5.28.tar.gz
cp -rf apache-tomcat-8.5.28 /usr/local/tomcat1
mv apache-tomcat-8.5.28 /usr/local/tomcat2–修改tomcat1端口号
$ cd /usr/local/tomcat1/conf/
$ cp server.xml server.xml.bak
$ cp web.xml web.xml.bak
$ vi server.xml修改Tomcat2端口号
$ cd /usr/local/tomcat2/conf/
$ cp server.xml server.xml.bak
$ cp web.xml web.xml.bak
$ vi server.xml–添加Tomcat1开机自动启动
–将/usr/local/tomcat1/bin/catalina.sh文件复制到/etc/init.d目录下并改名为tomcat1cp /usr/local/tomcat1/bin/catalina.sh /etc/init.d/tomcat1
–修改/etc/init.d/tomcat1文件,在文件中添加:
vi /etc/init.d/tomcat1
–在第一行下面输入如下内容(否则出现错误:tomcat 服务不支持 chkconfig):
!/bin/sh
chkconfig: 2345 10 90
description:Tomcat1 service
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
……………………………………………………………
$Id: catalina.sh 1498485 2013-07-01 14:37:43Z markt $
—————————————————————————–
CATALINA_HOME=/usr/local/tomcat1
JAVA_HOME=/usr/local/jdk8OS specific support. $var must be set to either true or false.
–添加tomcat服务:
chkconfig –add tomcat1
–设置tomcat为开机自启动:
chkconfig tomcat1 on
–将tomcat2设置开机自启动
–将/usr/local/tomcat2/bin/catalina.sh文件复制到/etc/init.d目录下并改名为tomcat2cp /usr/local/tomcat2/bin/catalina.sh /etc/init.d/tomcat2
–修改/etc/init.d/tomcat2文件,在文件中添加为红色部分:
vi /etc/init.d/tomcat2
–在第一行下面输入如下内容(否则出现错误:tomcat 服务不支持 chkconfig):
!/bin/sh
chkconfig: 2345 10 90
description:Tomcat2 service
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
……………………………………………………………
$Id: catalina.sh 1498485 2013-07-01 14:37:43Z markt $
—————————————————————————–
CATALINA_HOME=/usr/local/tomcat2
JAVA_HOME=/usr/local/jdk8OS specific support. $var must be set to either true or false.
–添加tomcat服务:
chkconfig –add tomcat2
–设置tomcat为开机自启动:
chkconfig tomcat2 on
到这里,tomcat已经安装好了,分别启用它们,打印出来引用的环境分别对应两个tomcat就是对的:
[root@VM_177_101_centos src]# service tomcat1 start
Using CATALINA_BASE: /usr/local/tomcat1
Using CATALINA_HOME: /usr/local/tomcat1
Using CATALINA_TMPDIR: /usr/local/tomcat1/temp
Using JRE_HOME: /usr/local/jdk8
Using CLASSPATH: /usr/local/tomcat1/bin/bootstrap.jar:/usr/local/tomcat1/bin/tomcat-juli.jar
Tomcat started.
[root@VM_177_101_centos src]# service tomcat2 start
Using CATALINA_BASE: /usr/local/tomcat2
Using CATALINA_HOME: /usr/local/tomcat2
Using CATALINA_TMPDIR: /usr/local/tomcat2/temp
Using JRE_HOME: /usr/local/jdk8
Using CLASSPATH: /usr/local/tomcat2/bin/bootstrap.jar:/usr/local/tomcat2/bin/tomcat-juli.jar
Tomcat started.
最后配置配置一下Nginx:
--切换到目录
cd /usr/local/nginx/conf
--修改配置文件
vi nginx.conf
--一些常用配置
--worker_processes:工作进程个数,可配置多个
--worker_connections:单个进程最大连接数
--server:每一个server相当于一个代理服务器
--lister:监听端口,默认80
--server_name:当前服务的域名,可以有多个,用空格分隔(我们是本地所以是localhost)
--location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
--index:当没有指定主页时,默认会选择这个指定的文件,可多个,空格分隔
--proxy_pass:请求转向自定义的服务器列表
--upstream name{ }:服务器集群名称
--现在想通过nginx访问到tomcat,就需要修改配置中的server部分
server
{
listen 80 default;
charset utf-8;
server_name localhost;
access_log logs/host.access.log;
location / {
proxy_pass http://localhost:8080;
proxy_redirect default;
}
}
--到这里方向代理已经完成,这样所有的请求都需要经过代理服务器才能访问到正式服务器。
接下来实现负载均衡,在安装的过程中tomcat1配置的端口是8080,tomcat2配置的端口是8081。然后我们需要在配置文件中定义上游服务器(upstream server)
#服务器的集群
upstream testcomcat {
#weight是权重 权重越大,分配的几率越大
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
}
server
{
listen 80 default;
charset utf-8;
access_log logs/host.access.log;
location / {
proxy_pass http://testcomcat;
proxy_redirect default;
}
}
--为了看到不一样,我将tomcat root下面的index.jsp页面稍微改动了一下,分别加入了TEST1,TEST2,方便区分,重启nginx,浏览器地址栏输入IP,进行访问,多刷新几次页面,会发现是在两个服务器间切换,如下图所示:
server nginx reload