Chinaunix首页 | 论坛 | 博客
  • 博客访问: 630864
  • 博文数量: 244
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-27 09:53
个人简介

记录学习,记录成长

文章分类

全部博文(244)

我的朋友

分类: LINUX

2016-05-10 18:35:59

一.简单说明
1.tomcat运行方式:
        tomcat自己作为web服务器来运行;

        在tomcat前端配置一个web(如Apache)服务器;
虽然tomcat可以作为web服务器,但其处理静态页面的能力比较低,如果再配置一个web服务器,静态页面由该web服务器处理,动态页面交由tomcat处理,这样效果比较好,因此,要实现将Apache和tomcat结合起来;


2.tomcat和apache整合的方式
Apache与tomcat连接器通信的模块有两个:mod_proxy和mod_jk;

tomcat的连接器协议有两种:HTTP和AJP;
一般来说整合方式有如下几种:
        mod_jk模块基于AJP协议;

        mod_proxy模块基于HTTP/HTTPS协议或AJP协议;

通常来说Apache都是以mod_jk的方式连接tomcat的,但是Apache2.2版本及以后已经整合了mod_proxy,且mod_jk需要安装配置,因此可以直接使用mod_proxy方式;

3.应用场景
LNMT:Nginx+mysql+tomcat(HTTP/HTTPS协议)
定义一个location来处理静态页面,一个location将jsp页面请求代理到tomcat后端处理,这实现了动静分离,或者定义一个名为tomcat的含有多个tomcat服务器的upstream来处理jsp请求,这可以实现tomcat组的负载均衡;

LAMT:Apache(mod_proxy/mod_jk)+mysql+tomcat(HTTP/HTTPS/AJP协议)
主要是Apache的mod_proxy模块基于HTTP协议实现该环境;

三.apache与tomcat整合配置
配置环境:
前端:192.168.85.128+Apache
后端:192.168.85.129+tomcat


1.编译安装Apache
1.1首先安装apr和apr-util
解压apr-1.5.2.tar.gz并进入目录后执行
./configure
make
make install
apr 默认安装在/usr/local/apr

安装apr-util
解压apr-util-1.5.4.tar.gz并进入目录后执行
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make
make install

2.安装Apache(2.4版本的)
./configure --prefix=/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
make
make install

3.配置apache通过mod_proxy模块与tomcat连接
要使用mod_proxy与tomcat实例连接,需要apache装载mod_proxy、mod_proxy_http、mod_proxy_ajpproxy_balancer_module(实现Tomcat集群时用到)等模块;

3.1查看是否启动了相关模块
[root@localhost httpd]# bin/httpd -M | grep proxy
proxy_module (shared)
proxy_connect_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_fcgi_module (shared)
proxy_scgi_module (shared)
proxy_wstunnel_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_express_module (shared)


3.2尝试启动httpd
出现了问题:
/etc/httpd/bin/httpd -k start这样没显示什么错误,但是80端口却未打开,然后/etc/httpd/bin/httpd -k stop想关了的,但是显示httpd (no pid file) not running错误,查看错误日志会显示:
[Mon May 09 20:05:06.645909 2016] [proxy_balancer:emerg] [pid 8795:tid 3077510848] AH01177: Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded??
解决办法就是编辑配置文件,找到并加载mod_slotmem_shm模块即可;

3.3具体配置
在httpd.conf的全局配置段添加或/conf/extra/httpd-vhosts.conf中编辑虚拟主机内容或/conf/extra下创建xxx.conf文件添加如下内容(添加后在httpd.conf中添加Include conf/extra/xxx.conf):
ProxyVia Off
ProxyRequests Off
ProxyPreserveHost Off
ProxyPass  /  ajp://192.168.85.129/
ProxyPassReverse  /  ajp://192.168.85.129/

或让apache跟Tomcat的http连接器进行整合:
ProxyVia Off
ProxyRequests Off
ProxyPass /
ProxyPassReverse /

