練功房推薦書單

  • 猛虎出柙雙劍合璧版--最新 OCA / OCP Java SE 7 Programmer 專業認證 (電子書)
  • 流浪教師存零股存到3000萬(全新增修版)(書+DVD)
  • 開始在關西自助旅行(京都‧大阪‧神戶‧奈良)(全新增訂版)
  • 不敗教主的300張股票存股術

Tomcat 虛擬主機管理(新增及刪除使用者和站台) RSS feed
Forum Index » Tomcat
Author Message
andowson

七段學員
[Avatar]

Joined: 2007/1/2
Messages: 709
Location: 台北
Online
在完成Apache 2.2 + Tomcat 6.0 + JK 1.2安裝後,接下來便是要如何新增網站(即虛擬主機)了。
我們的設計理念是:
1.為便於管理,我們將以/var/webapps作為所有網站應用程式的起始目錄,每個網站對應到/var/webapps底下的一個和網域名稱同名的目錄(實際上是一個符號連結,連結到一個OS使用者帳號的www目錄),例如DNS名稱為www.andowson.com就對應到目錄/var/webapps/www.andowson.com,Apache和Tomcat都會將網域名稱對應到這個目錄名稱。
www.andowson.com: /var/webapps/www.andowson.com->/home/andowson/www

2.Apache使用Name-based Virtual Host方式,httpd.conf裡面的設定如下:
UseCanonicalName Off
VirtualDocumentRoot /var/webapps/%0

3.Tomcat則是透過<Host>標籤來達成Virtual Host,在此我們將appBase屬性設定為"",內層包含一個網站根目錄的設定<Context path="" docBase="webapps/www.andowson.com" />。

4.為便於維護及升級Tomcat, 我們將Tomcat分為安裝目錄(放程式)及設定目錄(放資料),安裝目錄在/var下,如/var/apache-tomcat-6.0.18,我們建立一個符號連結/var/tomcat6來指向它,日後如更新版本,便只需將此符號連結指向新的安裝目錄即可。

設定目錄在/var/robust目錄下,如需要執行多部Tomcat(為日後做Cluster準備),我們可建立多個worker目錄在/var/robust目錄下,在每個worker目錄下建立conf, logs, temp, work目錄,及一個webapps的符號連結指向/var/webapps。如此一來,/var/robust/worker1/webapps及/var/robust/worker2/webapps下的內容和/var/webapps下的內容是相同的,也就是說我們只需在/var/webapps下新增新的網域名稱,每個worker就都可以存取到同樣一份的內容了。分成安裝目錄及設定目錄兩個不同路徑的好處是,日後,升級Tomcat版本時,只需將/var/tomcat6的符號連結指向新的安裝目錄,如/var/apache-tomcat-6.0.20即可,便不需要去搬移/var/apache-tomcat-6.0.18/webapps的內容。
/var/tomcat6->/var/apache-tomcat-6.0.18
/var/robust/worker1/webapps->/var/webapps
/var/robust/worker2/webapps->/var/webapps

5.接著我們讓網站的實際內容對應到一個OS使用者家目錄下的www目錄,即
/var/webapps/www.andowson.com->/home/andowson/www,
故新增一個網站時,需要新增一個OS使用者帳號,並設定好一個符號連結到該使用者的www目錄下。如果該網站有多個網址,我們只需要再多建立幾個符號連結即可,例如用andowson.com也要可以連到和www.andowson.com的內容。
andowson.com: /var/webapps/andowson.com->/home/andowson/www

6.為了安全起見,我們讓虛擬主機的使用者帳號只能透過FTP連進來更新檔案,不能透過SSH登入進來,我們可以將使用者帳號設定為/sbin/nologin。另外我們可以將該使用者帳號的群組指定為tomcat,以便Tomcat可以順利讀取該使用者目錄下的檔案。

7.為便於網站的開發和除錯,我們需要觀看網站的記錄檔,這點可以透過設定log4j將屬於該虛擬主機的記錄檔寫到其相對應的OS使用者家目錄下的logs目錄(如/home/andowson/logs)來。如果要讓使用者也可以看到網站的存取紀錄,我們可以將Tomcat的access log的目錄也指定到/home/andowson/logs下。這裡需將/home/andowson/logs設定為tomcat群組可以寫入的權限。

8.因為每次建立使用者時都需要新增www和logs的目錄,故我們可以透過在/etc/skel的目錄下建立好www和logs目錄來自動完成這個動作,我們也順便在www目錄下放一個index.html檔案作為網站的預設首頁,內容可以簡單的輸入Under construction或建置中等文字。
mkdir /etc/skel/www
mkdir /etc/skel/logs
echo "Under construction" > /etc/skel/www/index.html


