1. 操作系統(tǒng)
RedHat Linux
2. 所需軟件
Apache 2.2.14 下載地址
http://apache.freelamp.com/httpd/httpd-2.2.14.tar.gz
Tomcat5.5.28 下載地址
http://tomcat.apache.org/download-55.cgi
JK 下載地址
http://apache.etoak.com/tomcat/tomcat-connectors
文件:tomcat-connectors-1.2.28-src.tar.gz
Jdk 1_5_0_04 下載地址
http://java.sun.com/j2se/1.5.0/download.jsp
備注:下載時(shí)將所需軟件包文件保存在/opt目錄下
3. 安裝步驟
A 安裝JDK
# cd /opt/
# chmod +x jdk-1_5_0_04-linux-i586-rpm.bin
# ./jdk-1.5.0_04-linux-i586-rpm.bin
# cd /usr/java/
# ln -s /usr/java/jdk-1_5_0_04 /opt/java
# vi /etc/profile
#添加如下內(nèi)容
export JAVA_HOME=/opt/java/
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=.:$JAVA_HOME/bin:$PATH
B 安裝Apache
# cd /opt/
# tar xvfz httpd-2.0.54.tar.gz
# cd httpd-2.0.54
#./configure --prefix=/opt/apache --enable-module=so
# make
# make install
# cd /opt/apache/conf
# vi ./httpd.conf
將Listen 80 修改為L(zhǎng)isten <Your IP>:80 IP到時(shí)候就是自己機(jī)器的IP地址,否則
其他機(jī)器沒法訪問你。
將ServerName 修改為ServerName <HOST-NAME> ,這個(gè)地方直接127.0.0.1即可。集群的時(shí)候會(huì)讀httpd-vhost.conf
下面是一個(gè)配置有關(guān)的問題:
修改serverName,重裝apache后問題依舊,最后發(fā)現(xiàn)host配置不正確,
httpd.conf 中serverName 為www.zudar.com
host 中 127.0.0.1 www.zudar.com
改為 192.168.100.38 www.zudar.com
后正確啟動(dòng)
問題是由于 ip 地址 與 域名沒有正確匹配引起
也就是說host中一點(diǎn)要配置好ip與serverName
hostname與/etc/hosts的關(guān)系
很過人一提到更改hostname首先就想到修改/etc/hosts文件,認(rèn)為hostname的配置文件就是/etc/hosts。其實(shí)不是的。
hosts文件的作用相當(dāng)如DNS,提供IP地址到hostname的對(duì)應(yīng)。早期的互聯(lián)網(wǎng)計(jì)算機(jī)少,單機(jī)hosts文件里足夠存放所有聯(lián)網(wǎng)計(jì)算機(jī)。不過隨著互聯(lián)網(wǎng)的發(fā)展,這就遠(yuǎn)遠(yuǎn)不夠了。于是就出現(xiàn)了分布式的DNS系統(tǒng)。由DNS服務(wù)器來提供類似的IP地址到域名的對(duì)應(yīng)。具體可以man hosts。
Linux系統(tǒng)在向DNS服務(wù)器發(fā)出域名解析請(qǐng)求之前會(huì)查詢/etc/hosts文件,如果里面有相應(yīng)的記錄,就會(huì)使用hosts里面的記錄。/etc/hosts文件通常里面包含這一條記錄
127.0.0.1 localhost.localdomain localhost
hosts文件格式是一行一條記錄,分別是IP地址 hostname aliases,三者用空白字符分隔,aliases可選。
127.0.0.1到localhost這一條建議不要修改,因?yàn)楹芏鄳?yīng)用程序會(huì)用到這個(gè),比如sendmail,修改之后這些程序可能就無法正常運(yùn)行。
修改hostname后,如果想要在本機(jī)上用newhostname來訪問,就必須在/etc/hosts文件里添加一條newhostname的記錄。比如我的eth0的IP是192.168.1.61,我將hosts文件修改如下:
#hostname blog.infernor.net
# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.1.61 blog.infernor.net blog
這樣,我就可以通過blog或者blog.infernor.net來訪問本機(jī)。
在DirectoryIndex中添加 index.jsp
# cd /opt/apache/bin/
# ./apachectl configtest
若顯示Syntax ok則表明安裝成功
#./apachectl start
啟動(dòng)apache服務(wù),訪問本機(jī)80端口,查看端口是否正常
# ./apachectl stop
關(guān)閉服務(wù)
備注:prefix定義apache的安裝路徑
C 安裝Tomcat
# cd /opt/
# tar xvfz jakarta-tomcat-5.5.9.tar.gz
# ln –s /opt/jakarta-tomcat-5.5.9 /opt/tomcat
# vi /opt/tomcat/bin/catalina.sh
JAVA_HOME=/opt/java
啟動(dòng)服務(wù)后,訪問本機(jī)8080端口,查看端口是否正常
# /opt/tomcat/bin/startup.sh /startup.bat
關(guān)閉服務(wù)
# /opt/tomcat/bin/shutdown.sh /shutdown.bat
修改各個(gè)tomcat的端口(如果兩臺(tái)機(jī)器是在不同的主機(jī)上,端口可以不動(dòng),顯然)
tomcat1/conf/server.xml
<Server port="8005" shutdown="SHUTDOWN" debug="0">改為
<Server port="11001" shutdown="SHUTDOWN" debug="0">
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8"/>改為
<Connector port="11002"
......
作loadbalance的話,上面connector可以注釋掉。
<Connector port="8009"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" />改為
<Connector port="11003"
......
tomcat2/conf/server.xml
<Server port="8005" shutdown="SHUTDOWN" debug="0">改為
<Server port="12001" shutdown="SHUTDOWN" debug="0">
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8"/>改為
<Connector port="12002"
......
上面這個(gè)connector同樣也注釋掉。
<Connector port="8009"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" />改為
<Connector port="12003"
D 安裝JK
#cd /usr/local/
# tar xzvf jakarta-tomcat-connectors-1.2.14-src.tar.gz
#cd jakarta-tomcat-connectors-1.2.14-src/native
#./buildconf.sh
#./configure --with-apxs=/usr/local/apache/bin/apxs
#make
#make install
#cd /opt/jakarta-tomcat-connectors- jk1.2.14-src/jk/native/apache-2.0/
#cp mod_jk.so /opt/apache/modules/
E 系統(tǒng)整合
#vi /opt/apache/conf/httpd.conf
在文件最末尾加上如下語句
include conf/mod_jk.conf
# Configure mod_jk.conf
在conf目錄下創(chuàng)建mod_jk.conf文件,內(nèi)容如下:
--------------------------mod_jk.conf--------------------------
# Load mod_jk module
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] "
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
#指定那些請(qǐng)求交給tomcat處理,"controller"為在workers.propertise里指定的負(fù)載分配控制器
JkMount /*.jsp loadbalancer(這個(gè)loadbalancer是下面worker.list最后一個(gè)值)
如果還要指定*.do也進(jìn)行分流就再加一行
JkMount /*.do loadbalancer
如果你想對(duì)所有的請(qǐng)求進(jìn)行分流只需要寫成
JkMount /* loadbalancer
--------------------------mod_jk.conf--------------------------
編輯workers.properties
#vi /opt/apache/conf/workers.properties
#
# workers.properties
#
# list the workers by name
worker.list=tomcat1, tomcat2, loadbalancer
# ------------------------
# First tomcat server
# ------------------------
worker.tomcat1.port=11003
worker.tomcat1.host=127.0.0.1
worker.tomcat1.type=ajp13
# Specify the size of the open connection cache.
#worker.tomcat1.cachesize
#
# Specifies the load balance factor when used with
# a load balancing worker.
# Note:
# ----> lbfactor must be > 0
# ----> Low lbfactor means less work done by the worker.
worker.tomcat1.lbfactor=100
# ------------------------
# Second tomcat server
# ------------------------
worker.tomcat2.port=12003
worker.tomcat2.host=127.0.0.1
worker.tomcat2.type=ajp13
# Specify the size of the open connection cache.
#worker.tomcat2.cachesize
#
# Specifies the load balance factor when used with
# a load balancing worker.
# Note:
# ----> lbfactor must be > 0
# ----> Low lbfactor means less work done by the worker.
worker.tomcat2.lbfactor=100
# ------------------------
# Load Balancer worker
# ------------------------
# The loadbalancer (type lb) worker performs weighted round-robin
# load balancing with sticky sessions.
# Note:
# ----> If a worker dies, the load balancer will check its state
# once in a while. Until then all work is redirected to peer
# worker.
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1, tomcat2
#
# END workers.properties
#
cluster配置,如果不配置cluster只是做loadbalance不需要
修改server.xml中的engine
#vi /opt/tomcat/conf/server.xml
在120行左右修改原來的, 添加jvmRoute="tomcat1"
<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1">
若第二臺(tái)tomcat,添加jvmRoute的修改為tomcat2
至此,系統(tǒng)已經(jīng)整個(gè)完畢 啟動(dòng)apache和tomcat服務(wù) 如果不放心可以編寫一個(gè)測(cè)試
在其中一個(gè)tomcat的webapps中建立一個(gè)目錄TestCluster,里面新建一個(gè)test.jsp,內(nèi)容為
<%
System.out.println("===========================");
%>
把TestCluster放到tomcat1,tomcat2的webapps下
啟動(dòng)apache,tomcat1,tomcat2,進(jìn)行測(cè)試
通過 http://localhost/TestCluster/test.jsp 訪問,多刷新幾次頁(yè)面,查看Tomcat1和Tomcat2 logs目錄下面的catalina.out
文件,你將可以看到打印了一行行"===========================",并且從統(tǒng)計(jì)上來說,
大約在tomcat2打印的數(shù)量和在Tomcat1中一樣,
如果lbfactor不一樣的話,可以看到請(qǐng)求會(huì)被tomcat1,tomcat2按照不同的權(quán)重分流處理,實(shí)現(xiàn)了負(fù)載均衡。
自動(dòng)重啟
將如下內(nèi)容添加至/etc/rc.d/rc.local文件末尾,以便系統(tǒng)啟動(dòng)后開啟apache,tomcat服務(wù)
/usr/local/tomcat1/bin/startup.sh
/usr/local/tomcat2/bin/startup.sh
/opt/apache/bin/apachectl start
這樣做是不是夠呢,比如說一個(gè)瀏覽器訪問的時(shí)候開始被分發(fā)給A sever,然后又分發(fā)給B server,那么
session里面的數(shù)據(jù)就不一致了或不正確了。兩個(gè)問題,一個(gè)是apahce已經(jīng)實(shí)現(xiàn)了,對(duì)于同一個(gè)瀏覽器通過來的請(qǐng)求會(huì)綁定到同一個(gè)server,那就沒有問題。但是通過下面的測(cè)試發(fā)現(xiàn)不是的。
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
// 如果有新的 Session 屬性設(shè)置
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session 列表</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="index.jsp" method="POST">
名稱:<input type=text size=20 name="dataName">
<br>
值:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
是需要其他配置還是?另一個(gè)方法就是session的復(fù)制,及集群功能。
配置集群的方法參考“鏈接”中的一篇文章就可以了。
apache和tomcat虛擬機(jī)設(shè)置:
1,在apache中 注銷DocumentRoot,ServerName,Directory 等行(Directory包括的也
是)。
2,把conf文件中的Include conf/extra/httpd-vhosts.conf的注銷去掉,這個(gè)文件專
門用于配置虛擬主機(jī)。
3,設(shè)置conf文件的listen 為你的ip
4,假設(shè)apache的項(xiàng)目在usr/webapps下,項(xiàng)目的域名為www.mydomain.com,并在isp做好
了域名解析指向當(dāng)前服務(wù)器的IP
5,打開conf/extra/httpd-vhosts.conf ,添加如下內(nèi)容
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin admin@yazhouly.cn
ServerName www.mydomain.com
DocumentRoot "/usr/webapps/test"
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
<Directory "/usr/webapps/test">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
JkMount /* loadbalancer
</VirtualHost>
其中最后四行表示關(guān)于jsp的內(nèi)容都轉(zhuǎn)交給tomcat處理,雖然我們?cè)谂渲眠B接器的時(shí)候
,已經(jīng)配置了,但是在虛擬機(jī)設(shè)置后,還是要單獨(dú)加上這幾句,其中work就是
mod_jk.conf中配置的代理名。
打開tomcat目錄conf下面的server.xml
添加主機(jī)信息
<Host name="localhost" appBase="/usr/webapps/test"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/usr/webapps/test" debug="0" reloadable="true"
crossContext="true"/>
</Host>
保存 重新啟動(dòng)apache
在地址欄中輸入
www.mydomain.com
就會(huì)出現(xiàn)你的首頁(yè)
遇到的問題
1)啟動(dòng)時(shí)產(chǎn)生 Error receiving mcast package
經(jīng)測(cè)試發(fā)現(xiàn),我用的ADSL,如果我聯(lián)網(wǎng),則會(huì)報(bào)這個(gè)異常,如果斷網(wǎng)則不會(huì)產(chǎn)生。看來那個(gè)
tcpListenAddress="192.168.0.1"
需要使用外網(wǎng)的IP地址才可以。
2)啟動(dòng)異常,一般是端口被占用
請(qǐng)仔細(xì)看各個(gè)server.xml配置文件,各個(gè)端口不能相同
3)如果不能做cluster只做load balance那么jvm="tomcat1"和jvm="tomcat2"這兩部分內(nèi)容必須保留,
cluster保持注釋狀態(tài),<distributable/>不需要。