2010年9月14日 星期二

Httpd + JK + Tomcat 整合設定

要不是拜SSO廠商所賜,我可能不會想這麼做,小的系統架構用不著搞得那麼複雜,Tomcat本來就可以搞定,非得要Apache來參一腳的,真是OOXX的,其實這樣的系統環境整合並不是很特別的架構,討厭及麻煩的原因是Tomcat已經在營運了,要整合現有的Tomcat再加上Apache及SSL(Tomcat已經存在),更生氣的是只有半夜才能更改,因為白天要營運,所以工程師只有鼻子摸著做了,並且只許成功不許失敗勒.....唉~~~
好了抱怨完了,不過工作還是要做…工程師的工作還是要做的…為了4位小朋友卡巴結一點啦~~

首先,系統環境及程式版本要說明一下:

1. 作業系統:RHEL4-U7
2. Apache :Httpd-2.0.63.tar.gz (-o-)SSO要求的
3. mod_jk :tomcat-connectors-1.2.30-src.tar.gz
4. jdk :jdk-1.6u13-linux-i586.bin
5. ant :apache-ant-1.6.5-bin.tar.gz
6. Tomcat :apache-tomcat-6.0.14-src.tar.gz


一、Httpd 安裝
a.解開 httpd 的 tarball
tar xfz httpd-2.0.63.tar.gz


b.變更至 httpd 源碼目錄
cd httpd-2.0.63


c.編譯 httpd 程式,其中包含 proxy 及 ssl 模組
./configure --with-suexec-gidmain \
--with-suexec-logfile \
--enable-proxy \
--enable-proxy-connect \
--enable-proxy-ftp \
--enable-proxy-http \
--enable-ssl \
--enable-http \
--enable-cgi \
--enable-so \
--enable-cache \
--enable-file-cach \
--enable-disk-cache \
--enable-mem-cache \
--enable-mime-magic \
--enable-headers \
--enable-module \
--with-ssl=/usr \
--prefix=/usr/local/apache2

其中有 --with-ssl 是設定 openssl 的產品目錄,一般情況作業系統在安裝時都會有,
所以請確認是否有安裝openssl(rpm -qa grep openssl)及檢查產品安裝的目錄
(rpm -ql openssl),如果沒有安裝openssl,請至 http://www.openssl.org 下載源碼安裝。
make
make install


※程序執行完後,產品會安裝至 /usr/local/apache2 下。

d.設定環境變數
1.增加 apache2 的 bin 目錄到 PATH
echo "export PATH=/usr/local/apache2/bin:\$PATH" >> /etc/profile

※記得要登出系統,再次登入環境變數才會生效。

二、JK 安裝
JK 為 Apache tomcat-connectors 專案,其用途為 Apache 連繫 Tomcat 的介面程式,
所編譯出的程式為 shared object(so) 型態,以便 Apache Include 用。
a.解開 tomcat-connectors 的 tarball
tar xfz tomcat-connectors-1.2.30-src.tar.gz


b.變更至 tomcat-connectors 源碼目錄
cd tomcat-connectors-1.2.30-src


c.編譯 tomcat-connectors
cd native
./configure --with-java-home=/usr/local/java \
--with-apxs=/usr/local/apache2/bin/apxs
make
make install


※程序執行完後,產品 mod_jk.so 會安裝至 /usr/local/apache2/modules/ 下。

