apache的keepalive和keepalivetimeout

在APACHE的httpd.conf中,KeepAlive指的是保持连接活跃,类似于Mysql的永久连接。换一句话说,如果将KeepAlive设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。     

KeepAlive的连接活跃时间当然是受KeepAliveTimeOut限制的。如果第二次请求和第一次请求之间超过KeepAliveTimeOut的时间的话,第一次连接就会中断,再新建第二个连接。   

所以,一般情况下,图片较多的网站应该把KeepAlive设为On。但是KeepAliveTimeOut应该设置为多少秒就是一个值得讨论的问题了。   

如果KeepAliveTimeOut设置的时间过短,例如设置为1秒,那么APACHE就会频繁的建立新连接,当然会耗费不少的资源;反过来,如果KeepAliveTimeOut设置的时间过长,例如设置为300秒,那么APACHE中肯定有很多无用的连接会占用服务器的资源,也不是一件好事。   

所以,到底要把KeepAliveTimeOut设置为多少,要看网站的流量、服务器的配置而定。   

其实,这和MySql的机制有点相似,KeepAlive相当于mysql_connect或mysql_pconnect,KeepAliveTimeOut相当于wait_timeout。   

以下是我的配置: KeepAlive On KeepAliveTimeout 3 考虑到我的网站上有不少的图片,所以将KeepAlive设为On,一般的页面两次请求间隔不会超过3秒,所以这样设置,至尽运行状况良好

转自:http://edu.cnzz.cn/NewsInfo/17275.aspx

apache 的域名重定向

需求:要把访问域名 www.domain1.com 的域名转发到 www.domain2.com 上
实现:
在相关的虚拟主机中增加    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^www.domain1.com$
        RewriteRule ^(.*)$ http://www.domain2.com/$1 [R=301,L]
    </IfModule>
如果是多个域名重定向到一个域名    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^www.domain.com[OR]
        RewriteCond %{HTTP_HOST} ^www.domain1.com$
        RewriteRule ^(.*)$ http://www.domain2.com/$1 [R=301,L]
    </IfModule>

httpd.conf文件如何配置KeepAlive

KeepAlive  意思为是否长连接。 后边可以设置 On 或者 Off
简单理解就是这样: 如果设置成On,那么当apache完成用户的请求后,那么apache进程不会断开用户的请求连接,依然保持连接状态。设置成Off则当apache完成用户的请求后,那么apache进程会立即断开和用户的请求连接。
如果,完成用户的连接依然连接,这样的好处是:当该用户的请求在过来时,apache会用这个已经建立的连接,不需要重新创建连接。这样会节省CPU的资源。但是却耗费了内存。为什么呢?可以假设这样的场景。假如keepalive 超时时间为10s,而每1s中有100个用户请求访问,每个用户3次连接,每个连接耗费2M内存,那么10s内建立的连接次数为1000次(跟用户每s请求次数无关),消耗内存为1000*2=2000M,相反,如果不保持长连接,同样的环境场景下,每1s内有100*3个连接,下一秒还是100*3个连接,也就是说永远都是100*3个连接,那么1s内甚至10s内消耗的内存为100*3*2=600M。 然而,在这10s内创建的连接次数为100*3*10=3000次,这样肯定消耗了更多的cpu资源。毕竟每次tcp连接都是需要cpu去处理的。

问题来了,既然知道长连接与否的利与弊,那么如何判定什么时候On,什么时候Off?
在上面的举例中,涉及到了一个数,那就是每个用户在1s内请求的次数,你再回去好好看看,如果把3改为1,是不是10s内得到的连接次数总和是一样的。对!那么这样无论是On还是Off,消耗的CPU资源是一样的。所以,我们考虑3种情况:
  1。用户浏览一个网页时,除了网页本身外,还引用了多个 javascript 文件,多个 css 文件,多个图片文件,并且这些文件都在同一个 HTTP 服务器上。
  2。用户浏览一个网页时,除了网页本身外,还引用一个 javascript 文件,一个图片文件。
  3。用户浏览的是一个动态网页,由程序即时生成内容,并且不引用其他内容。

对于上面3中情况,我认为:1 最适合打开 KeepAlive ,2 随意,3 最适合关闭 KeepAlive(连接消耗的内存比较大)

总结一下:
  在内存非常充足的服务器上,不管是否关闭 KeepAlive 功能,服务器性能不会有明显变化;
  如果服务器内存较少,或者服务器有非常大量的文件系统访问时,或者主要处理动态网页服务,关闭 KeepAlive 后可以节省很多内存,而节省出来的内存用于文件系统Cache,可以提高文件系统访问的性能,并且系统会更加稳定。
    目前的服务器,CPU很强,所以不用考虑频繁的tcp连接对cpu造成的压力,那还让它长连接干什么,故,建议关闭你的长连接吧!!!

