Linux学习-通过httpd反向代理Tomcat

Posted 丢爸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习-通过httpd反向代理Tomcat相关的知识,希望对你有一定的参考价值。

Httpd安装—>Httpd安装
Tomcat安装—>Tomcat安装

配置httpd通过mod_proxy模块连接Tomcat

使用mod_proxy与Tomcat连接,需要httpd已经装载mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module(实现Tomcat集群使用)等模块。

#查看proxy模块
[root@lotus httpd-2.4.48]# /usr/local/apache/bin/httpd -D DUMP_MODULES | grep proxy
 proxy_module (shared)
 proxy_connect_module (shared)
 proxy_ftp_module (shared)
 proxy_http_module (shared)
 proxy_ajp_module (shared)
 proxy_balancer_module (shared)
#在/etc/httpd/httpd.conf的全局配置或虚拟主机中添加以下内容通过ajp代理
ProxyVia Off
ProxyRequests Off
ProxyPreserveHost Off
<Proxy *>
  Require all granted
</Proxy>
ProxyPass /  ajp://192.168.0.136:8009
ProxyPassReverse /  ajp://192.168.0.136:8009
<Location />
  Require all granted
</Location>
#在/etc/httpd/httpd.conf的全局配置或虚拟主机中添加以下内容通过http代理
ProxyVia Off
ProxyRequests Off
ProxyPreserveHost Off
<Proxy *>
  Require all granted
</Proxy>
ProxyPass /  http://192.168.0.136:8080
ProxyPassReverse /  http://192.168.0.136:8080
<Location />
  Require all granted
</Location>
#1.ProxyPreserveHost :如果启用此功能,代理会将用户请求报文中的Host行发送至后端服务器,而不再使用ProxyPass指定的服务器地址,如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此项
#2.ProxyVia {On|Off|Full|Block}:用于控制在http首部是否使用via,主要用于在多级代理中控制代理请求的流向,默认为Off,On表示每个请求和响应报文均添加Via,Full表示每个Via行都会添加当前apache服务器的版本号信息,Block表示每个代理请求报文中的Via都会被移除
#3.ProxyRequests {On| Off}:是否开启apache正向代理有,启用此项为了代理http协议必须启用mod_proxy_http模块,同时如果httpd设置了ProxyPass,则此项为Off
#4.ProxyPass [Path] ! | url [key=value key=value ...]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上的某URL路径,使用此指令必须将ProxyReuqests设定为Off,如果path以"/"结尾,则对应的url也必须以"/"结尾,反之亦然,mod_proxy模块#在httpd2.1版本后支持与后端服务器的连接池功能,连接在按需创建可以保存至连接池中进一步使用,连接池大小或其它设定可以通过ProxyPass中的key=value的方式定义,常用的key如下所示:
#min:连接池的最小容量,此值与实际连接的个数无关,仅表示连接池最小要初始化的空间大小
#max:连接池的最大容量,每个MPM都有自己独立的容量,其值与MPM本身有关,如prefork的总是1,其它的取决于ThreadsPerChild指令的值
#loadfactor:用于负载均衡集群配置,定义对应后端服务器的权重,取值范围为1-100
#cetry:当httpd将请求发送至后端服务器得到错误响应时等待多长时间后再重试,单位为秒钟
#如果Proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示:
#lbmethod:httpd实现负载均衡的调试方法,默认为byrequests,即基于权重将统计请求个数运行调度,bytraffic则执行基于权重的流量计数调度,bybusymess通过考量每个后端服务器的当前负载进行调度
#maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数
#nofailover:取值为On或Off,设置为On表示后端服务器故障时,用户的session将损坏,因此,在后端服务器不支持session复制时可将其设定为On
#stickysession:调度器的sticky session 的名字,根据web程序语言的不同,其值JESSIONID或phpSESSIONID
#上述指令除了能在balancer://或ProxyPass中设定之外,也可以使用ProxySet指令直接进行设置,如
<Proxy balancer://hotcluster>
  BalancerMember  http://www1.tye.com:8080 loadfactor=1
  BalancerMember  http://www2.tye.com:8080 loadfactor=2
  ProxySet lbmethod=bytraffic
</Proxy>
#ProxyPassReverse:用于让httpd调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过Proxy服务器

基于httpd的mod_proxy实现Tomcat负载均衡

#在/etc/httpd/extra/httpd-proxy.conf的全局配置中配置如下内容--配置通过http代理至后端服务器
ProxyRequests Off
<proxy balancer://lbcluster1>
  BalancerMember http://192.168.0.135:8080 loadfactor=1 route=mysql1
  BalancerMember http://192.168.0.136:8080 loadfactor=1 route=MySQL2
  ProxySet lbmethod=bytraffic
</proxy>
<VirtualHost *:80>
  ServerAdmin admin@tye.com
  ServerName www.tye.com
  ProxyPass / balancer://lbcluster1/ stickysession=jsessionid
  ProxyPassReverse / balancer://lbcluster1/
