nginx + tomcats实现Tomcat集群
三个tomcat部署的业务相同,它们共同访问一个数据库
选中文本自动复制到剪贴板上,类似Ctrl+v
实现Ctrl+v黏贴文本
go最简单的Shell脚本
cd /usr/local/src #进入用户默认安装文件目录
. go #手动执行Shell脚本
xShell文件->属性:
克隆虚拟机
网络模式
桥接模式:自动分配新的IP地址,相当于当前局域网多了台电脑。
NAT模式:自己组一个私有局域网,实现双网卡,VMware8虚拟网卡。这样随着教室和办公室切换,IP地址不会变更。而桥接可能IP地址发生变更。不需要多个环境切换时,推荐使用桥接。
虚拟机的坑
很多优化软件如360,腾讯管家都会自动关闭这两个服务,如果关闭手动打开。
设置为自动启动!
QQ电脑管家会关闭,也需要打开
yum -y install glibc.i686 #jdk依赖glibc
mkdir /usr/local/src/java #按习惯用户自己安装的软件存放到/usr/local/src目录下
rz 上传jdk tar包 #利用xshell的rz命令上传文件
tar -xvf jdk-7u51-linux-x64.tar.gz #解压压缩包
1)vi /etc/profile
2)在尾行添加
#set java environment
JAVA_HOME=/usr/local/src/java/jdk1.7.0_51
JAVA_BIN=/usr/local/src/java/jdk1.7.0_51/bin
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
保存退出
3)source /etc/profile 使更改的配置立即生效
4)java -version 查看JDK版本信息。如显示1.7.0证明成功。
上传解压
创建目录/usr/local/src/java
上传文件xshell rz
解压文件tar –xvf apache-tomcat-7.0.55.tar.gz
端口配置
cd apache-tomcat-7.0.55
cd conf
vi server.xml 修改8080为80
注意:多个tomcat修改3个端口。8005/8009/8080。
启动停止服务
进入tomcat/bin目录
运行shell脚本: ./startup.sh 或者 sh startup.sh
停止服务: sh shutdown.sh
查看日志
查看日志:
tail –f ../logs/catalina.out
注意在linux和windows下查看的日志文件不同。在windows下查看的是localhost.2016-02-08.log文件。
删除日志,临时文件: rm -rf ./* 删除当前目录下所有文件
*关闭防火墙
service iptables stop //关闭防火墙
start/stop/restart 开启、停止、重启防火墙
打开端口8080, 8090, 8100
/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
#I不指定位置就是插入到最前面 -A默认是插入到尾部的,可以-I来插入到指定位置
iptables -I INPUT 3 -p tcp -m tcp --dport 8080 -j ACCEPT
#INPUT是进入的链接,TCP协议的链接,连接的80端口 ACCEPT是允许,REJECT是拒绝
/etc/rc.d/init.d/iptables save #修改生效
/etc/init.d/iptables status #查看配置
开启MYSQL远程访问权限
语法:
grant [权限] on [数据库名].[表名] to ['用户名']@['web服务器的ip地址'] identified by ['密码'];
grant all on *.* to 'root'@'%' identified by 'root';
或者指定IP地址
grant all on *.* to 'root'@'192.168.1.103' identified by 'root';
cd /usr/local/src
mkdir java
cd java
rz #上传tomcat
tar –xvf apache-tomcat-7.0.55.tar.gz #解压
mv apache-tomcat-7.0.55 t1 #修改目录名形成第一个tomcat
cd /usr/local/src/java/t1/webapps
rm -rf * #删除所有,不需留
rz #上传war包
mv jt-manage-web-0.0.1-SNAPSHOT.war ROOT.war #修改文件名为ROOT.war
cd ..
bin/startup.sh #启动tomcat,自动解压war包
bin/shutdown.sh #停止tomcat,进行配置
cd webapps/ROOT/WEB-INF/classes #进入目录修改数据库连接属性
vim jdbc.properties #注意:mysql必须授权grant all远程访问权限
清除现场
cd logs
rm –rf *.* #删除所有日志文件,查看日志时更加方便,没有以前数据干扰
cd ..
rm –rf work #删除缓存目录,防止文件不更新
部署多个实例
cp –r t1 t2 #复制t1目录为t2目录,形成第二个tomcat
cp –r t1 t3 #复制t1目录为t3目录,形成第三个tomcat
vim conf/server.xml #修改三处8005,8080,8009,每次加10,方便记忆
启动t1,t2,t3 #启动所有tomcat
tail –f t1/logs/catalina.out #查看日志,看启动是否成功,需要一会
访问测试
http://192.168.163.158:8080/page/index
http://192.168.163.158:8090/page/index
http://192.168.163.158:8100/page/index
提供5种负载均衡策略:
轮询
默认配置,tomcats有n个,请求就被平均分配到这n个服务器上。请求次数%n,平均分配到每个服务器。
例子:3个tomcat
修改3个端口,在同一台服务器上启动3个tomcat。每个tomcat下放一个index.html。然后内容修改,分别展示T1,T2,T3。当请求nignx,通过这种方法验证得出默认nginx轮询这3个页面,但顺序不一定是配置的顺序。
#前台,有3个tomcat集群,用户访问时轮询转向到某一个tomcat
server {
listen 80;
server_name www.jt.com;
location / { #拦截所有的资源
proxy_pass http://jt_tomcats; #引用定义的upstream
}
}
#配置一个upstream,声明一个名称jt_tomcats,配置多个ip地址转向,默认就是轮询。
upstream jt_tomcats {
server 127.0.0.1:8080;
server 127.0.0.1:8090;
server 127.0.0.1:8100;
}
轮询方式存在问题:服务器有性能比较好的,有性能比较差的。新的服务器的配置比旧的服务器强悍很多。CPU核也多,内存也大,硬盘容量也大,速度还快。
如果还使用轮询的方式,就会造成新服务器资源的浪费,旧的服务器资源压力大。显然资源分配不合理,应该多劳多得。
权重
#前台,有3个tomcat集群,用户访问时轮询转向到某一个tomcat
server {
listen 80;
server_name www.jt.com;
location / { #拦截所有的资源
proxy_pass http://jt; #引用下面定义的upstream
}
}
#配置一个upstream,声明一个名称jt,配置多个ip地址转向,默认就是轮询
upstream jt {
server 127.0.0.1:8080 weight=8; #访问请求分成9份,这个tomcat负责8份的链接
server 127.0.0.1:8090 weight=1; #访问请求分成9份,这个tomcat负责1份的链接
server 127.0.0.1:8100 down; #这个tomcat暂时不参加负载
}
*解决Session共享的解决办法
问题的由来:访问一个网站时,有两类请求。一种请求叫做无状态的请求,一种请求叫做有状态。
无状态,例如:登录页面,类似这种页面,哪个tomcat给我们响应都是一样的,不需要区分。这是我们最喜欢的。集群的动态伸缩性(增加节点,移除节点)。
有状态,例如:系统登录后,假如用户的请求被转发到tomcat1上,这时系统会写一个当前用户的信息放入session中。这种情况就称为有状态的,问题就来了。nginx负载均衡后,下一次用户的请求就被转发tomcat2上。tomcat2上没有session。系统就会要求用户去登录,这显然是不合理的。把这个问题称作session共享问题。
解决的办法:
session同步
tomcat支持动态将某个tomcat下的session复制到其他的tomcat中。但是这个方式是早期的企业级应用习惯的方式。现在很少使用。
这种方式在集群数量很少时,结果还是可以的。但如果集群数量庞大。都需要复制session,这时会因为网络延迟,或者session的内容非常大。都会造成隐患,这时可能读到脏数据。
Session黏着-放在服务端
对ip地址或者域名地址进行hash;或者uri进行hash。
缺点:用户浏览器的IP地址hash以后满足单调性。会可能造成资源的分配不均衡,负载均衡就达不到到目的。有的服务器负载过重,有的服务器负载过轻,显然没有充分利用资源。
#配置一个upstream,声明一个名称jt,配置多个ip地址转向,默认就是轮询
upstream jt {
ip_hash; #IP_HASH方式来实现session共享
server 127.0.0.1:8080 weight=5; #访问请求分成9份,这个tomcat负责8份的链接
server 127.0.0.1:8090 weight=5; #访问请求分成9份,这个tomcat负责1份的链接
server 127.0.0.1:8100 down; #这个tomcat暂时不参加负载
}
因为uri比ip地址相应数量多,变化就多,因此uri-hash比ip-hash分布更均衡些。
uri-hash需要第三方软件支持pcre-8.02.tar.gz、Nginx_upstream_hash-0.3.1.tar.gz
将信息放到cookie-放在客户端
session存在服务器端,会对服务器产生压力。如果将信息保存到cookie中,减轻了服务器的压力,同时每个客户端的压力也很小。因为只保存自己的信息。这种方式在实际的开发中广泛的采用。
缺点:cookie可以被禁用,cookie要随着浏览器传递,增大了传输的内容,cookie大小有限制。