9.[Optional]如果需要流量統計時,可以在新增站台時同時設定好AWStats的流量統計設定檔

新增站台
除了手動去編輯server.xml檔外,為便於動態新增站台,我們可將Tomcat的server.xml拆開成三個檔案,server.header, server.host, server.footer,存放於每個worker目錄下的conf目錄中。拆的方式主要是將第一個<Host>到最後一個</Host>的部分切割出來成為server.host,在第一個<Host>之前的部分就變成server.header,在最後一個</Host>之後的部分就變成server.footer了。接下來我們設計一個新增站台的template檔,透過取代變數的方式,將這個template檔的內容取代後合併回去到server.host,然後再將server.header, server.host, server.footer合併為server.xml。

這個template檔我們取名為server.newhost,內容如下:
<Host name="yourdomain" appBase=""
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve"
               directory="/home/username/logs"  prefix="yourdomain_access_log." suffix=".txt"
               pattern="combined" resolveHosts="false"/>
        <Context path="" docBase="webapps/yourdomain" reloadable="false" />
      </Host>


針對網站記錄檔的template我們取名為log4.newhost,內容如下:
# VH begin: yourdomain
log4j.appender.username=org.apache.log4j.RollingFileAppender
log4j.appender.username.File=/home/username/logs/tomcat.log
log4j.appender.username.MaxFileSize=10MB
log4j.appender.username.MaxBackupIndex=10
log4j.appender.username.layout=org.apache.log4j.PatternLayout
log4j.appender.username.layout.ConversionPattern=%d - %5p (%C:%L) - %m%n

log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[yourdomain]=INFO, username
log4j.additivity.org.apache.catalina.core.ContainerBase.[Catalina].[yourdomain]=false
# VH end: yourdomain

