声明
该文章由大牛 马哥 的相关linux视频资料整理而来。若认为内容侵权请及时通知本人。
相关文章
[TOC]
前言
为什么使用反向代理?
- 资源类型动/静分离
- 减少后端tomcat压力
- ……
有哪些实现方式?
能实现反向代理的httpd模块,有以下两种:
- mod_proxy
- mod_proxy只有在apache 2.2.x系列的版本才直接提供
- 可以提供更丰富的功能和安全性
- 子模块
- mod_proxy_http
- mod_proxy_ajp
- mod_proxy_balancer
- mod_jk(mod_jdk2)
- 对于apache 1.3.x和2.0.x来说mod_jk才更适用
- 对于mod_jk2,官方已不再提供
** mod_proxy和mod_jk都提供两种连接方式,即http协议和AJP(二进制格式传输)协议 **
所以,更进一步有以下方式来使用apache/httpd实现反向代理:
- mod_proxy+HTTP
- mod_proxy+AJP
- mod_jk+HTTP
- mod_jk+AJP
配置示例
前提
需要apache已经装载mod_proxy、mod_proxy_http、mod_proxy_ajp和mod_proxy_balancer等模块
可通过 service httpd -D DUMP_MODULES | grep proxy
来查看:
[root@c2 test-1]# service httpd -D DUMP_MODULES | 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_ajp_module (shared)
proxy_balancer_module (shared)
proxy_express_module (shared)
参数说明
- ProxyPreserveHost : On | Off
- 如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用
ProxyPass
指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能
- 如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用
- 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将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。
mod_proxy
mod_proxy + HTTP + tomcat(standalone)
<VirtualHost *:80>
ProxyVia Off
ProxyRequests Off
ProxyPreserveHost Off
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://c2:8080/
ProxyPassReverse / http://c2:8080/
<Location / >
Require all granted
</Location>
</VirtualHost>
mod_proxy + AJP + tomcat(standalone)
<VirtualHost *:80>
ProxyVia On
ProxyRequests Off
ProxyPreserveHost Off
<Proxy *>
Require all granted
</Proxy>
ProxyPass / ajp://c2:8009/
ProxyPassReverse / ajp://c2:8009/
<Location / >
Require all granted
</Location>
</VirtualHost>
mod_jk
mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。
环境准备
编译安装mod_jk connector
# 下载
wget http://apache.fayea.com/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.41-src.tar.gz
# 解压
tar -zxvf tomcat-connectors-1.2.41-src.tar.gz
cd tomcat-connectors-1.2.41-src/native/
# 编译安装
./configure --with-apxs=/usr/local/apache244/bin/apxs
make && make install
mod_jk + AJP + tomcat(standalone)
apache/httpd配置
# 加载模块
LoadModule jk_module modules/mod_jk.so
# 篇日志文件路径
JkWorkersFile /etc/httpd/extra/workers.properties
# 日志文件路径
JkLogFile logs/mod_jk.log
# 日志级别
JkLogLevel debug
# tomcatA和tomcat配置文件server.xml中Engine标签的jvmRoute属性一致
JkMount /* tomcatA
JkMount /status/ stat1
/etc/httpd/extra/workers.properties
worker.list=tomcatA,stat1
worker.tomcatA.port=8009
worker.tomcatA.host=c2
worker.tomcatA.type=ajp13
worker.tomcatA.lbfactor=1
worker.stat1.type = status
tomcat server.xml
<Engine name="Catalina" defaultHost="c2" jvmRoute="tomcatA">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="c2" appBase="/web" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="webapps/test-1" reLoadable="true"/>
</Host>
</Engine>
属性说明
- woker.<work name>.type
- ajp13:此类型表示当前worker为一个运行着的Tomcat实例。
- lb:lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。
- status:用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。
- host:Tomcat 7的worker实例所在的主机
- port:Tomcat 7实例上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定义此属性