</VirtualHost>
#在/etc/httpd/extra/httpd-proxy.conf的全局配置中配置如下内容--配置通过ajp代理至后端服务器
#route后面的参数是在Tomcat配置文件(/usr/local/tomcat/conf/server.xml)中jvmRoute的设置-- <Engine name="Catalina" defaultHost="www.tye.com" jvmRoute="MySQL2">
ProxyRequests Off
<proxy balancer://lbcluster1>
  BalancerMember ajp://192.168.0.135:8009 loadfactor=1 route=MySQL1
  BalancerMember ajp://192.168.0.136:8009 loadfactor=1 route=MySQL2
</proxy>
<VirtualHost *:80>
  ServerAdmin admin@tye.com
  ServerName www.tye.com
  ProxyPass / balancer://lbcluster1/ stickysession=jsessionid
  ProxyPassReverse / balancer://lbcluster1/
</VirtualHost>

会话管理

标准会话管理器(standardManager)

<Manager className="org.apache.catalina.session.StandardManager" MaxInactiveInterval="7200" />

默认保存于$CATALINA_HOME/work/Catalina///下的SESSION.SER文件中
maxActiveSessions:最多允许活动会话数量,默认为-1,表示不限制
maxInactiveInterval:非活动的会话超时时长,默认为60s
pathname:会话文件的保存目录

持久会话管理器(PersistentManager)

将会话数据保存至持久存储中,并且能在服务器意外中止后重新加载这些会话信息,持久会话管理器支持会话保存至文件存储(FileStore)或JDBCStore中。
保存文件示例

<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true">
  <Store className="org.apache.catalina.session.FileStore" directory="/data/tomcat.session"/>
</Manager>

每个用户的会话会被保存至directory指定文件名为.session,并通过后台纯程每隔一段时间(checkInterval)参数定义,默认为60s检查一次超时会话
保存至JDBCStore示例

<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true">
  <Store className="org.apache.catalina.session.JDBCStore" 
    driverName="com.mysql.jdbc.Driver"
    connectionURL="jdbc:mysql://localhost:3306/mydb?user=tye;password=123456"/>
</manager>
#基于mod_proxy状态信息输出
#修改/etc/httpd/extra/httpd-proxy.conf配置文件
ProxyRequests Off
<proxy balancer://lbcluster1>
  BalancerMember http://192.168.0.135:8080 loadfactor=1 route=MySQL1
  BalancerMember http://192.168.0.136:8080 loadfactor=1 route=MySQL2
</proxy>
<VirtualHost *:80>
  ServerName www.tye.com
  <Location /balancer-manager>
    SetHandler balancer-manager
    Require all granted
  </Location>
</VirtualHost>
<VirtualHost *:80>
  ServerAdmin admin@tye.com
  ServerName www.tye.com
  ProxyPass / balancer://lbcluster1/ stickysession=jsessionid
  ProxyPassReverse / balancer://lbcluster1/
  <Proxy *>
    Require all granted
  </Proxy>
  <Location />
    Require all granted
  </Location>
</VirtualHost>
#使用虚拟主机实现反向代理,并输出状态信息
ProxyRequests Off
<proxy balancer://lbcluster1>
  BalancerMember http://192.168.0.135:8080 loadfactor=1 route=MySQL1
  BalancerMember http://192.168.0.136:8080 loadfactor=1 route=MySQL2
</proxy>
<VirtualHost *:80>
  ServerAdmin admin@tye.com
  ServerName www.tye.com
  ProxyPass / balancer://lbcluster1/ stickysession=jsessionid
  ProxyPassReverse / balancer://lbcluster1/
  <Proxy *>
    Require all granted
  </Proxy>
  <Location />
    Require all granted
  </Location>
  <Location /balancer-manager>
    SetHandler balancer-manager
    Require all granted
    ProxyPass !
  </Location>
</VirtualHost>

报错1

[proxy_balancer:emerg] [pid 11940:tid 140010805409536] AH01177: Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded??

解决方法

#在/etc/httpd/httpd.conf配置文件中启用以下模块
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so

报错2

[proxy:crit] [pid 1612:tid 139840104052480] AH02432: Cannot find LB Method: byrequests

解决方法

#在/etc/httpd/httpd.conf配置文件中启用以下模块
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so

以上是关于Linux学习-通过httpd反向代理Tomcat的主要内容,如果未能解决你的问题,请参考以下文章

高性能Web服务之Httpd+Tomcat实现负债均衡反向代理实现

linux学习(JDK,Tomcat,nginx反向代理)

如何开启apache虚拟目录反向代理

CDN+DNS主从/视图+squid反向代理+nginx负载均衡+httpd/nginx/tomcat网站搭建+iscsi后端存储

Linux中Nginx反向代理下的tomcat集群

nginx 80端口反向代理多个域名,怎样隐藏端口的