PS: 如果,你的服务器上请求量很大,那你最好还是关闭这个参数吧。我试过一次,打开长连接,并且设置超时时间为30s,结果仅仅十几s就把所有的httpd进程跑满。这样很危险的,直接让用户等待,等30s,这不扯淡嘛?即使是你设置成3s,照样会让用户等待3s,这样很不合理的。所以,归根结蒂还是关闭长连接吧,这样效率会更高。

Apache日志格式详解

下表列出了Apache日志格式字符串的含义

%%  百分号(Apache2.0.44或更高的版本 )
%a  远端IP地址
%A  本机IP地址
%B  除HTTP头以外传送的字节数
%b  以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示’- ‘而不是0。
%{Foobar}C  在请求中传送给服务端的cookieFoobar的内容。
%D  服务器处理本请求所用时间,以微为单位。
%{FOOBAR}e  环境变量FOOBAR的值
%f  文件名
%h  远端主机
%H  请求使用的协议
%{Foobar}i  发送到服务器的请求头Foobar: 的内容。
%l  远端登录名(由identd而来,如果支持的话),除非IdentityCheck 设为”On “,否则将得到一个”-”。
%m  请求的方法
%{Foobar}n  来自另一个模块的注解Foobar 的内容。
%{Foobar}o  应答头Foobar: 的内容。
%p  服务器服务于该请求的标准端口。
%P  为本请求提供服务的子进程的PID。
%{format}P  服务于该请求的PID或TID(线程ID),format 的取值范围为:pid 和tid (2.0.46及以后版本 )以及hextid (需要APR1.2.0及以上版本)
%q  查询字符串(若存在则由一个”? “引导,否则返回空串)
%r  请求的第一行
%s  状态。对于内部重定向的请求,这个状态指的是原始 请求的状态,—%>s 则指的是最后请求的状态。
%t  时间,用普通日志时间格式(标准英语格式)
%{format}t  时间,用strftime(3) 指定的格式表示的时间。(默认情况下按本地化格式)
%T  处理完请求所花时间,以秒为单位。
%u  远程用户名(根据验证信息而来;如果返回status(%s )为401,可能是假的)
%U  请求的URL路径,不包含查询字符串。
%v  对该请求提供服务的标准ServerName 。
%V  根据UseCanonicalName 指令设定的服务器名称。
%X  请求完成时的连接状态: X = 连接在应答完成前中断。
+ = 应答传送完后继续保持连接。
- = 应答传送完后关闭连接。

(在1.3以后的版本中,这个指令是%c ,但这样就和过去的SSL语法:%{var}c 冲突了)
%I  接收的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio 模块。
%O  发送的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio 模块。

Jboss + Apache 集群安装文档

Jboss4.2.3集群安装文档
以下是我实际的操作,并成功实现,现在我说下我的系统环境。两台服务器,10.10.13.186和10.10.13.187,分别安装jboss,在186上面配置apache服务器,作为集群。部署名称为crm的war包。