三、JDK 安裝
程式是用Java開發的,所以jdk的安裝是必要的,程式請到甲古文網站(http://java.sun.com/j2se/)下載。
a.解開 jdk-6u13-linux-i586.bin 的 binary file
./jdk-6u13-linux-i586.bin

※執行後會有Binary Code License Agreement的說明,在確認後即解開產品 jdk1.6.0_13。

b.將產品搬移到 /usr/local/java,主要原因是我習慣把 java 放在 /usr/local/java 目錄下。
mv jdk1.6.0_13 /usr/local/java


c.設定環境變數
編輯 /etc/profile.d/java.sh ,內容如下:
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

※記得要登出系統,再次登入環境變數才會生效。

四、ant 安裝
ant 是隻了不起的螞蟻,許多 java 程式在執行、測試時,都使用到這隻螞蟻,
其實有寫過 C 程式的人,都應該知道 make 的用途,ant 的角色就像是 make。
a.解開 apache-ant-1.6.5-bin.tar.gz 的 binary file
tar xfz apache-ant-1.6.5-bin.tar.gz

※產品解開目錄為 apache-ant-1.6.5

b.將產品搬移到 /usr/local/ant,主要原因是我習慣把 ant 放在 /usr/local/ant 目錄下。
mv apache-ant-1.6.5 /usr/local/ant

c.設定環境變數
編輯 /etc/profile.d/java.sh ,內容如下:
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export ANT_HOME=/usr/local/ant
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$ANT_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$ANT_HOME/lib:$CLASSPATH

※記得要登出系統,再次登入環境變數才會生效。

五、Tomcat 本來就已經安裝好了,但是還是說明一下安裝方式。
a.解開 apache-tomcat-6.0.14-src.tar.gz 的 tarball
tar xfz apache-tomcat-6.0.14-src.tar.gz

b.變更至 apache-tomcat-6.0.14-src 源碼目錄
cd apache-tomcat-6.0.14-src

c.執行 tomcat 相關程式下載,我想是下載 tomcat 所需的程式。
ant download

※如果這部份程序有問題,請參考目錄中 BUILDING.txt,
或者乾脆下載 tomcat binary file 來用最快。

d.編譯 tomcat 程式
ant

e.編譯完後,將產品搬移到 /usr/local/tomcat,主要原因是我習慣把 tomcat 放
在 /usr/local/tomcat 目錄下。
mv apache-tomcat-6.0.14-src /usr/local/tomcat

f.設定環境變數
編輯 /etc/profile.d/java.sh ,內容如下:
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export ANT_HOME=/usr/local/ant
export TOMCAT_HOME=/usr/local/tomcat
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$ANT_HOME/bin:$TOMCAT_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$ANT_HOME/lib:$TOMCAT_HOME/lib:$CLASSPATH

※記得要登出系統,再次登入環境變數才會生效。

六、整合設定
a.httpd 設定,編輯 conf/httpd.conf ,增加以下資料。
LoadModule jk_module modules/mod_jk.so
Include conf/mod_jk.conf

b.mod_jk.conf 定義檔設定,提供 httpd.conf 來讀取。
# setup the workers.properties file path, default prefix path is httpd's home (/usr/local/apache2)
JkWorkersFile /usr/local/apache2/conf/workers.properties
JkLogFile /usr/local/apache2/logs/jk.log
JkShmFile /usr/local/apache2/logs/jk-runtime-status
JkLogLevel error
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat +ForwardDirectories +ForwardSSLCertChain

JkRequestLogFormat "%w %V %T"
#JkMountCopy All

# SSL Setting
JkExtractSSL On
JkHTTPSIndicator HTTPS
JkSESSIONIndicator SSL_SESSION_ID
JkCIPHERIndicator SSL_CIPHER
JkCERTSIndicator SSL_CLIENT_CERT

c.workers.properties 定義檔設定,提供 mod_jk.conf 來讀取,
worker.properties 此設定為一(httpd)對一(tomcat)的系統架構。
# BEGIN workers.properties
# setting tomcat_home and java_home

workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/local/java

ps=/

# The advanced router LB worker
worker.list=ap01
#worker.list=router ## for Load balance ##

## worker.list defined worer_name, userd by mod_jk.conf

worker.ap01.port=7009
worker.ap01.host=ap01
worker.ap01.type=ajp13
#worker.ap01.lbfactor=1
worker.ap01.cachesize=10
worker.ap01.cache_timeout=600
worker.ap01.socket_keepalive=1

# Define preferred failover node
#worker.ap01.redirect=ap02

## worker.list defined worer_name, userd by mod_jk.conf
worker.ap02.port=7009
worker.ap02.host=ap02
worker.ap02.type=ajp13
#worker.ap02.lbfactor=1
worker.ap02.cachesize=10
worker.ap02.cache_timeout=600
worker.ap02.socket_keepalive=1
# Define preferred failover node
#worker.ap02.redirect=ap03

## worker.list defined worer_name, userd by mod_jk.conf
worker.ap03.port=7009
worker.ap03.host=ap03
worker.ap03.type=ajp13
#worker.ap03.lbfactor=1
worker.ap03.cachesize=10
worker.ap03.cache_timeout=600
worker.ap03.socket_keepalive=1
# Define preferred failover node
#worker.ap03.redirect=ap01

# Define the LB worker
#worker.router.type=lb
#worker.router.balance_workers=ap01,ap02,ap03

※worker.properties 可以設定為 Load balance 的系統架構,設定如下:
# BEGIN workers.properties
# setting tomcat_home and java_home

workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/local/java

ps=/

# The advanced router LB worker
#worker.list=ap01
## for Load balance ##

worker.list=router


## worker.list defined worer_name, userd by mod_jk.conf

worker.ap01.port=7009
worker.ap01.host=ap01
worker.ap01.type=ajp13
worker.ap01.lbfactor=1
worker.ap01.cachesize=10
worker.ap01.cache_timeout=600
worker.ap01.socket_keepalive=1

# Define preferred failover node
#worker.ap01.redirect=ap02

## worker.list defined worer_name, userd by mod_jk.conf

worker.ap02.port=7009
worker.ap02.host=ap02
worker.ap02.type=ajp13
worker.ap02.lbfactor=1
worker.ap02.cachesize=10
worker.ap02.cache_timeout=600
worker.ap02.socket_keepalive=1

# Define preferred failover node
#worker.ap02.redirect=ap03

## worker.list defined worer_name, userd by mod_jk.conf

worker.ap03.port=7009
worker.ap03.host=ap03
worker.ap03.type=ajp13
worker.ap03.lbfactor=1
worker.ap03.cachesize=10
worker.ap03.cache_timeout=600
worker.ap03.socket_keepalive=1

# Define preferred failover node
#worker.ap03.redirect=ap01

# Define the LB worker

worker.router.type=lb
worker.router.balance_workers=ap01,ap02,ap03

d.ssl.conf 定義檔設定,定義 httpd ssl 的服務,編輯 conf/httpd.conf ,
修改以下資料。
※ 設定伺服器憑證及私鑰
SSLCertificateFile /root/CRT/service.crt
SSLCertificateKeyFile /root/KEY/service.key


※設定 jk 對映應用系統網址及worker target,如果是LB,則用router target
JkMount /apps ap01
#JkMount /apps router # for Load Balance
JkMount /apps/* ap01
#JkMount /apps/* router # for Load Balance

e.tomcat 設定,原則上沒有太多的設定,在先前有提到Tomcat已經是在營運了,
都是用 https 來服務,所以說明Tomcat ssl的設定。
編輯 conf/server.xml 檔案,將 SSL 部份的註記取消(default 是 remark 的)。


※而這次的整合,tomcat ssl的服務是要remark的。

f.autoDeploy問題,在系統架構分割後,autoDeploy的功能會因為應用系統的分割,
autoDeploy會無效,所以要加 conf/catalina/localhost/manager.xml ,來說明
tomcat即會忽略 server.xml 的設定,而參照 manager.xml 的設定,manager.xml
內容如下:
<?xml version='1.0' encoding='utf-8'?>
<context path="/apps" debug="0" reloadable="true" crosscontext="true" docbase="app2">

※修改後 autoDeploy 的功能即可運作了。

g.啟動 tomcat web container
cd /usr/local/tomcat/bin
startup.sh

h.啟動 httpd with ssl
cd /usr/local/apache2
apachectl startssl

i.使用 browser 檢視 http://localhost/apps/ 及 https://localhost:443/apps/
看是否可以使用,如果可以看到你的應用系統,恭喜你成功啦~~

七、結語
整合成功是你應該做的,如果失敗你就倒大楣了,老闆的心態總是如此,深呼吸一口氣,做完就好啦...

沒有留言:

張貼留言

HDB 擴充套件 PXF (Pivotal Extension Framework) 應用

在Hadoop生態圈裡, 雖然擁有眾多生態系統工具, 但大多用戶仍然需要的是SQL的操作介面, Pivotal HDB 提供一個在Hadoop上運行的標準SQL引擎介面, 箇中好處開發者最能感受, 但本篇重點不在這, 哈哈~ 主要分享在HDB上可以輕易整合外部資料的應用. ...