Apache反向代理负载均衡和会话保持配置

Apache从1.2版本起,代理模块就已经加入到Apache源代码中,可惜当时的代理模块有很多问题,比如:与较新的http规范不兼容等等,从Apache2.0起mod_proxy模块不但被重新改写,还分割成4部分模块:mod_proxy、mod_proxy_http、mod_proxy_ftp、mod_proxy_connect,并且能够使用http规范较新的特征,这意味着速度更快,而从Apache2.2版本以后更进一步加入mod_proxy_ajp、mod_proxy_balancer这两个模块。而最新的Apache版本httpd2.4.33(2018-03-18更新的)支持如下代理模块:
mod_proxy、mod_proxy_connect、mod_proxy_ftp、mod_proxy_http
mod_proxy_ajp、mod_proxy_balancer
mod_proxy_express、mod_proxy_fcgi、mod_proxy_fdpass、mod_proxy_hcheck、mod_proxy_scgi、mod_proxy_uwsgi、mod_proxy_wstunnel
其他辅助模块功能介绍:
mod_proxy_http:提供代理http请求的功能,它支持http/0.9、http/1.0、http1.1标准协议。
mod_proxy_ftp:提供对ftp功能的支持,但是这种支持仅限于get方式,即只能取回ftp站点上文件,却无法上传文件。

mod_proxy_connect:提供对http connect方法的支持,这种支持主要应用于处理通过代理服务器的ssl连接请求。
mod_proxy_ajp:提供Apache JServ Protocol Version1.3的支持。
mod_proxy_balancer:为Apache提供负载均衡支持,它支持http、ftp、ajp13协议的负载均衡支持。

正向代理:
正向代理服务器如下图所示,它的原理:代理服务器通常是直接或者间接地连接到客户端和目标网络(他们之间可能会有防火墙或者是路由器,但是必须保证代理服务器的数据到客户端或者目标网络,否则无法代理完成)它将转发客户端的请求数据到服务器,服务器响应后发送客户端数据到代理服务器,再由代理服务器转发给客户端。

Apache反向代理负载均衡和会话保持配置

反向代理(逆向代理):
反向代理和正向代理正好相反,反向代理如下图所示,客户端并不需要进行任何特别的设置就可以直接访问目的网络,反向代最常见的方式就是将防火墙后面的服务器提供给外网用户访问,这点有点像网关服务的端口映射功能,将客户端请求转发到相应的主机端口上,只不过反向代理服务器还可以提供更多的功能,例如:负载均衡、缓冲服务、URL策略等。另外这种反向代理服务器还能保护服务器的安全,使内部的数据在传输时能得到控制。
Apache反向代理负载均衡和会话保持配置
mod_proxy模块是Apache实现代理或网关的关键模块,其他模块都是需要它的支持才能运行,如果需要使用一个或者多个代理服务,就需要加载mod_proxy模块.
※Apache的代理模块不提供缓冲支持,如要缓冲支持,还需要加载mod_cache和器相关的模块。 

使用代理服务器需要先加载http.conf的mod_proxy模块,将其#去除(还有其他辅助模块等等)
Apache反向代理负载均衡和会话保持配置

常用需要加载的辅助模块:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so

集群反向代理设置:

在http.conf配置文件中修改或者增加如下内容:
<IfModule proxy_module>     
Include /etc/httpd/extra/proxy-html.conf
</IfModule>
#IfModule是表示如果加载了此模块,才会执行IfModule容器中内部的命令否则不会执行。或者直接Include也可以。