3.4关于如上apache指令的说明(下面也有帮助文档)
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也必须以“/”结尾,反之亦然。


ProxyPassReverse:用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器。


另外,mod_proxy模块在httpd2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保存至连接池中以备进一步使用。连接池大小或其它设定可以通过在ProxyPass中使用key=value的方式定义。
常用的key如下所示:
        min:连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小。

        max:连接池的最大容量,每个MPM都有自己独立的容量;都值与MPM本身有关,如Prefork的总是为1,而其它的则取决于ThreadsPerChild指令的值。

        loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。

        retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。


4.配置apache通过mod_jk模块与tomcat连接
下载地址:

4.1先编译安装:
[root@localhost ~]# tar xf tomcat-connectors-1.2.41-src.tar.gz 

如果你的Apache是编译安装的,那么apxs默认已安装位置在Apache的bin下,如果是yum安装的Apache,那么还需要安装httpd-devel才有apxs才能继续编译。这里的Apache是编译安装的,apxs位置在/etc/httpd/bin/apxs
[root@localhost native]# pwd
/root/tomcat-connectors-1.2.41-src/native

[root@localhost native]# ./configure --with-apxs=/etc/httpd/bin/apxs

[root@localhost native]# make && make install

完成后会自动向Apache添加jk模块:
[root@localhost modules]# pwd
/etc/httpd/modules
[root@localhost modules]# ls | grep jk
mod_jk.so

4.2具体配置
配置之前先将上面创建的conf/extra/xxx.conf文件重命名且主配置文件去掉对应的Include项,避免造成影响;

