https://blog.51cto.com/zero01/2112989
第一步、搭建Tomcat
下载最新的Tomcat安装包(我选择了最新版的)
官网地址:`https://tomcat.apache.org/
如果下载到本机,可以用xftp上传到需要安装的linux上,路径 /usr/local/src/ ,我使用wget下载。
右键tar.gz,复制链接地址:http://mirrors.shu.edu.cn/apache/tomcat/tomcat-9/v9.0.16/bin/apache-tomcat-9.0.16.tar.gz
然后去linux主机上,wget 下载
- Linux操作步骤:可按步骤命令搭建负载均衡环境
进入要下载的文件的目录
cd /usr/local/src/
下载选择的Tomcat包
wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-9/v9.0.16/bin/apache-tomcat-9.0.16.tar.gz
解压
tar -zvxf apache-tomcat-9.0.16.tar.gz
因为等会要与Nginx做负载均衡,所以创建两个tomcat文件
先复制一份到制定的路径下
cp -r apache-tomcat-9.0.16 /usr/local/tomcat01
再把原文件移动到刚刚相同的文件的目录下
mv apache-tomcat-9.0.16 /usr/local/tomcat02
修改Tomcat配置文件
cd /usr/local/tomcat01/conf/
vim server.xml
修改内容:下图
注意:一共是三个地方,按顺序从上往下改
修改tomcat访问页面的内容(等会区分负载均衡是否配置成功用)
vim /usr/local/tomcat01/webapps/ROOT/index.jsp
添加:echo "-----------first tomcat------------"
vim /usr/local/tomcat02/webapps/ROOT/index.jsp
添加:echo "-----------second tomcat------------"
- Tomcat是java程序,所以在运行Tomcat前面,需要配置jdk,如果有配置了jdk可以跳过这段
cd /usr/local/src/
官网下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
建议不要用wget现在,这样下载下来用tar解压不了
具体的下载的包包含在这个页面的一个link中,因此运行上述下载命令下载的实际是一个html的page。
file XXXXX.tar.gz
XXXXX.tar.gz: HTML document
所以报错的原因在这里,而不是解压命令不对的问题
下载到Windows上,通过xftp上传到/usr/local/src/路径下,然后解压
wget下载的包QAQ,所以....
配置java环境变量
vim /etc/profile
在最后面 添加下面配置
export JAVA_HOME=/usr/local/src/jdk1.8.0_201
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
启动tomcat01文件下的tomcat服务
cd ../bin/
sh startup.sh
tomcat01启动成功!
启动tomcat02
sh /usr/local/tomcat02/bin/startup.sh
tomcat02启动成功
二、搭建nginx
- 安装包和环境准备
如果不能下载,请找官网下载对应的版本
pcre:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz
zlib:http://zlib.net/zlib-1.2.11.tar.gz
openssl:https://www.openssl.org/source/openssl-1.0.2r.tar.gz
nginx:http://nginx.org/download/nginx-1.14.2.tar.gz
- Nginx与Redis一样,都是C语言开发的,所以都需要在Linux上使用C语言编译后才能使用,所以得先安装用于编译的c环境
安装Redis时,只需要安装下面第一项的"yum install gcc-c++"即可;nginx则需要安装下面4项
安装gcc-c++
yum install gcc-c++
检查是否安装
rpm -q gcc-c++
下载pcre
cd /usr/local/src/
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz
下载zlib
wget http://zlib.net/zlib-1.2.11.tar.gz
下载openssl
wget https://www.openssl.org/source/openssl-1.0.2r.tar.gz
下载nginx
wget http://nginx.org/download/nginx-1.14.2.tar.gz
解压
tar -zxvf nginx-1.14.2.tar.gz
tar -zxvf pcre-8.39.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
tar -zxvf openssl-1.0.2r.tar.gz
安装PCRE库
cd pcre-8.39
./configure
make
make install
安装zlib库
cd /usr/local/src/zlib-1.2.11
./configure
make
make install
安装openssl
cd /usr/local/src/openssl-1.0.2r
./config
make (时间有点长哦)
make install (时间也有点长哦)
安装nginx
cd /usr/local/src/nginx-1.14.2
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-pcre=../pcre-8.39 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.0.2r
make
make install
cd /usr/local/nginx/sbin/
启动nginx
./nginx
浏览器输入ip查看是否启动成功
第二步安装nginx已经大
三、配置stub_status 模块(后面做性能分析用)
备份旧文件
mv nginx nginx.bak
将编译好的nginx执行文件拷贝到启动的目录
cp /usr/local/src/nginx-1.14.2/objs/nginx /usr/local/nginx/sbin/
编辑配置文件,如下:开启stub_status
vim /usr/local/nginx/conf/nginx.conf
在server下添加:
location /nginx_status {
stub_status on;
access_log off;
}
重启nginx,重新加载nginx配置文件
./nginx -s reload
访问如下命令
curl 127.0.0.1/nginx_status
Active connections: 1
server accepts handled requests
4 4 4
Reading: 0 Writing: 1 Waiting: 0
或者百度(我用的是自己的linux公网,如果你在本机安装的,请用你自己的ip)
http://118.31.57.104/nginx_status
nginx_status展现字段 | 含义描述 |
---|---|
Active connections | 对上游服务发起的连接数 |
Server accepts handled requests | 总共处理了10个连接,成功创建10次握手(证明中间没有失败的),总共处理了63个请求. |
Reading: | nginx读取到客户端的Header信息数 |
Writing | nginx返回给客户端的Header信息数. |
需要注意的是如果reading或writing的值很高,说明正在处理的数据量很大,可能是因为后端的动态就用程序处理慢,这个时候需要对后端进行优化。
Waiting: 开启keep-alive的情况下,这个值等于 Active – (Reading + Writing),意思就是nginx已经处理完成,正在等候下一次请求指令的驻留连接.所以,在访问效率高,请求很快被处理完毕的情况下,Waiting数比较多是正常的.waiting的意思就是已经将请求处理完毕,并且把数据已经返回给了客户端,已经闲置在等待接受下次请求了,因此这个值比较高往往说明请求处理的很快。一般应该是writing和reading越小“越好”,而waiting越高“越好”。
四、nginx和Tomcat做负载均衡
nginx和Tomcat做负载均衡其实主要玩的就是nginx的conf文件配置
进入nginx配置文件
cd /usr/local/nginx/conf/
vim conf/nginx.conf
listen 80;代表监听80端口
server_name xxx.com;代表外网访问的域名(losthost本机)
location / {};代表一个过滤器,/匹配所有请求,
我们还可以根据自己的情况定义不同的过滤,比如对静态文件js、css、image制定专属过滤
root html;代表站点根目录
index index.html;代表默认主页
这样配置完毕我们输入域名就可以访问到该站点了。
- 负载均衡功能往往在接收到某个请求后分配到后端的多台服务器上,那我们就需要upstream{}块来配合使用,配置如下:
upstream webservers {
server 118.31.57.104:8081 weight=1;
server 118.31.57.104:8081 weight=2;
}
proxy_pass http://webservers;
proxy_redirect default;
conf文件配置解释
nginx.conf变量 | 描述 |
---|---|
upstream xxx{} | upstream模块是命名一个后端服务器组,内部可以写多台服务器ip和port,还可以设置跳转规则及权重等等(XXX规范点就写服务器站点的域名) |
ip_hash | 代表使用ip地址方式分配跳转后端服务器,同一ip请求每次都会访问同一台后端服务器(我这边没有配置) |
server | 代表后端服务器地址 |
weight | 转发请求的权重,等会下面单独列一个模块写 |
server{} | server模块依然是接收外部请求的部分 |
server_name | 代表外网访问域名,losthost就是指本机的ip |
location / {} | 同样代表过滤器,用于制定不同请求的不同操作 |
proxy_pass | 代表后端服务器组名,upstream 后的XXX |
proxy_redirect | 当后端服务做302、301跳转的时候,需要用proxy_redirect将后端设置在response header中的Location做转换(default:我不想让他生效) |
server_name和upstream{}的组名可以不一致,server_name是外网访问接收请求的域名,upstream{}的组名是跳转后端服务器时站点访问的域名
重启nginx,查看负载均衡是否成功
cd /usr/local/nginx/sbin/
./nginx -s reload
在浏览器输入ip然后刷新:因为我weight设置的是1,2,所以:没三次刷新
first tomcat显示一次
second tomcat显示两次
含义:nginx接受到了浏览器的请求,然后转发给upstream 中配置的Tomcat服务器,按照weight的权重配置进行转发
到这里就大功告成了~
下篇介绍Tomcat的性能监控和nginx负载均衡里每个Tomcat搭建bugfree应用程序
(以下是拷贝别人的,本身也不是很理解,还没有那样配置过,测试小白路过)
upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低廉。
缺点:可靠性低和负载分配不均衡。适用于图片服务器集群和纯静态页面服务器集群。
ip_hash(访问ip)
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream favresin{
ip_hash;
server 10.0.0.10:8080;
server 10.0.0.11:8080;
}
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。
upstream favresin{
server 10.0.0.10:8080;
server 10.0.0.11:8080;
fair;
}
url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
upstream resinserver{
server 10.0.0.10:7777;
server 10.0.0.11:8888;
hash $request_uri;
hash_method crc32;
}
upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:
upstream配置 | 含义 |
---|---|
down | 表示单前的server暂时不参与负载. |
weight | weight 默认为1.weight越大,负载的权重就越大。 |
max_fails | 允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误. |
fail_timeout | max_fails次失败后,暂停的时间。 |
backup | 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。 |
upstream bakend{ #定义负载均衡设备的Ip及设备状态
ip_hash;
server 10.0.0.11:9090 down;
server 10.0.0.11:8080 weight=2;
server 10.0.0.11:6060;
server 10.0.0.11:7070 backup;
}