设为首页 收藏本站
查看: 1275|回复: 0

[经验分享] Tomcat+apache实现负载均衡

[复制链接]

尚未签到

发表于 2018-11-23 12:41:01 | 显示全部楼层 |阅读模式
  实验环境:Red Hat Enterprise Linux Server release 6.4


内核:Linux 2.6.32-358.el6.x86_64

下载jdk和tomcat

  Jdk


  老版本:jdk-6u31-linux-x64-rpm.bin


  http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u45-oth-JPR


  新版本:jdk-7u9-linux-x64.rpm


  http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html


  Tomcat :apache-tomcat-7.0.42.tar.gz


  http://tomcat.apache.org/download-70.cgi


  


一、配置安装tomcat,主机ip:172.16.5.12 hostname www.a.com
  1、装jdk


  jdk-7u9-linux-x64.rpm直接rpm -ivh就行了


  我使用jdk-6u31-linux-x64-rpm.bin安装


# chmod +x jdk-6u31-linux-x64-rpm.bin
# ./jdk-6u31-linux-x64-rpm.bin
Press Enter to continue.....
直接ctrl+c退出
# cd /usr/java
# ls
default jdk1.6.0_31 latest
#vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
# . /etc/profile.d/java.sh
# java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04) 运行环境版本
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)HotSpot(TM) Java虚拟机的名称
2、装tomcat
  

# tar xf apache-tomcat-7.0.42.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv apache-tomcat-7.0.42 tomcat
# vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
# . /etc/profile.d/tomcat.sh
# cd /usr/local/tomcat/bin
# catalina.sh version
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:  /usr/java/latest
Using CLASSPATH:  /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.42
Server built: Jul 2 2013 08:57:41
Server number: 7.0.42.0
OS Name:  Linux
OS Version:  2.6.32-358.el6.x86_64
Architecture: amd64
JVM Version: 1.6.0_31-b04
JVM Vendor:  Sun Microsystems Inc.
# catalina.sh start 启动服务
# catalina.sh stop 停止服务  

http://172.16.5.12:8080/
  

Tomcat 默认监听8080端口
DSC0000.jpg


  

Apache tomcat进行管理,需要配置 /usr/local/tomcat/conf/tomcat-users.xml
  

图中有说明如何配置 ,需要加入两组用户
  

DSC0001.jpg
  

DSC0002.jpg
  

# vim /usr/local/tomcat/conf/tomcat-users.xml


  

DSC0003.jpg
  


3、可以为tomcat写一个服务脚本,让他开机自动启动

  

# vim /etc/rc.d/init.d/tomcat
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
JAVA_HOME=/usr/java/latest
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME
exec $CATALINA_HOME/bin/catalina.sh $*
# chmod +x /etc/rc.d/init.d/tomcat
# chkconfig --add tomcat
# chkconfig tomcat on
# service tomcat stop

二、自定义一个虚拟主机,提供java程序页面

  下载论坛程序JspRun!_6.0.0_GBK.zip


  http://down.chinaz.com/soft/24848.htm


  

# mkdir -pv /web/app1
# unzip JspRun!_6.0.0_GBK.zip
# cp -rp upload/* /web/app1/
# vim /usr/local/tomcat/conf/server.xml





# service tomcat stop
# service tomcat start  浏览器中输入http://172.16.5.12/install.jsp


  安装即可


DSC0004.jpg


  中间要为论坛创建一个数据库管理员帐号,要在论坛绑定的数据库中创建,当然,mysqld也是实现要装好的。


DSC0005.jpg


  


  



三、以上面配置好的tomcat为基础,配置Apache基于mod_jk代理连接tomcat
  ajp(Apache jserv protocal)


  Apache做代理时,mod_proxy模块对httphttpsajp三种协议都支持,mod_jk则只支持ajp协议。


  对于http协议时,tomcat服务器就是一个完全意义上的web服务器。


  对于ajp协议时,tomcat服务器是服务器端,代理是客户端,需要连接器连接。需要加载mod_jk.so,需要安装jk连接器来实现。


  Apache做代理,支持ajp协议,可以禁用http协议,这样就可以把tomcat完全隐藏在后端,用户只有通过Apache代理才能访问。


  Nginx跟后端tomcat建立连接必须基于http协议。


  以Apache服务器做代理,进行配置


  Ip:172.16.5.11


  Hostname www.b.com


  后端tomcat服务器


  Ip:172.16.5.12


  Hostname www.a.com


  Apache服务器配置


  

# yum -y groupintall “ Development tools”“ Server Platform Development”
# yum -y install httpd
# yum -y install apr-devel apr-util-devel httpd-devel(包含apxs)安装jk连接器http://tomcat.apache.org/download-connectors.cgi
  JK 1.2.37 Source Release tar.gz


  