vim /etc/httpd/extra/proxy-html.conf
ProxyVia On
#关闭正向代理
ProxyRequests Off
ProxyPreserveHost Off
<Proxy>
#设置集群组,以balancer://开头,即用于负载均衡集群,集群配置还可以指定下列参数
1、lbmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。
2、 maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。
3、 nofailover:取值为On或Off,设置为On时表示后端服务器故障时,用户的session将损坏;因此,在后端服务器不支持session复制时可将其设置为On。
4、stickysession:调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID(java)PHPSESSIONID(php)
上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,如:
<Proxy balancer://hotcluster>
BalancerMember  http://www1.xiaofeng.com:8080 loadfactor=1
BalancerMember  http://www2.xiaofeng.com:8080 loadfactor=2
ProxySet  lbmethod=bytraffic
</Proxy>
==============================================================
#设置集群组,mycluster名称可以随意取
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy "balancer://mycluster/">
     #配置http方式的请求
     #BalancerMember http://192.168.0.103:8080  
     #BalancerMember http://192.168.0.104:8080
      #配置ajp协议方式请求,后端为tomcat服务,建议使用ajp协议

    #下边route参数是在tomcat节点上配置了jvmRoute,<Engine…jvmRoute="tomcat1">才进行配置,否则不用配置
      BalancerMember ajp://192.168.0.103:8009 route=tomcat1
      BalancerMember ajp://192.168.0.104:8009 route=tomcat2
      ProxySet lbmethod=bybusyness
</Proxy>
#使用集群组,mycluster名称需与上面配置相同
#/ --下边ProxyPass参数的斜杠必须有,否则服务器会返回500错误标识
ProxyPass / "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=Off  
ProxyPassReverse / "balancer://cluster/"
<Location /balancer-manager>
    SetHandler balancer-manager
    #Order Deny,Allow
    #Allow from all
    #Require是httpd2.4版本的语法,该版本向下兼容也支持Order的语法格式
    Require all granted
</Location>
#配置balancer-manager控制台监控
<Location /balancer-manager>
    SetHandler balancer-manager
    Require all granted
    ProxyPass !
</Location>
这样使用代理服务IP和端口可以访问balancer-manager
Apache反向代理负载均衡和会话保持配置

AJP协议介绍:
AJP是Apache提供的完成与其它服务器通讯的一种协议。在Apache中通过mod_proxy_ajp模块发送AJP数据,另外一端的服务器需要实现AJP协议,能够接受mod_proxy_ajp模块发送的AJP协议数据,在接受到AJP协议数据后做适当处理,并能够将处理结果以AJP协议方式发送回给mod_proxy_ajp模块。
当使用单独的服务器,在Tomcat实例前端使用本地的Web服务器时,性能要比单独使用Tomcat及其默认的HTTP连接糟得多,即使web应用程序本身相当一部分是由静态文件构成。如果需要将Tomcat同本地的Web服务器集成,AJP连接优于代理HTTP,将提供更好的性能。从Tomcat角度来看,AJP是最有效的。它同时具有HTTP相同的功能(When using a single server, the performance when using a native webserver in front of the Tomcat instance is most of the time significantly worse than a standalone Tomcat with its default HTTP connector, even if a large part of the web application is made of static files. If integration with the native webserver is needed for any reason, an AJP connector will provide faster performance than proxied HTTP. AJP clustering is the most efficient from the Tomcat perspective. It is otherwise functionally equivalent to HTTP clustering.)
使用这种协议,具有更高的性能,因为它采用的是二进制传输。比HTTP的文本传输要有更高的效率。在Apache中要使用mod_proxy和mod_proxy_ajp,在Tomcat中则要开启ajp服务。

代理指令介绍:
    1、ProxyRequests指令:可以使用ProxyRequests来启用或禁止Apache作为正向代理服务器的功能,off-关闭,默认Apache是开启的。使用Apache反向代理功能必须将其设置为off
      2、<ProxyMatch>和<Proxy>容器:<Proxy>容器的作用是用来存放作用于代理服务器指令,在这个容器中,你可以控制用户的访问权限,而<ProxyMatch>容器则多了正则表达式的支持,可以在这两个容器内使用shell风格的通配符来进行的控制。
        3、ProxyPass指令:ProxyPass指令的作用是将一个远程服务器映射到本地服务器
     4、ProxyVia指令:{On|Off|Full|Block},默认off,即不启用此功能;ProxyVia指令用于控制代理服务器对Via:头的使用,根据http1.1协议。在所有的遵守的http1.1协议的原理的出入连接中都必须有一个Via:头以说明的身份或表示服务器软件的版本,而通过Via:头管理员可以记录代理请求的流向,从而最大程度避免循环。

On表示每个请求和响应报文均添加Via:;
Full表示每个Via:行都会添加当前apache服务器的版本号信息;
Block表示每个代理请求报文中的Via:都会被移除。
    5、ProxyPassReverse指令:用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器。