Apache配置反向代理、负载均衡和集群(mod_proxy方式)
2015-08-17 11:22
716 查看
----本文转自 http://blog.itpub.net/29254281/viewspace-1070221/
Apache配置负载均衡和集群使用mod_jk的方式比较多。
但是mod_jk已经停止更新,并且配置相对复杂。
Apache2.2以后,提供了一种原生的方式配置负载均衡和集群,比mod_jk简单很多。
1.Apache配置反向代理
正向代理一般是指PC连接到代理服务器,由代理服务器转发请求到网站。而反向代理指的是用户将请求发送给反向代理服务器,由反向代理服务器将请求路由转发到具体的服务器。
比如机房有两个Tomcat提供服务,但是由于防火墙的原因,用户不能直接访问。这个时候,可以使用反向代理服务器,将请求转发到Tomcat。而防火墙只需要开启反向代理服务器的端口即可。
下面实验假设内网Tomcat提供谷歌服务,外网通过反向代理,访问这个服务。
修改/etc/httpd/conf/httpd.conf 增加下面的配置
访问链接:http://192.168.1.105/google
2.负载均衡
负载均衡应该是最常用的横向扩展技术。Apache负载均衡将前端的请求,按照配置的比例转发给后台的Tomcat服务器,从而提高了并发访问量。作为mod_proxy方式,配置负载均衡十分简单,就是在反向代理的基础上,将请求发送到balancer。
首先,修改War包程序的web.xml文件,增加标识。
其次,修改每个Tomcat服务器的server.xml,配置jvmRoute
最后,修改apache的httpd.conf文件,增加如下内容
其中ProxyPass /images ! 表示/images开头的请求不会转发给Tomcat,而是作为静态资源在Apache的images目录下寻找资源文件。
而反向代理将所有的/Test请求都转发给名叫mycluster的balancer。
而这个balancer有两个Tomcat成员。
loadfactor表示请求的权值,该值默认为1,可以将该值设置为1到100之间的任何值。
lbmethod表示负载均衡的算法,lbmethod可能的取值有:
lbmethod=byrequests 按照请求次数均衡(默认)
lbmethod=bytraffic 按照流量均衡
lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)
stickySession=JSESSIONID表示开启粘性Session。他的意思是如果第一次请求分到了worker1的Tomcat,那么这个用户的后续请求,都会分配给worker1的这个Tomcat。
使用一个测试页面查看粘性Session
index.jsp
<%@ page language="java" contentType="text/html;
charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD
HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
System.out.println(session.getId());
out.println("
SESSION ID:" + session.getId()+"
");
// 如果有新的请求,则添加session属性
String name = request.getParameter("name");
if (name != null && name.length() > 0) {
String value = request.getParameter("value");
session.setAttribute(name, value);
}
out.print("Session
List:");
Enumeration<String> names = session.getAttributeNames();
while (names.hasMoreElements()) {
String sname = names.nextElement();
String value = session.getAttribute(sname).toString();
out.println( sname + "
= " + value+"
");
System.out.println( sname + "
= " + value);
}
%>
<form action="index.jsp" method="post">
名称:<input type=text size=20 name="name">
<br>
值:<input type=text size=20 name="value">
<br>
<input type=submit value="提交">
</form> </body>
</html>
可以看到,由于粘性Session的作用,对网页的反复操作,都被Apache发送到了同一个Tomcat(worker2)
查看firefox的cookie信息,apache就是根据JSESSIONID后面的routeid实现粘性Session的。
3.集群
我觉得集群和负载均衡的区别就是集群包括Session复制和故障转移。
Session复制是广义的,实际上就是故障转移的时候,还可以继续读取这个用户的Session。
Session复制只是其中的一种方式,也可以采用Session服务器的方式。
例如:
http://blog.itpub.net/29254281/viewspace-1063018/
在负载均衡的基础上配置集群
首先,开启Tomcat的Session复制功能
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="224.0.0.0"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.1.100"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
然后在Apache配置故障转移(nofailover=Off)
配置了集群之后,请求从前端过来,假如分配到了worker1,那么因为粘性Session,他会一直访问worker1.
如果worker1宕机,这个用户的后续请求会自动转移到worker2.
由于Tomcat配置了Session复制,所以Session信息没有丢失。
整个过程对于用户是完全透明的。
参考:
http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/ http://snowolf.iteye.com/blog/743611 http://www.iteye.com/topic/757125
官方文档:
http://apache.jz123.cn/mod/mod_proxy.html
Apache配置负载均衡和集群使用mod_jk的方式比较多。
但是mod_jk已经停止更新,并且配置相对复杂。
Apache2.2以后,提供了一种原生的方式配置负载均衡和集群,比mod_jk简单很多。
1.Apache配置反向代理
正向代理一般是指PC连接到代理服务器,由代理服务器转发请求到网站。而反向代理指的是用户将请求发送给反向代理服务器,由反向代理服务器将请求路由转发到具体的服务器。
比如机房有两个Tomcat提供服务,但是由于防火墙的原因,用户不能直接访问。这个时候,可以使用反向代理服务器,将请求转发到Tomcat。而防火墙只需要开启反向代理服务器的端口即可。
下面实验假设内网Tomcat提供谷歌服务,外网通过反向代理,访问这个服务。
修改/etc/httpd/conf/httpd.conf 增加下面的配置
访问链接:http://192.168.1.105/google
2.负载均衡
负载均衡应该是最常用的横向扩展技术。Apache负载均衡将前端的请求,按照配置的比例转发给后台的Tomcat服务器,从而提高了并发访问量。作为mod_proxy方式,配置负载均衡十分简单,就是在反向代理的基础上,将请求发送到balancer。
首先,修改War包程序的web.xml文件,增加标识。
其次,修改每个Tomcat服务器的server.xml,配置jvmRoute
最后,修改apache的httpd.conf文件,增加如下内容
其中ProxyPass /images ! 表示/images开头的请求不会转发给Tomcat,而是作为静态资源在Apache的images目录下寻找资源文件。
而反向代理将所有的/Test请求都转发给名叫mycluster的balancer。
而这个balancer有两个Tomcat成员。
loadfactor表示请求的权值,该值默认为1,可以将该值设置为1到100之间的任何值。
lbmethod表示负载均衡的算法,lbmethod可能的取值有:
lbmethod=byrequests 按照请求次数均衡(默认)
lbmethod=bytraffic 按照流量均衡
lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)
stickySession=JSESSIONID表示开启粘性Session。他的意思是如果第一次请求分到了worker1的Tomcat,那么这个用户的后续请求,都会分配给worker1的这个Tomcat。
使用一个测试页面查看粘性Session
index.jsp
<%@ page language="java" contentType="text/html;
charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD
HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
System.out.println(session.getId());
out.println("
SESSION ID:" + session.getId()+"
");
// 如果有新的请求,则添加session属性
String name = request.getParameter("name");
if (name != null && name.length() > 0) {
String value = request.getParameter("value");
session.setAttribute(name, value);
}
out.print("Session
List:");
Enumeration<String> names = session.getAttributeNames();
while (names.hasMoreElements()) {
String sname = names.nextElement();
String value = session.getAttribute(sname).toString();
out.println( sname + "
= " + value+"
");
System.out.println( sname + "
= " + value);
}
%>
<form action="index.jsp" method="post">
名称:<input type=text size=20 name="name">
<br>
值:<input type=text size=20 name="value">
<br>
<input type=submit value="提交">
</form> </body>
</html>
可以看到,由于粘性Session的作用,对网页的反复操作,都被Apache发送到了同一个Tomcat(worker2)
查看firefox的cookie信息,apache就是根据JSESSIONID后面的routeid实现粘性Session的。
3.集群
我觉得集群和负载均衡的区别就是集群包括Session复制和故障转移。
Session复制是广义的,实际上就是故障转移的时候,还可以继续读取这个用户的Session。
Session复制只是其中的一种方式,也可以采用Session服务器的方式。
例如:
http://blog.itpub.net/29254281/viewspace-1063018/
在负载均衡的基础上配置集群
首先,开启Tomcat的Session复制功能
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="224.0.0.0"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.1.100"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
然后在Apache配置故障转移(nofailover=Off)
配置了集群之后,请求从前端过来,假如分配到了worker1,那么因为粘性Session,他会一直访问worker1.
如果worker1宕机,这个用户的后续请求会自动转移到worker2.
由于Tomcat配置了Session复制,所以Session信息没有丢失。
整个过程对于用户是完全透明的。
参考:
http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/ http://snowolf.iteye.com/blog/743611 http://www.iteye.com/topic/757125
官方文档:
http://apache.jz123.cn/mod/mod_proxy.html
相关文章推荐
- Nginx服务器搭建反向代理全攻略
- Nginx反向代理
- CentOS 7 安装Nginx做反向代理
- nginx反向代理入门
- Squid代理服务器的安装与配置
- nginx-1.8.0反向代理服务器的搭建与配置
- nginx-1.8.0反向代理服务器的搭建与配置
- squid 2.7 通过域名反向代理多个服务器的配置方法
- Apache配置正向代理与反向代理
- linux apache 反向代理
- nginx反向代理tomcat日志获取真实IP
- 反向代理服务器的工作原理 (转)
- 正向代理和反向代理
- CentOS 6.5下Squid代理服务器的安装与配置
- squid 重定向器
- Apache配置正向代理与反向代理
- Nginx反向代理的配置
- Nginx多Server反向代理配置
- 【二十】关于利用squidclient分析日志未命中情况寻求优化
- 使用Nginx反向代理实现负载均衡