# tar xf tomcat-connectors-1.2.37-src.tar.gz
# cd /root/tomcat-connectors-1.2.37-src/native
# ./configure --with-apxs=/usr/sbin/apxs
# make && make install
# ls /usr/lib64/httpd/modules/
# cd /etc/httpd/conf.d/
# vim mod_jk.conf
注释:# Load the mod_jk
LoadModule jk_module modules/mod_jk.so #加载刚编译的模块
JkWorkersFile /etc/httpd/conf.d/workers.properties # jk连接器的工作属性
JkLogFile logs/mod_jk.log # 日志
JkLogLevel debug #日志级别
JkMount /* TomcatA #加载的实例 与Apache代理的tomcat配置文件中的实例相对应
JkMount /status/ stat1 #start1 在workers.properties 中定义  


  Workers.properties


  

# cd /etc/httpd/conf.d/
# vim workers.properties
worker.list=TomcatA,stat1
worker.TomcatA.port=8009  #ajp协议监听的端口
worker.TomcatA.host=172.16.5.12 #tomcat服务器 ip
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.stat1.type = status #状态信息
JkMount /status/ stat1----------》worker.stat1.type = status
  

TomcatA的解释
  tomcat服务器上编辑配置文件


  

这样就实现了Apache基于ajp协议对tomcat代理了,重启httpd即可生效。
  


四、Apache基于mod_jk代理tomcat实现负载均衡

  1、另开一台虚拟机,配置ip


  

# ifconfig eth0 172.16.5.13/16 up
# hostname www.c.com2、安装配置tomcat
  3、在代理服务器上修改配置文件/etc/httpd/conf.d/workers.properties


  4、便捷配置

# vim /etc/httpd/conf.d/workers.properties
worker.list = lbcluster1,stat1
worker.TomcatA.type = ajp13
worker.TomcatA.host = 172.16.5.12
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 5
worker.TomcatB.type = ajp13
worker.TomcatB.host = 172.16.5.13
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 5
worker.lbcluster1.type = lb
worker.lbcluster1.sticky_session = 0
worker.lbcluster1.method = R
worker.lbcluster1.balance_workers = TomcatA, TomcatB
worker.stat1.type = status

5、后端tomcat服务器为
  Ip:172.16.5.12 www.a.com


  Ip:172.16.5.13 www.c.com


  Ip:172.16.5.12 www.a.com


  

# Vim /usr/local/tomcat/conf/server.xml





# mkdir /web/app2
# vim /web/app2/index.jsp


TomcatA

TomcatA


Session ID




Created on





# service tomcat stop
# service tomcat startIp:172.16.5.13 www.c.com
# Vim /usr/local/tomcat/conf/server.xml





# mkdir /web/app2
# vim /web/app2/index.jsp


TomcatB

TomcatB


Session ID




Created on





# service tomcat stop
# service tomcat start
  6、# vim /etc/httpd/conf.d/mod_jk.conf



# Load the mod_jk
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* lbcluster1
JkMount /status/ stat1
# service httpd start可以看到负载均衡


DSC0006.jpg

DSC0007.jpg

DSC0008.jpg





五、Apache基于mod_proxy代理tomcat实现负载均衡

  加载mod_proxy,将之前配置的mod_jk.conf删除


  负载一台服务器


  

# cd /etc/httpd/conf.d/
# vim mod_proxy.conf
ProxyVia on
ProxyRequests Off
proxypreservehost off

order allow,deny
allow from all

proxypass / http://172.16.5.11:8080/
proxypa***everse / http://172.16.5.11:8080/

order allow,deny
allow from all

  

负载均衡
  


# cd /etc/httpd/conf.d/
# vim mod_proxy.conf
ProxyVia on
ProxyRequests Off
proxypreservehost off

BalancerMember http://172.16.5.11:8080/
BalancerMember http://172.16.5.12:8080/
ProxySet lbmethod=byrequests


SetHandler balancer-manager
proxypass !
Order Deny,Allow
Allow from all


order allow,deny
allow from all

proxypass / balancer://hotcluster/
proxypa***everse / balancer://hotcluster/

order allow,deny
allow from all


注意:require all granted和order allow,deny;allow from all的区别
前者是2.4以后的版本,后者是2.2之前的版本
DSC0009.jpg

使用虚拟主机实现反向代理时,可以这样配置完成虚拟主机的状态信息输出
ProxyRequests Off

BalancerMember ajp://172.16.5.11:8009 loadfactor=1
BalancerMember ajp://172.16.5.12:8009 loadfactor=1
ProxySet lbmethod=bytraffic


ServerName localhost
ProxyVia On
ProxyPass / balancer://lbcluster1/ stickysession=JSESSIONID|jsessionid nofailover=On
ProxyPa***everse / balancer://lbcluster1/

SetHandler balancer-manager
Proxypass !
order allow,deny
allow from all


order allow,deny
allow from all


order allow,deny
allow from all


六、tomcat基于session复制的集群
代理服务器配置mod_proxy的代理配置
# vim /etc/httpd/conf.d/mod_proxy.conf

ProxyVia on
ProxyRequests Off
proxypreservehost off

BalancerMember http://172.16.5.11:8080/ loadfator=1
BalancerMember http://172.16.5.12:8080/ loadfator=1 #权重
ProxySet  lbmethod=byrequests


SetHandler balancer-manager
proxypass !
order allow,deny
allow from all


order allow,deny
allow from all

proxypass / balancer://hotcluster/ stickysession=jsessionid
proxypa***everse / balancer://hotcluster/

order allow,deny
allow from all
注意:代理服务可能出现的问题,使用80端口可以代理到后端,使用8080端口却代理不到后端
  ap_proxy_connect_backend disabling worker for (172.16.5.11)
  Permission denied: proxy: HTTP: attempt to connect to 172.16.5.12:8080 (172.16.5.12) failed
错误原因:
代理服务器的安全策略启用了,关闭安全策略
解决方案:
# getenforce
Enforcing
# setenforce 0
# getenforce
Permissive再次访问,发现可以代理到后端服务器。


后端tomcat的配置

节点1:
# vim /usr/local/tomcat/conf/server.xml


















注意其中的组播地址和ip地址,组播地址要尽可能的使用自己定义的,ip地址是节点自己的地址


节点2:






















两个节点的组播地址一定要相同,IP地址都是各自自己的ip




我们在/usr/local/tomcat/webapps/中另外为tomcat创建站点目录

# vim /usr/local/tomcat/webapps/testapp
# cd /usr/local/tomcat/webapps/testapp
# mkdir WEB-INF/{lib,classes} -pv (标准化配置)
# vim index.jsp


TomcatA

TomcatA


Session ID




Created on





# service tomcat stop
# service tomcat start
# cd /usr/local/tomcat/conf/
# cp web.xml ../webapps/testapp/WEB-INF/
# vim ../webapps/testapp/WEB-INF/web.xml
version="3.0">


两个节点配置相似,参照配置即可。需要重点注意的是,如果是三台主机配置,代理服务器有两张网卡,一个公网ip,一个内网网关,内网节点配置的ip需要将网关指向代理服务器的内网地址。如果是自己做实验,没有用到那么多地址,也最起码要保证内网地址有默认网关,否则tomcat服务器起不来的。
实验效果图
DSC00010.jpg

DSC00011.jpg



七、以nginx做代理,实现动静分离,动态的内容代理到tomcat,静态的内容代理到另一台主机,只需要在nginx上添加以下配置即可。

  


location ~ \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js)$ {
proxy_pass http://172.16.5.13;
proxy_set_header X-Real-IP $remote_addr;
}
location ~ \.(jsp|do|css)$ {
proxy_pass http://172.16.5.12;这里要注意对方端口,tomcat默认是8080
}
  八、tomcat原理

  tomcat是一个java程序的web平台,然而它又不是一个完整意义上的java EE(java企业级运行平台),所以,现如今很多企业使用开源组件如structs、spring和hibernate来构建复杂的应用。
  tomcat是一个java程序的web平台,然而,它的运行需要借助一些类库和工具,当然还有另外的环境机制,这些都是由jdk来实现的。可以说tomcat只是一个java应用程序的容器,而站在它背后的jdk才是运行整个程序的核心。
  

  Tomcat Server处理一个http请求的过程
   DSC00012.jpg
  假设来自客户的请求为:
  http://localhost:8080/wsota/wsota_index.jsp
  1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
  2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
  3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host
  4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
  5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
  6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
  7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet
  8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类
  9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或 doPost方法
  10)Context把执行完了之后的HttpServletResponse对象返回给Host
  11)Host把HttpServletResponse对象返回给Engine
  12)Engine把HttpServletResponse对象返回给Connector
  13)Connector把HttpServletResponse对象返回给客户browser
  九、配置文件详解
  请参考
  http://yulp2010.blog.51cto.com/983828/326799




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-638682-1-1.html 上篇帖子: apache+tomcat的架构 下篇帖子: 关于apache虚拟主机htttpd的配置实例 (更新中)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表