新增站台shell script的檔就很簡單了,只需要傳入三個參數(使用者名稱,密碼,網域名稱)就會自動建立一個網站出來
newsite.sh:
#!/bin/bash
# Name: Tomcat newsite.sh
# Author: Andowson Chang (andowson [at] gmail [dot] com)
# Version: 1.5
# Last Modified: 2009-03-29
CATALINA_HOME=/var/tomcat6
WORKER_ROOT="/var/robust"
WORKER_LIST=( worker1 worker2 )
username=$1
password=$2
yourdomain=$3
useradd -s /sbin/nologin -g tomcat ${username}
echo "${username}:${password}" | chpasswd
ln -s /home/${username}/www /var/webapps/${yourdomain}
chmod 755 /home/${username}
mkdir /home/${username}/logs
chmod 775 /home/${username}/logs
# for Tomcat5
#sed -e "s/yourdomain/${yourdomain}/g" -e "s/username/${username}/g" /root/newsite/log4j.newhost >> ${CATALINA_HOME}/common/classes/log4j.properties
# for Tomcat6
sed -e "s/yourdomain/${yourdomain}/g" -e "s/username/${username}/g" /root/newsite/log4j.newhost >> ${CATALINA_HOME}/lib/log4j.properties
for (( i = 0 ; i < ${#WORKER_LIST[@]} ; i++ ))
do
    mkdir -p ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/Catalina/${yourdomain}
    # for Tomcat5 
    #cp -rf ${CATALINA_HOME}/server/webapps/manager/manager.xml ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/Catalina/${yourdomain}/.
    # for Tomcat6
    cp -rf ${CATALINA_HOME}/webapps/host-manager/manager.xml ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/Catalina/${yourdomain}/.
    sed -e "s/yourdomain/${yourdomain}/g" -e "s/username/${username}/g" /root/newsite/server.newhost >> ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/server.host
    cd ${WORKER_ROOT}/${WORKER_LIST[i]}/conf
    cat server.header server.host server.footer > server.xml
done
sed -e "s/yourdomain/${yourdomain}/g" /root/newsite/awstats.newhost > /etc/awstats/awstats.${yourdomain}.conf


注意:
1.使用前,請先將server.newhost, log4j.newhost, awstats.newhost及newsite.sh下載後存到/root/newsite目錄下,將newsite.sh設定為可執行,如果是使用Tomcat5.5的人,需自行相改對應的部分。
執行範例:
./newsite.sh andowson password www.andowson.com

2.如果遇到有多個網域名稱的狀況,就需要手動修改server.host加上Alias設定,然後再合併一次server.header, server.host, server.footer,產生server.xml,並手動建立第二個以上的域名的symbolic link。例如,假設還有一個網址andowson.com也要連到www.andowson.com:
ln -s /home/andowson/www /var/webapps/andowson.com

刪除站台
刪除網站則需要將我們先前產生的目錄或檔案回復原狀,主要就是刪除掉使用者目錄,worker內的目錄及server.xml中的設定。
使用刪除站台的shell script也是很簡單只需要輸入兩個參數(使用者名稱,網域名稱),即可
delsite.sh:
#!/bin/bash
# Name: Tomcat delsite.sh
# Author: Andowson Chang (andowson [at] gmail [dot] com)
# Version: 1.2
# Last Modified: 2009-03-29
CATALINA_HOME=/var/tomcat6
WORKER_ROOT="/var/robust"
WORKER_LIST=( worker1 worker2 )
username=$1
yourdomain=$2
userdel -r ${username}

rm -rf /var/webapps/${yourdomain}

# for Tomcat5
#sed -i -e "s/${yourdomain}/yourdomain/g" -e '/# VH begin: yourdomain/,/end: yourdomain>/d' ${CATALINA_HOME}/common/classes/log4j.properties
# for Tomcat6
sed -i -e "s/${yourdomain}/yourdomain/g" -e '/# VH begin: yourdomain/,/end: yourdomain>/d' ${CATALINA_HOME}/lib/log4j.properties

for (( i = 0 ; i < ${#WORKER_LIST[@]} ; i++ ))
do
    rm -rf ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/Catalina/${yourdomain}
    #sed -i '/<Host name="${yourdomain}"/,/Host>/d' ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/server.host    
    sed -i -e "s/${yourdomain}/yourdomain/g" -e '/<Host name="yourdomain"/,/Host>/d' ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/server.host
    cd ${WORKER_ROOT}/${WORKER_LIST[i]}/conf
    cat server.header server.host server.footer > server.xml
done
rm -rf /etc/awstats/awstats.${yourdomain}.conf

注意:
1.使用範例:
./delsite.sh andowson www.andowson.com
2.由於sed無法直接刪除<Host="${yourdomain}">到</Host>這樣的變動的pattern,但固定的pattern卻可以。故我改成先將原來的${yourdomain}替換成yourdomain,再將它刪除。
3.刪除一個站台後會留下一行空行,如果覺得礙眼,日後可以找時間再一次手動刪除。
4.如果遇到有多域名的狀況,就需要手動刪除第二個以上的域名的symbolic link。
rm -rf /var/webapps/andowson.com

smilie 記得:修改完server.xml均需要重新啟動Tomcat才會生效!
service tomcat restart
我們可以寫個自動偵測Tomcat設定檔有沒有變動內容的shell script掛在cron來自動完成這個任務,例如我們每15分鐘檢查一次:
tomcat_conf_check.sh:
#!/bin/bash

RETVAL=0

WORKER_ROOT=/var/robust

CONF_CHANGED=`find ${WORKER_ROOT}/worker1/conf/*.xml -mmin -15 | grep -v tomcat-users.xml | wc -l`
if [ $CONF_CHANGED != 0 ]; then
    echo "Tomcat restart began at `date`"
    /etc/init.d/tomcat restart
    echo "Tomcat restart ended at `date`"
fi

exit $RETVAL


chmod 755 /root/newsite/tomcat_conf_check.sh
然後在/etc/crontab中設定:
# check Tomcat config change and restart (2009.04.29)
*/15 * * * * root /root/newsite/tomcat_conf_check.sh >>/var/log/tomcat_conf_check.log

參考資料:
http://tomcat.apache.org/tomcat-6.0-doc/virtual-hosting-howto.html
http://tomcat.apache.org/tomcat-6.0-doc/logging.html
 Filename delsite.sh [Disk] Download
 Description Shell script for deleting a Tomcat virtual host
 Filesize 1 Kbytes
 Downloaded:  26 time(s)

 Filename tomcat_conf_check.sh [Disk] Download
 Description Shell script for auto restart Tomcat when config file changes
 Filesize 325 bytes
 Downloaded:  19 time(s)

 Filename awstats.newhost [Disk] Download
 Description AWStats template for a new host
 Filesize 58 Kbytes
 Downloaded:  29 time(s)

 Filename server.newhost [Disk] Download
 Description server.xml template for a new host
 Filesize 400 bytes
 Downloaded:  26 time(s)

 Filename log4j.newhost [Disk] Download
 Description Log4J template for a new host
 Filesize 561 bytes
 Downloaded:  25 time(s)

 Filename newsite.sh [Disk] Download
 Description Shell script for creating a new Tomcat virtual host
 Filesize 2 Kbytes
 Downloaded:  27 time(s)


分享經驗 累積智慧
[WWW]
jonathan1977

十級學員

Joined: 2010/5/25
Messages: 9
Offline
這位大大
我在測試把它指向我的doname時出錯了
我是用winxp安裝tomcat6.0

我去修改server.xml中的
<host> name="localhost"
預設的把它改成我的doname名字時
它就沒法運作了
在沒改時我用打ip的方式時還可以
比如123.123.123.123:8080/test.html

改了我的doname後
比如
aaa.tw:8080/test.html
就不能了 smilie
不知道是那裡出包呢
andowson

七段學員
[Avatar]

Joined: 2007/1/2
Messages: 709
Location: 台北
Online
jonathan1977您好:
請先幫忙確認一下aaa.tw解析出來的IP是否為您主機的IP
您可以執行ping aaa.tw來取得這個資訊
Microsoft Windows XP [版本 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Andowson>ping aaa.tw

Pinging aaa.tw [67.220.219.231] with 32 bytes of data:

Reply from 10.77.16.252: Destination host unreachable.
Reply from 10.77.16.252: Destination host unreachable.
Reply from 10.77.16.252: Destination host unreachable.
Request timed out.

Ping statistics for 67.220.219.231:
    Packets: Sent = 4, Received = 3, Lost = 1 (25% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

C:\Documents and Settings\Andowson>

我們可以得知aaa.tw=67.220.219.231

自己本機的IP可以用ipconfig /all得知

如果您只是作為自我練習,您可以自行修改C:\WINDOWS\system32\drivers\etc\hosts檔案
加上
123.123.123.123       aaa.tw

分享經驗 累積智慧
[WWW]
jonathan1977

十級學員

Joined: 2010/5/25
Messages: 9
Offline
謝謝大大
我問題找到了
我在網頁時沒加上http://這個協定時
會跑不過去


我是有在seednet申請doname名
也在它的一個免費的doname server中有設對映到的ip address
我測過apache時沒問題
後來想用tomcat做連資料庫的服務
想用doname的方式
不要只是用ip address

我記得以前在用時
只要沒打協定
好像都會幫我補上http://
現在有的瀏覽器卻不會
造成測試的不少問題
真是謝謝大大花時間來幫我看問題
感恩
sentrasd

十級學員

Joined: 2010/4/7
Messages: 3
Offline
版大您好:
我目前依您的文件架設好了apache+ssl+JK+Tomcat目前想把awstats流量分析的部份加上去,才發現沒裝awstats,試著用yum的方式安裝說找不到套件,所以想請教一下應該如何安裝才能和目前已架好的虛擬主機作整合?
我安裝的訊息如下:
[root@ts1 awstats]# rpm -ql awstats
套件 awstats 尚未安裝
[root@ts1 awstats]# yum install awstats
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* addons: mirror.nus.edu.sg
* base: centos.ustc.edu.cn
* extras: centos.ustc.edu.cn
* updates: centos.ustc.edu.cn
Setting up Install Process
No package awstats available.
Nothing to do
andowson

七段學員
[Avatar]

Joined: 2007/1/2
Messages: 709
Location: 台北
Online
自動安裝AWStats的程式awstats.sh內容如下:
#!/bin/bash
# Name: awstats.sh
# Author: Andowson Chang (andowson [at] gmail [dot] com)
# Version: 1.2
# Last Modified: 2010-05-17

#
# check the latest stable version of AWStats 6.x
#
wget http://awstats.sourceforge.net/ -q -t 1 -T 5 -O /tmp/awstats.html
if [ -s /tmp/awstats.html ]; then
   AWSTATS_URL=`grep rpm /tmp/awstats.html | cut -d"\"" -f2`
   AWSTATS_FILENAME=`echo ${AWSTATS_URL}|cut -d "/" -f5`
   AWSTATS_VERSION=`echo ${AWSTATS_FILENAME} | cut -d "-" -f2`
fi
rm -rf /tmp/awstats.html

if [ ! -r ${AWSTATS_FILENAME} ]; then
   wget http://nchc.dl.sourceforge.net/sourceforge/awstats/${AWSTATS_FILENAME}
fi
if [ ! -r ${AWSTATS_FILENAME} ]; then
   echo "Install failed: ${AWSTATS_FILENAME} not found!"
   exit 1
fi 

echo "Install AWStats ${AWSTATS_VERSION}"
yum -y install perl-libwww-perl.noarch
rpm -Uvh ${AWSTATS_FILENAME}
mkdir -p /etc/awstats
cp -rf /usr/etc/awstats/awstats.model.conf /etc/awstats/.

#
# install GeoIP plugin
#
if [ ! -d /usr/local/share/GeoIP/ ]; then
   mkdir /usr/local/share/GeoIP/
fi
if [ ! -r /usr/local/share/GeoIP/GeoIP.dat ]; then
   wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
   gunzip GeoIP.dat.gz
   mv GeoIP.dat /usr/local/share/GeoIP/GeoIP.dat
fi
if [ ! -r /usr/local/share/GeoIP/GeoLiteCity.dat ]; then
   wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
   gunzip GeoLiteCity.dat.gz
   mv GeoLiteCity.dat /usr/local/share/GeoIP/GeoLiteCity.dat
fi
yum -y install zlib-devel
if [ ! -r GeoIP.tar.gz ]; then
   wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
fi
tar zxvf GeoIP.tar.gz
cd GeoIP-*
./configure
make
make check
make install
echo '/usr/local/lib' >> /etc/ld.so.conf
/sbin/ldconfig /etc/ld.so.conf
cd ..
if [ ! -r Geo-IP-1.38.tar.gz ]; then
   wget http://geolite.maxmind.com/download/geoip/api/perl/Geo-IP-1.38.tar.gz
fi
tar zxvf Geo-IP-1.38.tar.gz
cd Geo-IP-*
perl Makefile.PL LIBS='-L/usr/local/lib' INC='-I/usr/local/include' 
make
make test
make install
cd ..

#
# install HostInfo plugin
#
if [ ! -r Net-XWhois-0.90.tar.gz ]; then
   wget http://cpan.nctu.edu.tw/authors/id/V/VI/VIPUL/Net-XWhois-0.90.tar.gz
fi
tar -xzvf Net-XWhois-0.90.tar.gz
cd Net-XWhois-0.90
perl Makefile.PL
make
make install 

#
# generate awstats.conf
#
echo '#
# Directives to allow use of AWStats as a CGI
#
Alias /awstatsclasses "/usr/local/awstats/wwwroot/classes/"
Alias /awstatscss "/usr/local/awstats/wwwroot/css/"
Alias /awstatsicons "/usr/local/awstats/wwwroot/icon/"
Alias /awstatsjs "/usr/local/awstats/wwwroot/js/"
ScriptAlias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/"

#
# This is to permit URL access to scripts/files in AWStats directory.
#
<Directory "/usr/local/awstats/wwwroot">
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>' > /etc/httpd/conf.d/awstats.conf

#
# add cronjob
#
echo '
# update GeoIP.dat ('`date +%Y.%m.%d`')
00 2 5 * * root /root/admin/updateGeoIP_dat.sh >/dev/null 2>&1

# update AWstats record ('`date +%Y.%m.%d`')
01 * * * * root /usr/local/awstats/tools/awstats_updateall.pl now >/dev/null' >> /etc/crontab
 Filename awstats.sh [Disk] Download
 Description AWStats auto installer
 Filesize 3 Kbytes
 Downloaded:  3 time(s)


分享經驗 累積智慧
[WWW]
caramel

十級學員

Joined: 2011/3/7
Messages: 4
Offline
站長您好,

我最近終於把它Run起來了,

但是我想問一下,

如果要把Tomcat Run在不同Machine上,

用IP的方式溝通,

Connector可以做到這件事情嗎?

http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html

然後我有survey到上面那個連結,

不知道是不是這個問題的解答,

但是他好像不是用connetctor。
andowson

七段學員
[Avatar]

Joined: 2007/1/2
Messages: 709
Location: 台北
Online
caramel您好:
您可以參考這個連結上面的圖片及說明:
http://www.easywayserver.com/implementation-tomcat-clustering.htm
Vertical Clustering
image




分享經驗 累積智慧
[WWW]
caramel

十級學員

Joined: 2011/3/7
Messages: 4
Offline
andowson wrote:caramel您好:
您可以參考這個連結上面的圖片及說明:
http://www.easywayserver.com/implementation-tomcat-clustering.htm
Vertical Clustering
image


謝謝 我有按照這個方法把環境架設起來了 謝謝^^
 
Forum Index » Tomcat
Go to:   
Mobile view