目标:
(1)安装jdk
(2)配置nginx+tomcat多服务器模式
(3)配置负载均衡
(4)配置反代服务器
一、jdk安装
(1)jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
(2)下载完成后解压压缩包即可
(3)设置环境变量
修改/etc/profile文件,在最后面添加jdk的路径即可
export JAVA_HOME=/usr/java/jdk1.8.0_171 #根据实际路径来设置
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
添加完成后需要使环境变量生效,使用source /etc/profile,然后echo $JAVA_HOME,使用命令java -version,如果能够输出jdk的版本的话,说明环境变量已经生效了。
二、配置nginx+tomcat多服务器模式
1、安装nginx+tomcat(网上资源比较多,就此略过)
注意:在下载tomcat包的时候需要选择core中的包,其他的包不是完整的。tomcat包下载后解压即可。
2、tomcat多服务模式设置
(1)tomcat包解压后就相当于形成了一个web环境,因此需要多服务模式的话就应该有多个web环境。方式很简单,将解压后的文件copy多份即可
~]# mv apache-tomcat-8.5.32tomcat1
~]# cp –ar tomcat1 tomcat2
至此,我们已经有了两个tomcat环境了,要想两个都能同时运行,还得设置好两个tomcat的环境变量。
(2)环境变量设置
就如同安装jdk时需要设置环境变量之外,tomcat也需要设置,由于tomcat有两个web环境,因此都需要设置进去,否则那个没有环境变量的是启动不了的。修改/etc/profile文件,在最后面添加如下内容:
export CATALINA_BASE=/usr/tomcat1
export CATALINA_BASE2=/usr/tomcat2
export PATH=$PATH:CATALINA_BASE/bin:CATALINA_BASE2/bin
现在就有两个tomcat的环境变量了,分别是CATALINA_BASE和CATALINA_BASE2这两个变量了。
修改完成之后先不要急着将tomcat启动,因为tomcat2的环境变量名称是CATALINA_BASE2,但是在tomcat2和tomcat1的配置文件中的环境变量名称都是CATALINA_BASE(tomcat2是从tomcat1复制过来的,因此目前所有文件都一致),所以,必须得将tomcat2的配置文件中的所有相关字符串全部修改过来。具体修改内容如下:
第一步:
~]# vim /usr/tomcat2/bin/catalina.sh
在文件的110行附近添加如下内容:
# OS specific support. $var _must_be set to either true or flase.
# self: add
export CATALINA_BASE=$CATALINA_BASE2
JAVA_OPTS="-server -Xms512m -Xmx512 -Xss512K -XX:PermSize=128m -XX:MaxPermSize=256m"
如图所示:
第二步:将当前文件夹下的catalina.bat和startup.sh文件中的所有CATALINA_BASE换成CATALINA_BASE2
首先开始编辑文件,进入命令模式,在最底行输入:%s/CATALINA_BASE/CATALINA_BASE2/g,这样就把所有的字符串全部修改了。
至此,tomcat的环境变量就设置完毕了,快来开始下一步吧。
(3)tomcat端口修改
我们都知道,两个独立的进程是不能使用同一个端口的,但是我们刚才直接将tomcat1复制到了tomcat2,所以端口肯定都是一样的啦,这怎么行,一山不容二虎,一个球门怎么能站两个守门员呢
第一步:我们首先要了解的是,tomcat总共需要占用三个端口,默认情况下,它们分别是
HTTP:8080(这就是tomcat的主要服务端口啦)
AJP:8009(用于监听其他服务的请求)
SHUTDOWN:8005(关闭端口)
第二步:了解以上情况,我们需要将tomcat2的端口修改成不能与tomcat1一样,索性就将tomcat2的默认端口都加1吧,也 就是tomcat2的端口分别是
HTTP:8081
AJP:8010
SHUTDOWN:8006
第三步:修改/usr/tomcat2/conf/server.xml文件
将相应的端口都修改成以上的值就行了
至此,tomcat的端口也已经全部修改完毕了。
(4)权限设置
我们将tomcat解压时的属主和属组都是root,但是进程运行是通过tomcat用户来操作的,因此需要建立tomcat用户并且将权限交给tomcat。
第一步:将tomcat的启动和关闭脚本都设置为所有者可执行
~]# cd /usr/tomcat1/bin
~]# chmod u+x ‘*.sh’
~]# useradd tomcat
~]# chown –R tomcat:tomcat/usr/tomcat1
第二步:tomcat2与tomcat1是一样的操作
权限修改完毕,终于到了启动阶段了。
(5)tomcat启动
刚才已经知道了,tomcat的启动脚本在/usr/tomcat1/bin/目录下了,名称为startup.sh,关闭脚本为shutdown.sh。此时我们运行startup.sh脚本即可。
运行完毕我们通过以下命令即可查看是否启动完成:
~]# ss –tnl
如果看到了tomcat的三个端口了,那就说明tomcat1启动成功了,tomcat2是一样的操作,到最后我们应该看到6个端口才对。
3、nginx启动
相对于tomcat来说,nginx启动实在是太简单了。
直接运行nginx的启动文件即可,/usr/local/nginx/sbin/nginx
然后运行ss –tnl查看到80端口起来了就说明启动成功。
至此,我们已经将nginx和tomcat完全启动完毕了,剩下的就是修改nginx的配置文件来进行负载均衡和反代服务器的设置了。
三、负载均衡和反代服务器配置
1、nginx和tomcat相关文件目录
nginx配置文件:/usr/local/nginx/conf/nginx.conf内容如下:
nginx的web页面目录:/usr/local/nginx/html
tomcat的web页面目录:/usr/tomcat/webapps/ROOT/
2、nginx有很多模块,这次主要研究研究的是http模块,包括其中的upstream模块和server等模块。
server模块:
server{
listen80;
server_namelocalhost;
#charsetkoi8-r;
#access_loglogs/host.access.log main
location/ {
root html;
index index.html index.htm;
}
}
这个server其实设置的就是一个代理服务器,可以同时配置多个。
listen:表示代理服务器监听的端口,配置多个的时候端口值需要修改成不一样的。
server_name:表示监听后需要转到哪个服务器
location:表示匹配的路径都会转到其后面包括的内容里面
root:一旦匹配到这个请求的路径时,将会在这个文件夹下寻找内容,如“root html”表示的就是在/usr/loca/nginx/html/这个目录下寻找
index:当没有指定主页的时候,则会默认选择这几个文件(这几个文件就在root里面)
nginx转发到tomcat
刚才说过location就是基于匹配的内容来进行转接的。因此,若需转到tomcat,则只需要讲location中的内容修改为
location/ {
proxy_pass/http://localhost:8080;
}
我们知道,tomcat监听的就是8080和8081这两个端口,刚刚又将nginx的80端口转到了8080端口。因此我们相当于访问了http://IP:8080了,此处我们用的是虚拟机配置的服务,因此在自己电脑浏览器上应该输入的是http://IP:8080,否则就会报错。
至此,我们就可以将nginx的欢迎页变成tomcat1的欢迎页了,也就是说完成了nginx反代服务器的配置了,真的是很简单。
负载均衡配置
通俗来说,nginx后端的web服务器是不可能只有一台的,一般都是一个集群,包括多台服务器。所以一旦客户端发送了请求来的话,如果我们不能合适地控制请求的流向的话,那就很有可能大部分的请求都发送到某一个后端服务器上了,这样是极其不利于集群的性能的,并且很有可能导致此服务器宕机。因此我们要合理地使客户端的请求分发到后端服务器上。
这就要使用到nginx的upstream模块了。
第一步:我们首先得定义这个集群,通过upstream模块可以很好的定义集群。
upstreamtomcat {
serverlocalhost:8080;
serverlocalhost:8081;
}
这样,我们就定义好了一个集群了。其中tomcat我们姑且认为是这个集群集群得的组名吧,也就是说我们可以用http://tomcat来表示这里面的所有服务器。
第二步:设置好了集群之后,我们想要将客户端的请求发送到此集群的话只需要这样:
server{
listen80;
server_namelocalhost;
location/ {
proxy_pass http://tomcat/;
}
}
这样,我们就将nginx收到的请求全部发送到了后端的tomcat集群了,也就是说,用户在访问http://localhost:80的时候,其实是在访问http://tomcat/。
但是,我们的目的是将请求合适地发送给后端集群的啊,就只是这样将请求转发到后端服务器完全不是我们的目标啊。因此,我们需要使用负载均衡算法来完成请求的合理分配。
负载均衡算法
首先,我们需要了解负载均衡算法有哪些呢?主要有如下几种:
轮询算法(Round Robin):这个就相当于一个环形队列,每次从头开始分发请求,轮询一圈完毕之后又从头开始分发请求,无穷无尽。
加权轮询算法(WRR):加权可以给某台服务器添加权重,权重大的服务器有更高的几率获得请求(根据我实验发现并不是概率,而是根据权重的值来分配的,比如两台服务器的权重为4和2,那么前四个请求就是第一个服务器的,后面两个请求才是第二个服务器的,而并不是按照概率来算的)
ip_hash算法:就是根据客户端的ip地址来进行hash运算,通过计算得到的值,然后根据hash的表来根据值来进行请求分发。
最少连接算法(least connections):顾名思义,通过比较后端的服务器的连接数来分发请求,连接数最少的才可以得到请求。
随机算法(Random):如果后台有两台服务器的话,那么每次每台服务器获得请求的概率都是1/2;同理,三台服务器就是1/3…
fair算法:根据后台服务器的响应时间来分发请求
url_hash算法:根据请求报文的url来进行hash运算,然后根据hash表来进行分发请求
负载均衡的配置:
负载均衡算法是配置在upstream模块里面的。各种算法的配置示例如下:
(1)轮询算法
upstreamtomcat {
serverlocalhost:8080;
serverlocalhost:8081;
}
(2)加权轮询算法
upstream tomcat {
server localhost:8080 weight=1;
server localhost:8081 weight=2;
}
这里的权重都是1的话相当于是轮询算法。其他数值不行,因为这个是按数量来分发请求的。
(3)ip_hash算法
upstream tomcat {
ip_hash;
server localhost:8080;
server localhost:8081;
}
(4)最少连接算法
(5)fair算法
upstream {
serverlocalhost:8080;
server localhost:8081;
fair;
}
(6)url_hash算法
upstream {
server localhost:8080;
server localhost:8081;
hash $request_uri;
hash_method crc32;
}
至此,负载均衡算法的配置也基本完成了,若想调用该算法,只需要设置好相应的集群和算法,然后在server模块中将nginx请求转发到响应的集群中即可。目前技术知识能力有限,只能记录于此,后期再跟进其他内容。