转载请注明出处:
http://luckymjl2.iteye.com/blog/1932060
1、Linux64位系统下安装apache
安装apache需要先安装apr和apr-util支持
1.1下载apache
地址:http://httpd.apache.org/download.cgi
版本:2.2.25
环境:Unix
1.2安装apr和apr-util
安装apr:
tar -xvfz httpd-2.2.25.tar.gz
# cd httpd-2.2.25
1.编译和安装 apr
cd srclib/apr
./configure --libdir=/usr/lib64 --prefix=/usr/local/apr
make
make install
安装apr-util
cd ../apr-util
./configure --libdir=/usr/lib64 --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make (如果这一步报错,就先执行下面的再执行本步)
make install
# vi Makefile
将
APRUTIL_LIBS = -lsqlite3 /usr/lib/libexpat.la /root/tar/httpd-2.2.25/srclib/apr/libapr-1.la -luuid -lrt -lcrypt -lpthread -ldl
改为
APRUTIL_LIBS = -lsqlite3 /usr/lib64/libexpat.la /root/tar/httpd-2.2.25/srclib/apr/libapr-1.la -luuid -lrt -lcrypt -lpthread -ldl
1.3安装apache2.2.25
./configure LDFLAGS="-L/usr/lib64 -L/lib64"--prefix=/usr/local/httpd-2.2.25 --enable-mods-shared=all --with-mpm=worker --enable-deflate --enable-cache --enable-disk-cache --enable-mem-cache --enable-file-cache --enable-proxy --enable-proxy-ajp --enable-proxy-balancer -enable-proxy-http --enable-rewrite --enable-charset-lite --disable-ipv6 -disable-dav -with-apr=/usr/local/apr -with-apr-util=/usr/local/apr-util
make
make install
2、安装Tomcat
2、1下载Tomcat
地址:http://tomcat.apache.org/download-70.cgi
版本:7.0.42
环境:Unix
2、2解压tomcat
tar -xvfz httpd-2.2.25.tar.gz
3、安装memcache
安装mencached之前需要先安装libevent支持
3、1下载libevent
地址:http://www.monkey.org/~provos/libevent-1.4.9-stable.tar.gz
版本:1.4.9
环境:Unix
3.1.1安装依赖包libevent
tar -xvzf libevent-1.4.9-stable.tar.gz
cd libevent-1.4.9-stable
./configure -prefix=/usr
make & make install
3、2下载memcache
地址:http://code.google.com/p/memcached/downloads/list
版本:1.4.15
环境:Unix
3.2.1安装memcache
tar xvzf memcached-1.4.5.tar.gz
cd memcached-1.4.5
./configure -with-libevent=/usr
make & make install
3.2.2启动memcache
/usr/local/bin/memcached -d -m 64 -u root
memcached命令参数
-p <num> 监听的TCP端口(默认: 11211)
-U <num> 监听的UDP端口(默认: 11211, 0表示不监听)
-s <file> 用于监听的UNIX套接字路径(禁用网络支持)
-a <mask> UNIX套接字访问掩码,八进制数字(默认:0700)
-l <ip_addr> 监听的IP地址。(默认:INADDR_ANY,所有地址)
-d 作为守护进程来运行。
-r 最大核心文件限制。
-u <username> 设定进程所属用户。(只有root用户可以使用这个参数)
-m <num> 单个数据项的最大可用内存,以MB为单位。(默认:64MB)
-M 内存用光时报错。(不会删除数据)
-c <num> 最大并发连接数。(默认:1024)
-k 锁定所有内存页。注意你可以锁定的内存上限。
试图分配更多内存会失败的,所以留意启动守护进程时所用的用户可分配的内存上限。
(不是前面的 -u <username> 参数;在sh下,使用命令"ulimit -S -l NUM_KB"来设置。)
-v 提示信息(在事件循环中打印错误/警告信息。)
-vv 详细信息(还打印客户端命令/响应)
-vvv 超详细信息(还打印内部状态的变化)
-h 打印这个帮助信息并退出。
-i 打印memcached和libevent的许可。
-P <file> 保存进程ID到指定文件,只有在使用 -d 选项的时候才有意义。
-f <factor> 块大小增长因子。(默认:1.25)
-n <bytes> 分配给key+value+flags的最小空间(默认:48)
-L 尝试使用大内存页(如果可用的话)。提高内存页尺寸可以减少"页表缓冲(TLB)"丢失次数,提高运行效率。
为了从操作系统获得大内存页,memcached会把全部数据项分配到一个大区块。
-D <char> 使用 <char> 作为前缀和ID的分隔符。
这个用于按前缀获得状态报告。默认是":"(冒号)。
如果指定了这个参数,则状态收集会自动开启;如果没指定,则需要用命令"stats detail on"来开启。
-t <num> 使用的线程数(默认:4)
-R 每个连接可处理的最大请求数。
-C 禁用CAS。
-b 设置后台日志队列的长度(默认:1024)
-B 绑定协议 - 可能值:ascii,binary,auto(默认)
-I 重写每个数据页尺寸。调整数据项最大尺寸。
==================漂亮的分隔线,到此程序安装完毕================
转载请注明出处:
http://luckymjl2.iteye.com/blog/1932060
4、Tomcat集群部署
Tomcat集群采用session共享方式,将session写入memcached-session-manger统一管理。提高性能。
4.1 jar包下载
4.1.1 memcached-session-manager
memcached-session-manager-${version}.jar
地址:http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/1.6.5/
版本:1.6.5
4.1.2 tomcat7下支持包
memcached-session-manager-tc7-${version}.jar
地址:http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/1.6.5/版本:1.6.5
4.1.3 spymemcached
地址:http://code.google.com/p/spymemcached/downloads/list
版本:2.9.1
4.1.4 Couchbase-Java-Client客户端
地址:http://packages.couchbase.com/clients/java/1.1.9/Couchbase-Java-Client-1.1.9.zip
版本:1.1.9
说明:这个本来是Couchbase的客户端程序,我不知道为什么一定需要,但是报错提示就是缺少客户端jar包,放进去就好了。
以上jar包全部放入$CATALINA_HOME/lib/目录,也就是tomcat的lib目录
4.2 tomcat将session写入memcache
vi /opt/tomcat-7.0.42-jvm1/conf/context.xml
在<Context></Context>中加入
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.10.110:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="none"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory"/>
参数说明:
className (required)
类名:de.javakaffee.web.msm.MemcachedBackupSessionManager
memcachedNodes (required)
memcached节点:此属性应该包含所有运行的memcached节点或者membase bucket的uri地址,每一个memcached节点的属性定义格式为<id>:<host>:<port>,多个节点定义直接使用空格或者逗号分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",如果只有单个的memcached节点,则<id>是可选项,只需配置<host>:<port>即可,形如:memcachedNodes="localhost:11211"。
如果我们配置的是membase,那么从1.6.0版本开始,我们可以配置指定一个或者多个membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/pools。Bucket 名称和密码通过属性username,password来定义。membase buckets连接需要遵循memcached协议,传输数据通过二进制流方式。
failoverNodes (optional, must not be used for non-sticky sessions)
故障转移节点:可选项,对非黏性session不可用,属性必须包含memcached节点集群的所有ids。节点id之间用空格或者逗号分隔。
username (since 1.6.0, optional)
从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证。
password (since 1.6.0, optional)
从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。
memcachedProtocol (since 1.3, optional, default text)
定义memcached协议,默认使用text文本
sticky (since 1.4.0, optional, default true)
定义session方式为黏性或非黏性,默认为true
lockingMode (since 1.4.0, optional, for non-sticky sessions only, default none)
只有非黏性session才使用,默认值为none
none: 从不对session进行锁定
all: session将一直被锁定,知道请求结束
auto: 对于只读请求,session将不会被锁定,如果是非只读请求,则session会被锁定
uriPattern:<regexp>: 通过正则表达式的方式来对请求uri以及查询字符串进行匹配,只有匹配上的才会被锁定。
requestUriIgnorePattern (optional)
sessionBackupAsync (optional, default true)
backupThreadCount (since 1.3, optional, default number-of-cpu-cores)
sessionBackupTimeout (optional, default 100)
operationTimeout (since 1.6.0, optional, default 1000)
sessionAttributeFilter (since 1.5.0, optional)
transcoderFactoryClass(since1.1,optional,
default de.javakaffee.web.msm.JavaSerializationTranscoderFactory)
序列化接口实现:
Java serialization: de.javakaffee.web.msm.JavaSerializationTranscoderFactory
Kryo based serialization: de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory
Javolution based
serialization: de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory
XStream based serialization:
de.javakaffee.web.msm.serializer.xstream.XStreamTranscoderFactory
copyCollectionsForSerialization (since 1.1, optional, default false)
customConverter (since 1.2, optional)
enableStatistics (since 1.2, optional, default true)
enabled (since 1.4.0, optional, default true)
4.3 Tomcat集群配置
vi /opt/tomcat-7.0.42-jvm1/conf/service.xml
声明在集群中的名称jvmRoute:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat107-1">
非粘性session配置,该配置好处在于如果一台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="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
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=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
复制一份tomcat到本地,改名tomcat-7.0.42-jvm2修改service.xml 以下信息
<Server port="8005" shutdown="SHUTDOWN">
改为:
<Server port="8006" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
enableLookups="false"
acceptCount="500" />
改为:
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
enableLookups="false"
acceptCount="500" />
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
改为:
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4001"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat107-1">
改为:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat107-1">
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
改为:
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
4.3.1集群配置测试
Tomcat的webapp下创建test文件夹,文件夹下创建test.jsp,jsp中写入以下信息:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
response.setHeader("Cache-Control","no-store");
response.setHeader("Pragrma","no-cache");
response.setDateHeader("Expires",0);
%>
<html>
<head><title></title></head>
<body>
<%
String s = session.getId();
%>
</br>
<%=s%>
</body>
</html>
打开浏览器输入:
http://192.168.10.107:8080/test/test.jsp
获得一个session格式为B7BDC67CA8EC738771BE20D162CCA9B8-n1.tomcat107-1
改变地址为http://192.168.10.107:8081/test/test.jsp
Session不变,当前两个tonmcat共享相同session,说明配置成功。
5、apache负载均衡配置
vi /usr/local/apache2/conf/httpd.conf
5.1. Apache在启动时自动加载代理(proxy)模块。
去掉以下文本前的注释符(#)
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
5.2 代理负载配置
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
ProxyRequests Off
#lbmethod=bytraffic(byrequests) stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3
ProxyPass / balancer://cluster/ lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3
ProxyPassReverse / balancer://cluster/
<proxy balancer://cluster>
BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=tomcat107-1
BalancerMember ajp://127.0.0.1:8010 loadfactor=1 route=tomcat107-2
</proxy>