一、        基础环境搭建
RHEL4.8,jboss4.2.3,jdk1.6,Apache2.2.4
1.安装jdk,两台服务器都要做。
1)        建立jboss组和jboss用户。
groupadd jboss
useradd jboss –g jboss –G jboss
在给jboss用户设置个密码
将jboss和apache建立在/usr/local/jboss和/usr/local/java,用root用户赋予jboss用户操作jboss文件夹和java文件夹权限。
chown -R jboss:jboss java
chown -R jboss:jboss jboss
2)        下载jdk-6u21-linux-i586.bin,上传到linux系统,/usr/local/java的文件夹。Jdk下载地址:
https://cds.sun.com/is-bin/INTER ... R@CDS-CDS_Developer
进入后,需要选择你操作系统的平台,选择linux就可以了。然后有两种包,一个bin包一个rpm.bin包。我选择的是jdk-6u21-linux-i586.bin。
3)        添加执行权限:chmod 755 jdk-6u21-linux-i586.bin
4)        执行该文件:./jdk-6u21-linux-i586.bin,会出现jdk的文件夹,改名为jdk1.6,方便记忆。
mv jdk1.6.0_21 jdk1.6
5)        更改系统环境变量:用root用户,vi /etc/profile,在后面添加:
#Set Environment of java & jboss
JAVA_HOME=/usr/local/java/jdk1.6
JRE_HOME=/usr/local/java/jdk1.6/jre
PATH=$PATH:$JAVA_HOME/bin:JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:
修改后通过source /etc/profile使它生效。
6)        替换系统jdk:RHEL好多都自带jdk,但是版本比较老,要使用新下载的jdk,需要重新连接。
cd /usr/bin
ln -s -f /usr/local/java/jdk1.6/jre/bin/java
ln -s -f /usr/local/java/jdk1.6/bin/javac
7)        检查jdk版本:java –version。出现下面显示,表示安装成功。
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)
Java HotSpot(TM) Server VM (build 17.0-b16, mixed mode)
8)        Jdk安装很简单,下面是重头戏jboss的配置。
2.安装、配置jboss,两台服务器都要做。
1)        下载jboss-4.2.3.GA.zip,上传linux操作系统,/usr/local/jboss的文件夹。
Jboss下载地址:
http://www.jboss.org/jbossas/downloads/
我之所以选择版本4,是因为这个版本的技术文档相对比较多,而4.2.3是版本4中最稳定的。
2)        解压缩:unzip jboss-4.2.3.GA.zip,出现jboss-4.2.3.GA文件夹,并改名jboss4.2.3。
3)        更改系统环境变量:vi /etc/profile,在之前添加路径中加入下面一行:(可以加在JRE_HOME的 下面)
JBOSS_HOME=/usr/local/jboss/jboss4.2.3
PATH=$PATH:$JAVA_HOME/bin:JRE_HOME/bin:JBOSS_HOME/bin
修改后通过source /etc/profile使它生效。
4)        编辑vi $JBOSS_HOME/server/default/deploy/jboss-web.deployer/server.xml,将文件里面所有的(一共2处)${jboss.bind.address}修改为0.0.0.0。具体如下:
<Connector port="8080" address="${jboss.bind.address}" 修改为
<Connector port="8080" address="0.0.0.0" >
<Connector port="8009" address="${jboss.bind.address}" protocol="AJP/1.3"
修改为
<Connector port="8009" address="0.0.0.0" protocol="AJP/1.3">
这样做的目的是可以远程访问jboss的,否则用其他ip地址在ie中是看不到jboss的欢迎界面的。
5)        更改端口:我希望我访问项目的时候用ie默认的端口,所以需要修改端口:在同样的文件下vi $JBOSS_HOME/server/default/deploy/jboss-web.deployer/server.xml,找到jboss默认的8080端口,修改成80。(这里要根据自己的实际需要。)
<Connector port="8080" address="0.0.0.0" >修改为
<Connector port="80" address="0.0.0.0" >
6)        运行jboss并运行:
cd JBOSS/bin
./run.sh
这里有个问题,就是非root只能打开1024以上的端口,所以jboss用户启动是不能访问的,这里我是采用的,root开启jboss,而其他的配置用jboss用户完成。
注:有个有趣的地方,就是我关掉远程终端的时候,jboss服务也会随着我的终端一起关掉。解决这个的办法就是在/bin的文件夹中通过:nohup ./run.sh来运行jboss。
通过ie登录:http://10.10.13.186。(因为是默认80端口,所以不用输入端口号),这时可以看到jboss的欢迎界面。安装成功,下面就是对它配置一番。
7)        部署程序:将war包上传至$JBOSS/server/default/deploy的文件夹下面,解压缩,unzip crm.war,在deploy文件下生成部署的文件夹。登录ie输入http://10.10.13.186/crm。就可以成功访问到你的war包了。jboss的deploy目录是热部署的,所以不用重启jboss就可以看到这个包里面的内容。
8)        去掉war包名称后缀:去掉访问地址后面的war包名称,只是通过地址就访问war包,即访问http://10.10.13.186达到效果。需要修改两个地方。首先进入部署war包下的/WEB-INF的文件夹下。
cd $JBOSS/server/derfault/deploy/crm.war/WEB-INF
文件夹,新建jboss-web.xml文件:vi jboss-web.xml,在里面写入:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 4.2//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">
<jboss-web>
<context-root>/</context-root>
</jboss-web>
保存退出。
这个时候,在输入http://10.10.13.186 看到的就不是jboss的欢迎界面,而是war包的界面了。
注:有的war包数据库连接是写在里面了,有的则需要通过jboss配置连接数据库,才可以部署的。我的配置实例是不需要jboss配置数据库连接的,有需要的可以上百度搜索,或者找我要都行。
9)        建立日志文件。在jboss下建立日志文件夹logs。进入到crm.war的包中
vi $JBOSS_HOME/server/defauclt/depoly/crm.war/WEB-INF/classes/log4j.properties
修改LOG_DIR=/usr/local/jboss/jboss4.2.3/logs,更改日志路径。根据自己的war包情况来修改。
10)        基本的配置已经完成,下面就是我做的一些小优化。设置内存:
在这里需要根据操作系统来选择文件配置,我的系统是linux操作系统。修改bin文件夹下面的run.conf文件中的:if [ "x$JAVA_OPTS" = "x" ]; then下面添加配置,替换到原有的。
JAVA_OPTS="-Xms128m –Xmx3100m -XX:MaxNewSize=256m -XX:MaxPermSize=512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"
如果是windows操作系统,修改run.bat文件
set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m -Xss 128k -XX:PermSize=256m -XX:MaxPermSize=256m
再根据服务器的实际情况,修改参数配置。
这个内存大小和操作系统有关系,64位的操作系统和32位的操作系统相比,jboss的内存可以设置大些,64位的设置物理内存的一半。
11)        安全性设置:添加jmx-console和web-console的登录用户名和密码。在这里我直接进入的部署包,跳过了jboss的配置界面,但是为了安全还是要设置用户名和密码。因为改得东西太长,所以我单独写了出来,见我下篇文章jboss安全性配置,或者上网查询。
12)        开机自动启动jboss:
将以下代码保存名为jboss的文件放到/etc/init.d目录下,别忘了加执行权限。
#!/bin/sh
#
# JBoss Control Script
#
# chkconfig: 3 80 20
# description: JBoss EJB Container
#
# To use this script
# run it as root - it will switch to the specified user
# It loses all console output - use the log.
#
# Here is a little (and extremely primitive)
# startup/shutdown script for RedHat systems. It assumes
# that JBoss lives in /usr/local/jboss, it's run by user
# 'jboss' and JDK binaries are in /usr/local/jdk/bin. All
# this can be changed in the script itself.
# Bojan
#
# Either amend this script for your requirements
# or just ensure that the following variables are set correctly
# before calling the script
# [ #420297 ] JBoss startup/shutdown for RedHat
#define where jboss is - this is the directory containing directories log, bin, conf etc
JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss/jboss4.2.3"}
#make java is on your path
JAVAPTH=${JAVAPTH:-"/usr/local/java/jdk1.6/bin"}
#define the classpath for the shutdown class
JBOSSCP=${JBOSSCP:-"$JBOSS_HOME/bin/shutdown.sh -S"}
#define the script to use to start jboss
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c default"}
if [ -n "$JBOSS_CONSOLE" -a ! -d "$JBOSS_CONSOLE" ]; then
  # ensure the file exists
  touch $JBOSS_CONSOLE
