标签:apache tomcat mod-proxy 反向代理 tomcat mod-jk
实验环境
RHEL6.6-X86-64
软件
jdk-8u45-linux-x64.rpm
apache-tomcat-8.0.23.tar.gz
http-2.4.10
主机一:IP1: 192.168.1.10 IP2: 192.168.46.130 安装apache
主机二:192.168.46.128 TomcatA
主机三:192.168.46.129 TomcatB
拓扑图:
进入主机192.168.1.128
步骤一:安装JDK
# rpm –ivh jdk-8u45-linux-x64.rpm
配置环境变量
#vim /etc/profile.d/java.sh
exportJAVA_HOME=/usr/java/latest exportPATH=$PATH:$JAVA_HOME/bin
# . /etc/profile.d/java.sh
验证是否安装成功,出现如下内容说明安装成功
# java -version
java version "1.8.0_45" Java(TM) SE Runtime Environment (build1.8.0_45-b14) Java HotSpot(TM) 64-Bit Server VM (build25.45-b02, mixed mode)
步骤二:安装tomcat
# tar xf apache-tomcat-8.0.23.tar.gz -C/usr/local
# cd /usr/local
# ln apache-tomcat-8.0.23 tomcat –sv
配置tomcat环境变量
# vim /etc/profile.d/tomcat.sh
exportCATALINA_HOME=/usr/local/tomcat exportPATH=$PATH:$CATALINA_HOME/bin
# . /etc/profile.d/tomcat.sh
# vim /usr/local/tomcat/conf/server.xml
修改:<Engine name="Catalina" defaultHost="www.mingxiao.info"jvmRoute="TomcatA"> 新增:<Host name="www.mingxiao.info" appBase="/web" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="webapps"reLoadable="true" /> </Host>
# mkdir –pv /web/webapps
# vim /web/webapps/index.jsp
<%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA</font></h1> <table border="1"> <tr> <td>Session ID</td> <% session.setAttribute("abc","abc"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
# catalina.sh start
浏览器输入 192.168.46.128:8080会出现以下内容,说明配置成功
192.168.46.129配置如192.168.46.128,只需修改如下内容:
# vim /usr/local/tomcat/conf/server.xml
修改:<Engine name="Catalina" defaultHost="www.mingxiao.info"jvmRoute="TomcatB"> 新增:<Host name="www.mingxiao.info" appBase="/web" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="webapps"reLoadable="true" /> </Host>
# mkdir –pv /web/webapps
# vim /web/webapps/index.jsp
<%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatB</font></h1> <table border="1"> <tr> <td>Session ID</td> <% session.setAttribute("abc","abc"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
# catalina.sh start
浏览器输入 192.168.46.129:8080会出现以下内容,说明配置成功
进入主机192.168.1.10
安装Apache
首先安装apr
# cd apr-1.5.1 # ./configure --prefix=/usr/local/apr # make # make install
安装apr-util
# cd apr-util-1.5.4 # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr # make # make install
# cd httpd-2.4.10
./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer --enable-lbmethod-heartbeat --enable-heartbeat --enable-slotmem-shm --enable-slotmem-plain --enable-watchdog \
# vim /etc/httpd/httpd.conf
添加 PidFile “/var/run/httpd.pid” 启动 LoadModuleslotmem_shm_module modules/mod_slotmem_shm.so 启动 LoadModulesocache_shmcb_module modules/mod_socache_shmcb.so 新增Include /etc/httpd/extra/httpd-jk.conf
提供服务启动脚本:
#!/bin/bash # # httpd Startup script for the Apache HTTP Server # # chkconfig: - 85 15 # description: Apache is a World Wide Web server. It is used to serve # HTML files and CGI. # processname: httpd # config: /etc/httpd/conf/httpd.conf # config: /etc/sysconfig/httpd # pidfile: /var/run/httpd.pid # Source function library. . /etc/rc.d/init.d/functions if [ -f /etc/sysconfig/httpd ]; then . /etc/sysconfig/httpd fi # Start httpd in the C locale by default. HTTPD_LANG=${HTTPD_LANG-"C"} # This will prevent initlog from swallowing up a pass-phrase prompt if # mod_ssl needs a pass-phrase from the user. INITLOG_ARGS="" # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server # with the thread-based "worker" MPM; BE WARNED that some modules may not # work correctly with a thread-based MPM; notably PHP will refuse to start. # Path to the apachectl script, server binary, and short-form for messages. apachectl=/usr/local/apache/bin/apachectl httpd=${HTTPD-/usr/local/apache/bin/httpd} prog=httpd pidfile=${PIDFILE-/var/run/httpd.pid} lockfile=${LOCKFILE-/var/lock/subsys/httpd} RETVAL=0 start() { echo -n $"Starting $prog: " LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p ${pidfile} -d 10 $httpd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} } reload() { echo -n $"Reloading $prog: " if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then RETVAL=$? echo $"not reloading due to configuration syntax error" failure $"not reloading $httpd due to configuration syntax error" else killproc -p ${pidfile} $httpd -HUP RETVAL=$? fi echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $httpd RETVAL=$? ;; restart) stop start ;; condrestart) if [ -f ${pidfile} ] ; then stop start fi ;; reload) reload ;; graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}" exit 1 esac exit $RETVAL
基于mod-jk的负载均衡以及绑定session会话实现
mod_jk是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。
# cd tomcat-connectors-1.2.40-src
# ./configure --with-apxs=/usr/local/apache/bin/apxs # make # make install
apache要使用mod_jk连接器,需要在启动时加载此连接器模块。
# vim /etc/httpd/extra/httpd-jk.conf
LoadModule jk_module modules/mod_jk.so JKWorkersFile/etc/httpd/extra/workers.properties JKLogFile logs/mod_jk.log JkLogLevel debug JkMount /* lbcluster1 JkMount /status/ stat1
# vim /etc/httpd/extra/workers.properities
worker.list = lbcluster1,stat1 worker.TomcatA.type = ajp13 worker.TomcatA.host = 192.168.46.128 worker.TomcatA.port = 8009 worker.TomcatA.lbfactor = 5 worker.TomcatB.type = ajp13 worker.TomcatB.host = 192.168.46.129 worker.TomcatB.port = 8009 worker.TomcatB.lbfactor = 5 worker.lbcluster1.type = lb worker.lbcluster1.sticky_session = 1 #绑定session worker.lbcluster1.balance_workers worker.stat1.type = status 参数说明: 根据其工作机制的不同,worker有多种不同的类型,这是需要为每个worker定义的一项属性woker.<work name>.type。 常见的类型如下: ◇ ajp13:此类型表示当前worker为一个运行着的Tomcat实例。 ◇ lb:load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。 ◇ status:用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例 ◇ host:Tomcat 的worker实例所在的主机; ◇ port:Tomcat 实例上AJP1.3连接器的端口; ◇ connection_pool_minsize:最少要保存在连接池中的连接的个数;默认为pool_size/2; ◇ connection_pool_timeout:连接池中连接的超时时长; ◇ mount:由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代; ◇ retries:错误发生时的重试次数; ◇ socket_timeout:mod_jk等待worker响应的时长,默认为0,即无限等待; ◇ socket_keepalive:是否启用keep alive的功能,1表示启用,0表示禁用; ◇ lbfactor:worker的权重,可以在负载均衡的应用场景中为worker定义此属性; ◇balance_workers:用于负载均衡模式中的各worker的名称列表,需要注意的是,出现在此处的worker名称一定不能在任何worker.list属性列表中定义过,并且worker.list属性中定义的worker名字必须包含负载均衡worker。具体示例请参见后文中的定义。 ◇ method:可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。 ◇sticky_session:在将某请求调度至某worker后,源于此址的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。默认为值为1,即启用此功能。如果后端的各worker之间支持session复制,则可以将此属性值设为0。
# /etc/init.d/httpd restart
查看当前状态信息
基于mod_proxy实现负载均衡
# vim /etc/httpd/httpd.conf
注释 Include /etc/httpd/extra/httpd-jk.conf 新加Include /etc/httpd/extra/httpd-proxy.conf
# vim /etc/httpd/extra/httpd-proxy.conf
ProxyRequests Off #关闭正向代理,如果使用反向代理必须关闭此项 <proxy balancer://lbcluster1> BalancerMember ajp://192.168.46.128:8009 loadfactor=10 route=TomcatA BalancerMember ajp://192.168.46.129:8009 loadfactor=10 route=TomcatB </proxy> <VirtualHost *:80> ServerName www.mingxiao.info ProxyVia On ProxyRequests Off ProxyPass / balancer://lbcluster1/ stickysession=jsessionid ProxyPassReverse / balancer://lbcluster1/ <Location/balancer-manager> SetHandler balancer-manager Proxypass ! Require all granted </Location> <Proxy *> Require all granted </Proxy> <Location / > Require all granted </Location> </VirtualHost> 参数说明: ProxyPreserveHost {On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。 ProxyVia {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。 ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。 ProxyPass [path] !|url [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。 另外,mod_proxy模块在httpd 2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保存至连接池中以备进一步使用。连接池大小或其它设定可以通过在ProxyPass中使用key=value的方式定义。常用的key如下所示: ◇ min:连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小。 ◇ max:连接池的最大容量,每个MPM都有自己独立的容量;都值与MPM本身有关,如Prefork的总是为1,而其它的则取决于ThreadsPerChild指令的值。 ◇ loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。 ◇ retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。 如果Proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示: ◇lbmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。 ◇ maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。 ◇ nofailover:取值为On或Off,设置为On时表示后端服务器故障时,用户的session将损坏;因此,在后端服务器不支持session复制时可将其设置为On。 ◇ stickysession:调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。 ◇ ProxyPassReverse:用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器。 上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,如: <Proxy balancer://hotcluster> BalancerMember http://www1.magedu.com:8080 loadfactor=1 BalancerMember http://www2.magedu.com:8080 loadfactor=2 ProxySet lbmethod=bytraffic </Proxy>
# /etc/init.d/httpd restart
查看当前状态信息
tomcat服务启动脚本:
#!/bin/sh # Tomcat init script for Linux. # # chkconfig: 2345 96 14 # description: The Apache Tomcat servlet/JSP container. JAVA_OPTS=‘-Xms64m -Xmx128m‘ JAVA_HOME=/usr/java/latest CATALINA_HOME=/usr/local/tomcat export JAVA_HOME CATALINA_HOME exec $CATALINA_HOME/bin/catalina.sh $*
本文出自 “在路上” 博客,请务必保留此出处http://mingxiao.blog.51cto.com/8124243/1660574
标签:apache tomcat mod-proxy 反向代理 tomcat mod-jk
原文地址:http://mingxiao.blog.51cto.com/8124243/1660574