创建一个jk_mod.conf文件来写入jk配置:
[root@localhost extra]# pwd
/etc/httpd/conf/extra
[root@localhost extra]# vim jk_mod.conf
LoadModule  jk_module  modules/mod_jk.so
JkWorkersFile  /etc/httpd/conf/extra/workers.properties
JkLogFile  /var/log/httpd/mod_jk.log
JkLogLevel  debug
JkMount  /*  tomcatA
JkMount  /status/  stat1

4.3创建对应的workers.properties文件
[root@localhost extra]# pwd
/etc/httpd/conf/extra
[root@localhost extra]# vim workers.properties
worker.list=tomcatA,stat1
worker.tomcatA.type=ajp13
worker.tomcatA.port=80
worker.tomcat.host=192.168.85.129
worker.tomcatA.lbfactor=1
worker.stat1.type=status

然后编辑主配置文件,添加一行:
Include conf/extra/jk_mod.conf
注意:不要添加Include conf/extra/workers.properties行,因为httpd.conf会加载jk_module.conf文件,而该文件又会加载workers.properties,这才是正确的,不是要httpd.conf加载workers.properties,因为httpd.conf不会识别其中的参数选项,会一直报错;

4.4两个文件中参数的说明
jk_module.conf文件:
        LoadModule指令在apache中装载mod_jk模块;

        JkWorkersFile用于指定保存了某worker相关工作属性定义的配置文件(可以为任意位置);

        JkLogFile用于指定mod_jk模块的日志文件;

        JkLogLevel用于指定日志的级别(info,error,debug);

        JkRequestLogFormat自定义日志信息格式,如[%a %b %d %H:%M:%S %Y];

        JkMount(JkMount    )指定用于控制URL与Tomcat workers的对应关系;


对于apache代理来说,每一个后端的Tomcat实例中的engine都可以视作一个worker,而每一个worker的地址、连接器的端口等信息都需要在apache端指定以便apache可以识别并使用这些worker。

约定俗成,配置这些信息的文件通常为workers.properties,其具体路径则是使用前面的JkWorkersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。

workers.properties文件:
workers.properties文件一般由两类指令组成:一是mod_jk可以连接的各worker名称列表,二是每一个worker的属性配置信息。简单来说就是定义可用的worker(或worker列表),然后分别定义每个worker的配置信息;

它们分别遵循如下使用语法。
        worker.list = worker name [,worker name...]

        worker.worker name.property = property_value

其中worker.list指令可以重复指定多次,而worker name则是Tomcat中engine组件jvmRoute参数的值如:worker.tomcatA.host=192.168.85.129


根据其工作机制的不同,worker有多种不同的类型,需要为每个worker定义一项属性woker..type常见的类型如下:
        ajp13:表示当前worker为一个运行着的基于AJP的Tomcat实例;

        lb:lb即loadbalancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker;

        status:显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。

worker其它常见的属性说明:
        host:Tomcat7的worker实例所在的主机;

        port:Tomcat7实例上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定义此属性;


4.5重启httpd服务后测试
由于设置了JkMount  /*  tomcatA即将所有到Apache的请求代理到tomcatA处理,所以显示的是默认tomcat页面(和前面的一样);
因为还定义了一个status,所以输入时显示


四.配置tomcat的负载均衡
配置环境:
前端:192.168.85.128+Apache
后端1:192.168.85.129+tomcat
后端2:192.168.85.130+tomcat

安装配置参考:http://blog.chinaunix.net/uid-30212356-id-5714202.html
为了方便测试,尽量为两台tomcat主机分别提供一个简单易辨的主页;

1.基于mod_jk的负载均衡
1.1修改Apache的jk_module.conf文件为
[root@localhost extra]# cat jk_mod.conf 
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf/extra/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* tomcatcluster
JkMount /status/ stat1

1.2修改workers.properties文件为
[root@localhost extra]# cat workers.properties 
worker.list=tomcatcluster,stat1
worker.tomcatA.port=8009
worker.tomcatA.host=192.168.85.129
worker.tomcatA.type=ajp13
worker.tomcatA.lbfactor=1

worker.tomcatB.type=ajp13
worker.tomcatB.host=192.168.85.130
worker.tomcatB.port=8009
work.tomcatB.lbfactor=1

worker.tomcatcluster.type=lb
worker.tomcatcluster.sticky_session=0
worker.tomcatcluster.balance_workers=tomcatA,tomcatB

worker.stat1.type=status


在负载均衡模式中,专用的属性有:
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;

1.3检查语法并重启Apache后测试
  1. [root@localhost bin]# curl http://192.168.85.128
  2. <html>
  3.   <head>
  4.     <title>TomcatB</title>
  5.   </head>
  6.   <body>
  7.     This is 192.168.85.130!!!
  8.   </body>
  9. </html>
  10. [root@localhost bin]# curl http://192.168.85.128
  11. <html>
  12.   <head>
  13.     <title>TomcatA</title>
  14.   </head>
  15.   <body>
  16.     This is 192.168.85.129!!!
  17.   </body>
  18. </html>
这样就实现了负载均衡!

1.4将workers.properties文件中的worker.tomcatcluster.sticky_session设置为1且将两个tomcat的server.xml文件中Engine项设置为
  1. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA">

  1. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB">
检查语法并重新启动Apache后测试:
  1. [root@localhost bin]# curl http://192.168.85.128
  2. <html>
  3.   <head>
  4.     <title>TomcatB</title>
  5.   </head>
  6.   <body>
  7.     This is 192.168.85.130!!!
  8.   </body>
  9. </html>
  10. [root@localhost bin]# curl http://192.168.85.128
  11. <html>
  12.   <head>
  13.     <title>TomcatB</title>
  14.   </head>
  15.   <body>
  16.     This is 192.168.85.130!!!
  17.   </body>
  18. </html>
这样就实现了会话保持!

2.基于mod_proxy的负载均衡

2.1准备工作
停止Apache服务然后停用jk_module.conf文件启用proxy_mod.conf文件
[root@localhost extra]# mv jk_mod.conf jk_mod.conf.bak
[root@localhost extra]# mv proxy_mod.conf.bak proxy_mod.conf
编辑httpd.conf文件,注释Include conf/extra/jk_mod.conf行,启用Include conf/extra/proxy_mod.conf行

2.2编辑proxy_mod.conf文件为
  1. [root@localhost extra]# cat proxy_mod.conf
  2. ProxyVia on
  3. ProxyRequests off
  4. ProxyPreserveHost on
  5. <Proxy balancer://cluster>
  6.   BalancerMember http://192.168.85.129 loadfactor=1 route=tomcatA
  7.   BalancerMember http://192.168.85.130 loadfactor=1 route=tomcatB
  8. </Proxy>
  9. ProxyPass / balancer://cluster/
  10. ProxyPassReverse / balancer://cluster/
其中:
Proxy指定是以balancer://开头,即用于负载均衡集群时,其可以接受的参数如下所示:
lbmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。

maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。
nofailover:取值为On或Off,设置为On时表示后端服务器故障时,用户的session将损坏;因此,在后端服务器不支持session复制时可将其设置为On。

stickysession:调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。

上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,如:
  1. <Proxy balancer://cluster>
  2. BalancerMember http://192.168.85.129 loadfactor=1
  3. BalancerMember http://192.168.85.130 loadfactor=2
  4. ProxySet lbmethod=bytraffic
  5. </Proxy>
2.3检查语法并重启Apache后测试
  1. [root@localhost bin]# curl http://192.168.85.128
  2. <html>
  3.   <head>
  4.     <title>TomcatA</title>
  5.   </head>
  6.   <body>
  7.     This is 192.168.85.129!!!

  8.   </body>
  9. </html>
  10. [root@localhost bin]# curl http://192.168.85.128
  11. <html>
  12.   <head>
  13.     <title>TomcatB</title>
  14.   </head>
  15.   <body>
  16.     This is 192.168.85.130!!!

  17.   </body>
  18. </html>
这样就实现了负载均衡!


2.4将proxy_module.conf文件中的ProxyPass项改为ProxyPass / balancer://cluster/ stickysession=JSESSIONID,然后检查语法并重启服务后测试:
  1. [root@localhost bin]# curl http://192.168.85.128
  2. <html>
  3.   <head>
  4.     <title>TomcatB</title>
  5.   </head>
  6.   <body>
  7.     This is 192.168.85.130!!!

  8.   </body>
  9. </html>
  10. [root@localhost bin]# curl http://192.168.85.128
  11. <html>
  12.   <head>
  13.     <title>TomcatB</title>
  14.   </head>
  15.   <body>
  16.     This is 192.168.85.130!!!

  17.   </body>
  18. </html>
这样就实现了会话保持!

2.5基于mod_jk实现负载均衡时提供了status状态检查页面,而mod_proxy也可以实现
编辑proxy_module.conf文件:
  1. [root@localhost extra]# vim proxy_mod.conf
  2. ProxyVia on
  3. ProxyRequests off
  4. ProxyPreserveHost on
  5. <Proxy balancer://cluster>
  6.   BalancerMember http://192.168.85.129 loadfactor=1 route=tomcatA
  7.   BalancerMember http://192.168.85.130 loadfactor=1 route=tomcatB
  8. </Proxy>
  9. <Location /status>            #定义一个状态检查页面的location
  10.  SetHandler balancer-manager    #使用balancer-manager的handler
  11. </Location>
  12. ProxyPass /status !            #不允许该页面向后代理
  13. ProxyPass / balancer://cluster/
  14. ProxyPassReverse / balancer://cluster/
当然也可以在location中定义该状态页面的访问权限,这里不在演示!

检查语法并重启服务后测试:


而且点击balancer://cluster选项可以对balancer://cluster进行设置;
点击Worker URL各项可以对后端tomcat进行配置;


Apache2.2版本mod_proxy模块详解:


可参考文章:
http://limingnihao.iteye.com/blog/1934548

http://ylw6006.blog.51cto.com/470441/965119
阅读(1538) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~