fi
if [ -n "$JBOSS_CONSOLE" -a ! -f "$JBOSS_CONSOLE" ]; then
  echo "WARNING: location for saving console log invalid: $JBOSS_CONSOLE"
  echo "WARNING: ignoring it and using /dev/null"
  JBOSS_CONSOLE="/dev/null"
fi
#define what will be done with the console log
JBOSS_CONSOLE=${JBOSS_CONSOLE:-"/dev/null"}
#define the user under which jboss will run, or use RUNASIS to run as the current user
JBOSSUS=${JBOSSUS:-"root"}
CMD_START="cd $JBOSS_HOME/bin; $JBOSSSH"
CMD_STOP="cd $JBOSS_HOME/bin; $JBOSSCP"
if [ "$JBOSSUS" = "RUNASIS" ]; then
  SUBIT=""
else
  SUBIT="su - $JBOSSUS -c "
fi
if [ -z "`echo $PATH | grep $JAVAPTH`" ]; then
  export PATH=$PATH:$JAVAPTH
fi
if [ ! -d "$JBOSS_HOME" ]; then
  echo JBOSS_HOME does not exist as a valid directory : $JBOSS_HOME
  exit 1
fi
case "$1" in
start)
    echo CMD_START = $CMD_START
    cd $JBOSS_HOME/bin
    if [ -z "$SUBIT" ]; then
        eval $CMD_START >${JBOSS_CONSOLE} 2>&1 &
    else
        $SUBIT "$CMD_START >${JBOSS_CONSOLE} 2>&1 &"
    fi
    ;;
stop)
    echo CMD_STOP = $CMD_STOP
    if [ -z "$SUBIT" ]; then
        eval $CMD_STOP >${JBOSS_CONSOLE} 2>&1 &
    else
        $SUBIT "$CMD_STOP  >${JBOSS_CONSOLE} 2>&1 &"
    fi
    ;;
restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart|help)"
esac
将以上代码保存名为jboss的文件放到/etc/init.d目录下,别忘了加执行权限。
修改jboss文件中的jdk路径和jboss路径
修改启动jboss的用户
chkconfig --add jboss
chkconfig --level 3 jboss on
chkconfig --level 5 jboss on
重新启动计算机即可。
13)        因为jboss和apache安装在一台机子上面,我想用ip地址去区分它们,而不是端口,所以我在10.10.13.186的机子上面配置了一个虚拟网卡,地址是10.10.13.189。作为apache的地址。
cd /etc/sysconfig/network-scripts
vi ifcfg-eth0:0
DEVICE=eth0:0
BOOTPROTO=static
IPADDR=10.10.13.189
NETMASK=255.255.255.0
ONBOOT=yes
HWADDR=78:E7:D1:E6:3F:E6
保存后:
ifup  ifcfg-eth0:0
激活这个网卡
将10.10.13.186绑定在jboss上面。
vi $JBOSS_HOME/server/default/deploy/jboss-web.deployer/server.xml
将之前修改的两处0.0.0.0改为10.10.13.186。
14)        以上就是我配置的jboss,如果还有什么添加或删除,我会及时更新补充的。那么恭喜你,离成功又进了一步。现在jboss已经可以正常使用,但是我们为了提高冗余性,还要结合apache去做集群。
3. 安装apache,只是186配置。
                要先卸载自带的apache,再安装新的apache。
