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

apache的server status 功能

首先要查看,你的apache是否有相应的模块
ls  /usr/local/apache2/modules/mod_status.so
如果没有,请重新编译你的apache
加上 --enable-module=so , 然后再安装一下扩展模块 mod_status.so (http://mylinux.5d6d.com/thread-848-1-1.html)
如果你使用的是rpm包安装的apache,就无需做这一步了,因为rpm安装的是有该模块的。

接下来,就需要配置你的apache了。
vi  http.conf   增加:
LoadModule status_module      modules/mod_status.so

还需要增加:
ExtendedStatus On

<Location /Server-status>
SetHandler Server-status
Order deny,allow
Deny from all
Allow from 192.168.111.36
</Location>

为了安全期间,一定要做一个allow deny的规则。

重启apache就可以使用这个功能了,查看方法:
http://www.example.com/Server-status

apache 安装好后如何查看编译时的参数

网上说,可以使用 apachectl -V   或者 apachectl -l 查看相关的编译的模块看。但是很显然看到的结果根本不是我们想要的。那么如何看呢?
如果你还没有删除源码包的目录,那恭喜你你可以得到一个完美的答案。
cat   apache源码包目录/config.log  |head  就能看到你的编译参数了。
但,不幸的是你已经删除了目录或者已经make clean过,那么我只好想你说声抱歉,你得不到你想要的东东啦。 的确,就像是你看到大街上有一个非常漂亮的美女,但是却不是你的一样。这样形容可能不太恰当,那倒不如说,你想你是国家主席,那肯定是不可能的。是不是,节哀顺便吧!

apache 日志切割问题

apache的日志是可以自动切割的。
方法一: 使用 cronolog 为每一天建立一个新的日志
CustomLog "|bin/cronolog logs/access_%Y%m%d.log" combined

也可以按小时
CustomLog "|bin/cronolog logs/access_%Y%m%d%h.log" combined

方法二:使用 rotatelogs 每一天记录一个日志
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined

每小时
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d%H.log 3600" combined

再看apache rotatelogs语法

rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]

选项

-l

使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。所以一定要加上-l 否则出现的日志时间和实际时间是相差8小时的。

logfile

它加上基准名就是日志文件名。如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀。这两种格式都表示新的日志开始使用的时间。

rotationtime

日志文件滚动的以秒为单位的间隔时间。

offset

相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。

filesizeM

指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。