1)        我安装的是apache2.2.4,那么安装前要卸载系统自带的apache2.0。避免冲突,rpm –qa|grep httpd,系统会列出所有的httpd的包,我的是有个四个,下面需要一个一个卸载,rpm –e 包的名称,将他们卸载完毕,在这里不用输入包的版本号,只是输入名称就可以卸载。卸载干净后就可以安装高版本的apache了。
注:有的包之间有连带关系,需要注意卸载的先后顺序。
注:有的包卸载会报依赖关系的通知,输入:rpm -e 包的名称 --nodeps
2)        仿照jboss用户建立,建立apache的组合用户,用root用户建立apache文件夹并分给apache用户权限,但是apache用户不能起”apache”这个名字,这个名字系统有了,换个名字起。
3)        下载Apache224.tar.gz。并上传至系统,放在/home的文件夹下面。
4)        安装:进入安装文件所在目录,解压缩:
tar –zxvf Apache224.tar.gz
完后会看到httpd的文件夹,进入。进行配置:
./configure --prefix=/usr/local/apache --enable-so --enable-vhost-alias --enable-rewrite --enable-deflate --enable-mods-shared=all --with-mpm=worker --enable-proxy --enable-proxy-ajp --enable-proxy-http --enable-proxy-ftp --enable-proxy-connect --enable-proxy-balancer(--enable-lib64-libdir=/usr/lib64 --with-expat=builtin) 括号里面是64位系统时添加的
make clean
make
               make install
因为要我要配置集群轮询操作,所以在配置的时候,在后面加入相应so文件模型是必要的,要不后期还要重新编译,我试过还不如重装快呢。所以后面参数都不能少。
5)        修改apache的端口,它默认是80 ,但是这个端口之前已经被jboss使用了。
vi /usr/local/apache/conf/http
Listen 10.10.13.189:80
进行修改。同时给apache配置10.10.13.189地址。区分jboss服务。
6)        运行:进入/usr/local/apache/bin文件夹下,输入:./httpd –version检查安装版本。然后service httpd start运行。如果出现httpd未识别的服务,把/usr/local/apache2/bin中apachectl文件拷贝到/etc/init.d,命名为httpd,即可。
cp /usr/local/apache/bin/apachectl /etc/init.d/httpd
注:在运行的时候会出现httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName。
这个问题应该是没有在 /etc/httpd/conf/httpd.conf 中设定 ServerName 所以它会用主机上的名称来取代,首先会去找 /etc/hosts 中有没有主机的定义。
所以要解决这个问题可以设定ServerName或者在 /etc/hosts 中填入自己的主机名称 MYHOST,像这样:
vi /etc/hosts
127.0.0.1 localhost.localdomain localhost 服务器名称
7)        通过ie访问acaphe服务,http://10.10.13.189会看到“it’s work”的字样。说明他已经运行了。
8)        随着linux系统开机自动启动apache。
首先将apachectl命令拷贝到 /etc/init.d 目录下,改名为 httpd;
            使用编辑器打开 httpd 文件,并在第一行 #!/bin/sh 下增加两行文字,如下:
         #chkconfig: 35 70 30
         #description: Apache
      接着注册该服务:
         chkconfig --add httpd
    启动服务:
         service httpd start
9)        到此,系统独立的服务已经安装完毕。下面就是集群整合。
二、        Jboss集群整合
1.Apache配置,只是186配置。
1)        修改$apache\conf\httpd.conf在文件末尾添加:Include conf/mod_jk.conf
2)        下载mod_jk,我下载的是mod_jk-1.2.30-httpd-2.2.X.so,将其改名为mod_jk.so,拷贝到/usr/local/apache2/modules下。
下载地址:http://www.apache.org/dist/tomca ... nux/jk-1.2.30/i586/
并给予执行权限:
chmod 755 /usr/local/apache/modules/mod_jk.so
3)        在$apache\conf下新建文件mod_jk.conf文件内容如下:
# Load mod_jk module
# Specify the filename of the mod_jk lib
LoadModule jk_module modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile conf/workers.properties
# Where to put jk logs
JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat “[%a %b %d %H:%M:%S %Y]”
# JkOptions indicates to send SSK KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat
JkRequestLogFormat “%w %V %T”
# Mount your applications
JkMount /* loadbalancer              
# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
JkMountFile conf/uriworkermap.properties
# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
JkShmFile logs/jk.shm
# Add jkstatus for managing runtime data
<Location /jkstatus/>
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
4)        在$apache\conf下新建文件workers.properties其内容为:
# Define list of workers that will be used
# for mapping requests
worker.list=loadbalancer,status
# Define Node1
# modify the host as your host IP or DNS name.
worker.node1.port=8009
worker.node1.host=10.10.13.186
worker.node1.type=ajp13
worker.node1.lbfactor=1
# Define Node2
# modify the host as your host IP or DNS name.
worker.node2.port=8009
worker.node2.host=10.10.13.187
worker.node2.type=ajp13
worker.node2.lbfactor=1
# Load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=1
#worker.list=loadbalancer
# Status worker for managing load balancer
worker.status.type=status
注:worker.node1.host、worker.node2.host和worker.node3.host要改成jboss集群各机器的实际IP.
如果有更多的节点,顺序定义更多的node段,并在worker.loadbalancer.balance_workers后全部列出.
lbfactor是负载分配权重,值越大分配的负载越多.
5)        在$APACHE/conf/目录创建新文件uriworkermap.properties,内容:
/jmx-console=loadbalancer
/jmx-console/*=loadbalancer
/web-console=loadbalancer
/web-console/*=loadbalancer
2.客户端配置,两台都要配置。
1)        修改$JBOSSE/server/default/deploy/jboss-web.deployer/server.xml文件,将Engine 修改如下:
<Engine name="jboss.web" defaultHost="localhost">
给它增加一个jvmRoute属性:
<Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1">   
2)        修改 $JBOSS_HOME/server/default/deploy/ jboss-web.deployer /META-INF/jboss-service.xml    找到<attribute name="UseJK">该为:
<attribute name="UseJK">true</attribute>
3)        修改$JBOSS_HOME\server\default\deploy\jboss-web.deployer\ROOT.war\WEB-INF\web.xml
在<web-app>紧跟着下面添加 <distributable/>
4)        在vi $jboss\server\all\deploy\jboss-web-cluster.sar\META-INF\jboss-service.xml
下面要做的是基于request的cluster,也就让各个节点之间互相复制session状态。有两种复制模式,同步与异步。使用同步的方式,jboss会把session复制的操作和对request的响应放到一个应用事务(application transaction),session复制完成后才去处理request。异步复制则发送session复制的消息后马上处理request,session复制则会稍有延迟。但是在多框架的web页面中,这样的集群方式会有问题。由于frame在同一时间发出多个request,会造成一些混乱,这也是采用基于用户的集群方式的原因之一。
<attribute name="CacheMode">REPL_ASYNC</attribute>
REPL_ASYNC(异步)或者REPL_SYNC(同步)。
在这个文件下面一点,还有一个config标签,里面指定了各个节点在进行session复制的时候如何通信,有udp和tcp两种可选,如果使用udp方式,那么应该将udp的lookback属性指定为true,因为windows上有一个叫做media sense的东西会影响udp multicast。注意如果你不了解multi address的ip规则,请不要随便修改mcast_addr的值。如果采用tcp方式的话,应该指定bind_addr的值为本机ip,并且在TCPPING标签的initial_hosts属性中列出所有节点,格式是”机器名[端口号]”,比如在我们的例子中,就应该这样配置tcp(以其中一个节点为例):
<config>   ( 在config之前有个注释符号<!--把他去掉,在config最后也有个 -->也去掉)
<TCP bind_addr="本机地址" start_port="7810" loopback="true"/>
<TCPPING initial_hosts="本机地址[7810],另一台地址[7810]" port_range="3" timeout="3500"
将全部down_thread和up_thread的false都改为true.
JBoss的clustering版主建议尽量使用udp。不过在Sobey内部,建议使用tcp方式,经测试可能有不明物体在影响udp通信,导致Timeout异常。
5)        在WEB-INF中添加jboss-web.xml文件,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC
                    "-//JBoss//DTD Web Application 4.2//EN"
                    "http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">
<jboss-web>
<replication-config>
<replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>
                            <replication-granularity>SESSION</replication-granularity>
                            <replication-field-batch-mode>true</replication-field-batch-mode>
</replication-config>
<context-root>/</context-root>
</jboss-web>
6)        配置default目录,让该目录支持集群
将如下文件从%JBoss_Home%\server\all\lib里面拷到%JBoss_Home%\server\default\lib目录下:
jbossha.jar(加载org.jboss.ha.framework.server.ClusterPartition)
jgroups.jar(JBoss集群底层通信协议)
jboss-cache-jdk50.jar(加载org.jboss.cache.aop.TreeCacheAop)
将如下文件从%JBoss_Home%\server\all\deploy里面拷到%JBoss_Home%\server\default\deploy目录下:
deploy.last
jboss-web-cluster.sar
cluster-service.xml
ejb3-clustered-sfsbcache-service.xml
以下为jboss集群中的另一台服务器配置,基本方法同上,有一点点不同。
7)        使得JBoss知道自己为Node2结点
deploy\jboss-web.deployer目录下的server.xml
<Engine name="jboss.web" defaultHost = "localhost">
改为
<Engine name="jboss.web" defaultHost= "localhost" jvmRoute="node2">
8)        通知Node 2添加一个jvmRoute值到会话cookies中,以便mod_jk可以路由随后的请求
在deploy\jboss-web.deployer\META-INF目录下的jboss-service.xml
<attribute name="UseJK">false</attribute>改为
<attribute name="UseJK">true</attribute>
9)        定义重定向地址
在deploy\jboss-web-cluster.sar\META-INF目录下的jboss-service.xml
<TCP bind_addr = "thishost" start_port = "7810" loopback= "true"…>
改为
<TCP bind_addr = "10.10.13.187" start_port= "7810" loopback="true"…>;
<TCPPING initial_hosts= "thishost[7810], otherhost[7810]" port_range="3"…>
改为
<TCPPING initial_hosts= "10.10.13.187[7810], 10.10.13.186[7810]" port_range="3"…>。
10)        通过上述配置,jboss集群配置已经基本实现。祝大家成功。
3.集群轮询操作
这个步骤是实现节点间的轮询操作,将Apache作为LoadBalance前置机分别有三种不同的部署方式。进入Apache的conf目录,打开httpd.conf文件,在文件的末尾加入:
1)        轮询均衡策略的配置
ProxyPass / balancer://proxy/        
<Proxy balancer://proxy>
       BalancerMember http://10.10.13.186:80/
       BalancerMember http://10.10.13.189:80/
</Proxy>
2)        按权重分配均衡策略的配置
ProxyPass / balancer://proxy/        
<Proxy balancer://proxy>
        BalancerMember http://192.168.6.37:6888/  loadfactor=3
        BalancerMember http://192.168.6.38:6888/  loadfactor=1
</Proxy>
3)        权重请求响应负载均衡策略的配置
ProxyPass / balancer://proxy/ lbmethod=bytraffic  
<Proxy balancer://proxy>
         BalancerMember http://192.168.6.37:6888/  loadfactor=3
         BalancerMember http://192.168.6.38:6888/  loadfactor=1
</Proxy>下面还有
(注:每次修改httpd.conf,重新启动Apache。Apache与节点jboss安装方法及设制与上一方法相同。不需要安装mod_JK)



部署包要更系统的字体。
# vi  /etc/sysconfig/i18n

LANG="zh_CN.GB18030"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"

重启系统。

让你的apache记录一个页面的访问时间

有时候,需要我们通过访问日志来观察是哪个页面访问慢,从而可以了解我们网站的某个程序是不是存在问题。
编辑httpd.conf
把  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
改成 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined

这里的 %D就是记录页面执行时间的参数,单位是毫秒。
重启apahce即可生效。

apache proxy undefined reference to `proxy_hook_scheme_handler'

出现这个错误时,我的编译参数为
./configure --prefix=/usr/local/apache2 --with-included-apr --enable-so --enable-deflate=shared --enable-expires=shared --enable-rewrite=shared --enable-static-support --disable-userdir  --enable-proxy-http


后来加上 --enable-proxy 就可以了
./configure --prefix=/usr/local/apache2 --with-included-apr --enable-so --enable-deflate=shared --enable-expires=shared --enable-rewrite=shared --enable-static-support --disable-userdir --enable-proxy  --enable-proxy-http

apache mod_proxy 扩展模块安装

现在用到apache的扩展功能了,可是在第一次编译的时候,没有编译进这个模块去?怎么办呢,可以通过扩展的方式编译一下。
下载相同版本的apache源代码,注意,一定是要相同版本的,否则编译不能成功。
下载后,解压
cd  httpd-2.0.59/modules/proxy
/usr/local/apache2/bin/apxs -c -i -a mod_proxy.c proxy_connect.c proxy_http.c proxy_util.c
从输出里面看到apache的modules目录下已经产生了mod_proxy.so,且已经在httpd.conf中激活了
cd /usr/local/apache2/conf/
ls ../modules/ 看到确实有mod_prxoy.so
编辑配置文件
vi httpd.conf
修改如下
加载模块
LoadModule proxy_module modules/mod_proxy.so (这句是编译激活时产生的)
LoadModule proxy_http_module modules/mod_proxy.so (这句是要手动添加的)

到这里proxy模块的支持算是已经完成了,下面就该配置虚拟主机了。具体请参考 http://mylinux.5d6d.com/thread-565-1-1.html

配置tomcat的进程数控制

修改server.xml文件如下所示:

修改前:    <Connector port="8080" protocol="HTTP/1.1"
                  connectionTimeout="20000"
                  redirectPort="443" '/>

修改后:    <Connector port="8080" protocol="HTTP/1.1"
                  maxHttpHeaderSize="8192“
                  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                  enableLookups="false" redirectPort="8443" acceptCount="100"
                  connectionTimeout="20000" disableUploadTimeout="true"
                   URIEncoding="UTF-8"/>

apache 查看加载哪些模块

/usr/local/apache2/bin/httpd  -l

apache-2.0.59.tar.gz 下载

下载地址为:  http://mylinux.5d6d.com/userdirs/c/f/mylinux/httpd-2.0.59.tar.gz

apache的order allow deny

这个东西确实挺容易让我们迷糊。其实也不难,只要你掌握这样一条规律即可:
首先举个例子:Order deny,allow
deny  from all
allow from 127.0.0.1
我们判断的依据是这样的:
1. 看Order后面的,哪个在前,哪个在后
2. 如果deny在前,那么就需要看deny from 这句,然后看allow from 这一句
3.  规则是一条一条的匹配的,不管是deny在前还是allow在前,都是会生效的。比如例子中,先deny 了所有,然后又allow了127.0.0.1,所以127.0.0.1是通过的。

不妨再多举几个例子:Order allow,deny
deny  from all
allow from 127.0.0.1
这个就会deny所有了,127.0.0.1也会被deny。因为顺序是先allow然后deny,虽然一开始allow了127.0.0.1,但是后面又拒绝了它。Order allow,deny
deny from all
全部都不能通行Order deny,allow
deny from all
全部都不能通行Order deny,allow全部都可以通行(默认的),记住即可Order allow,deny全部都不能通行(默认的),记住即可

apache 代理模块 proxy应用

要使用proxy功能,首先编译apache的时候,需要加上参数 --enable-proxy --enable-proxy-http
如果,不想重新编译,也可以以扩展的形式安装proxy模块,具体请参考 http://mylinux.5d6d.com/thread-939-1-1.html

具体配置为:<VirtualHost *:80>
    ServerName www.test.com
    CustomLog "/dev/null" combined
   ProxyRequests Off
        <Proxy *>
        Order deny,allow
        Allow from all
        </Proxy>
    ProxyPass / http://www.test.com/
     ProxyPassReverse / 192.168.13.111/
</VirtualHost>
另外需要注意的是,需要在/etc/hosts 中加一条记录  
192.168.13.111  www.test.com

apache的proxy代理总访问后端web的第一个虚拟主机

问题,如题。怎么折腾都是一直访问第一个虚拟主机,后来找到问题所在。是我配置的不对。错误配置是这样的:<VirtualHost *>

    ServerName www.test.com

    CustomLog "/dev/null" combined

   ProxyRequests Off

        <Proxy *>

        Order deny,allow

        Allow from all

        </Proxy>

    ProxyPass / http://192.168.13.111/

     ProxyPassReverse / 192.168.13.111/

</VirtualHost>
问题出在了:  ProxyPass / http://192.168.13.111/
要改成这样:  ProxyPass / http://www.test.com/

所以正确的配置是这样的:<VirtualHost *>

    ServerName www.test.com

    CustomLog "/dev/null" combined

   ProxyRequests Off

        <Proxy *>

        Order deny,allow

        Allow from all

        </Proxy>

    ProxyPass / http://www.test.com/

     ProxyPassReverse / 192.168.13.111/

</VirtualHost>
另外需要注意的是,需要在/etc/hosts 中加一条记录  
192.168.13.111  www.test.com

使apache的日志文件里不记录图片文件

找到: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  LogFormat "%h %l %u %t \"%r\" %>s %b" common
  LogFormat "%{Referer}i -> %U" referer
  LogFormat "%{User-agent}i" agent
  再后面加上图片文件的类型
  SetEnvIf Request_URI \.gif$ gif-image
  SetEnvIf Request_URI \.GIF$ gif-image
  SetEnvIf Request_URI \.jpg$ gif-image
  SetEnvIf Request_URI \.JPG$ gif-image
  SetEnvIf Request_URI \.png$ gif-image
  SetEnvIf Request_URI \.js$ gif-image
  SetEnvIf Request_URI \.bmp$ gif-image
  SetEnvIf Request_URI \.css$ gif-image
  SetEnvIf Request_URI \.mid$ gif-image
  SetEnvIf Request_URI \.swf$ gif-image
  SetEnvIf Request_URI \.mmf$ gif-image
  SetEnvIf Request_URI \.wma$ gif-image
  SetEnvIf Request_URI \.midi$ gif-image
  记日志时
  CustomLog /usr/local/apache/logs/access.log combined env=!gif-image