tscccn
管理员
管理员
  • 粉丝31
  • 发帖数109
  • 铜币461枚
  • 威望589点
  • 银元200个
  • 社区居民
  • 忠实会员
阅读:2588回复:4

tomcat多主机多实例,以及无法加载项目的处理

楼主#
更多 发布于:2015-02-13 14:10
文章有些地方可能介绍的不一样,因为我直接本地用nginx做了一个代理。属于本人留存!
还有就是这个已经写了好久了,断断续续修修改改,尽管我已经检查了但可能发到博客上的这份有些位置还是难免忘记解释什么。我及时修正。
原文地址:http://kinggoo.com/app-tomcat-7057.htm

当时我遇到一个无法查找到原因的难题,是关于tomcat在运行时被rm -rf掉了(你懂的)。然后使用备份的配置文件重新部署上,发现tomcat可以起来并且不报任何错误,但项目全部都不会被tomcat加载。这个问题困扰了我一天一夜,奋战到早上4点多,测试了无数方法,估计搞出无数的状况,也进行了无数次配置调试。问题原因依然没解决。

针对这个问题的解决办法是:把项目重新部署一份,也就是以前用的java程序必须删除掉,然后重新把之前备份的项目拷贝一份过来才行。怪异。。。。不知道有没有遇到过的!


一、Tomcat配置

1)下载安装
wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57.tar.gz
解压 -> 软连后,没用的删除了。然后看下文件夹结构树
tree -d -L 1  tomcat7.0.57/
tomcat7.0.57/
├── bin
├── conf
├── lib
├── logs
├── temp
├── webapps
└── work

2)部署tomcat实例格式模版
OK,在tomcat安装程序tomcat7.0.57/下创建一个文件夹__masterplate_Basis__,将conf、logs、temp、webapps、work拷贝到__masterplate_Basis__下,修改好相同部分配置后可把__masterplate_Basis__当作模版拷贝出去一份

创建基础结构后,在查看一下tomcat 二级目录下树结构:
tree -d -L 2 tomcat7.0.57/
tomcat7.0.57/
├── bin
├── lib
├── __masterplate_Basis__
    ├── conf
    ├── logs
    ├── temp
    ├── webapps #这东西对于我这边服务器没用到
    └── work

3)每个实例conf下的server.xml文件
最重要的几处修改和创建,我放在后面(startup.sh以及启动脚本)
修改模版呢conf下的server.xml,我直接用两个host主机的形式来配置(是为了比如两个服务关联性很强,一个停止另一个必须重启或者另一个无法使用就可以这样搞),如果你只做一个那可以去掉一个host。
cat server.xml
  
<?xml version='1.0' encoding='utf-8'?>
<Server port="18000" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  
<!-- ser0.kinggoo.com -->
  <Service name="ser0.kinggoo.com">
      <Connector port="8080" protocol="HTTP/1.1"
                connectionTimeout="20000"
                redirectPort="8443" />
  
    <Engine name="ser0.kinggoo.com" defaultHost="ser0.kinggoo.com">
            <Realm className="org.apache.catalina.realm.LockOutRealm">
            <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
            resourceName="UserDatabase"/>
            </Realm>
  
      <Host name="ser0.kinggoo.com"  appBase="/data00/htdocs/kinggoo.com/J.00/_ser0.kinggoo.com_/"
            unpackWARs="true" autoDeploy="true">
                                  
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access0_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
  
      </Host>
    </Engine>
  </Service>
<!-- ser0.kinggoo.com end -->
    
<!-- ser1.kinggoo.com -->
  <Service name="ser1.kinggoo.com">
     <Connector port="8081" protocol="HTTP/1.1"
                connectionTimeout="20000"
                maxPostSize="0"
                redirectPort="8443" />
  
    <Engine name="ser1.kinggoo.com" defaultHost="ser1.kinggoo.com">
        <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
        </Realm>
      <Host name="ser1.kinggoo.com"  appBase="/data10/htdocs/kinggoo.com/J.10/_ser1.kinggoo.com_/"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access1_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
      </Host>
     </Engine>
   </Service>
 <!-- ser1.kinggoo.com end -->
</Server>

3-1)讲解server.xml上的一些信息
1)修改的地方是 停止tomcat时所需要的端口;
2)启动的虚拟主机端口,也就是服务端口(nginx代理的时候就是指向这个) 3)修改主机服务名,主机名等
3-1) 要修改这个位置的服务名
3-2) 修改这个位置的服务名以及下面的主机名
3-3) 3-4)然后在hosts文件内增加一行 127.0.0.1 ser1.kinggoo.com
3-over)记得将修改的字符串或者标识字符串写到hosts文件,此用来做nginx代理时用;
4)appBase ,如果你的项目是想放在webapps下面,那此位置则修改为webapps即可
4-1)否则,例:如你的项目在/PATH/Pro/ROOT/下,那请你将appBase内的路径改为:"/PATH/Pro/"
4-2)在Nginx代理的时候 root的位置填写成/PATH/Pro/ROOT/,root位置写成到ROOT那你一定会知道,这样等于就把ROOT下面的东西全部暴漏了。所以切记在nginx配置的时候要加上
location ~^/(WEB-INF)/ {
deny all;
}

5)*检查没问题保存;

二、向tomcat启动/暂停脚本内添加如下配置
1)向startup.sh脚本内#!/bin/sh的下面添加,如下信息
export JAVA_HOME=/usr/java/latest
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
CATALINA_BASE=$1
export CATALINA_BASE
export CATALINA_HOME=$2
export JAVA_OPTS=$3
export SERVICE_NAME=$4

2)向shutdown.sh脚本内#!/bin/sh的下面添加,如下信息
export JAVA_HOME=/usr/java/latest
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
CATALINA_BASE=$1
export CATALINA_BASE
export CATALINA_HOME=$2

三、处理完server.xml配置文件后,开始修改启动脚本等
1)创建每个实例项目的启动脚本,到时放在每个项目下(我已经把模版改成我的实例名称了 cp -rf 一份出来)
cat  tomcat.sh 
#!/bin/sh
## author:kinggoo.com
## blog: www.kinggoo.com
## Multi instance startup 
 . /etc/init.d/functions
# 自动获取到tomcat实例目录
temp1="`pwd`"
# 获取tomcat安装目录位置
temp2=$(dirname `pwd`)
# 可选,设置启动参数乱七八糟的
opts="-server -Xms64m -Xmx256m -XX:PermSize=128m -XX:MaxPermSize=512m"
# 获取此实例名称
servername=$(basename $temp1)
export JVM_OPTIONS
case "$1" in
start)
if [ -f $temp2/bin/startup.sh ];then
echo $"Start Tomcat"
sudo -u nginx  $temp2/bin/startup.sh "$temp1" "$temp2" "$opts" "$servername"
fi
;;
stop)
if [ -f $temp2/bin/shutdown.sh ];then
echo $"Stop Tomcat"
sudo -u nginx  $temp2/bin/shutdown.sh "$temp1" "$temp2"
echo  $temp2
fi
;;
*)
echo $"Usage: $0 {start|stop}"
exit 1
;;
esac
#exit $RETVAL
该脚本放在__masterplate_Basis__(每个项目下与conf,logs同级)

2)此脚本单独的使用方法
sh tomcat.sh  [start|stop]
如果你不需要下面这个我自己写的脚本,你可以定制了。多实例差不多看到这里就可以了,下面你可以看看参考资料,帮助很大哦!
3)整体多实例启动及相关信息脚本(切记还有一个ini的文件)
cat  run.sh 
#!/bin/bash
 #
# # author:kinggoo.com or Ts.
# # blog: http://www.kinggoo.com
# # blog: http://helpcmd.com
# # 需要读取当前目录下的.config.ini文件
# # ---------------------------------------
# # 使用方法:
# # sh run.sh all [start|stop]
# # 或:
# # sh run.sh 实例名称 [start|stop] 
# # 或:
# # sh run.sh
# # ---------------------------------------
 #
cd `dirname $0`;
########### function #############
## 读取ini文件夹内容
function __readINI() {
 INIFILE=$1;    SECTION=$2;     ITEM=$3
 _readIni=`awk -F '=' '/\['$SECTION'\]/{a=1}a==1&&$1~/'$ITEM'/{print $2;exit}' $INIFILE`
echo ${_readIni}
}
  
## 设置服务状态 相反
function __runStatus() {
 _num=$1;  _serviceFileName=$2 
 if (( $_num==0 ));then
  cd ${_serviceFileName}
  sh tomcat.sh start > /dev/null
  cd -
 elif (( ${_num}==1 ));then
  cd ${_serviceFileName}
  sh tomcat.sh stop > /dev/null && rm -fr ./work/*
  cd - ;
 else
  break;
 fi
}
## 获取服务端口
function __port() {
# input 
# return  port array
_serviceName="$1/conf/server.xml"
  
if [[ -e ${_serviceName} ]];then
echo $(grep -o -P -i 'port=\"(.*)\"\ {0,}protocol=\"HTTP' ${_serviceName} | tr -d "a-zA-Z=\"") 
else
 break
fi
  
}
#
  
########### end fun ############
  
declare -a arr
_serviceName=( $( __readINI .config.ini SERVER_LIST S_LIST ) ) 
_tomcatVersion=$( __readINI .config.ini T_VER T_VERSION ) 
  
# server all start/stop
if [[ -n $1 ||  $1 == "all" ]];then
 if [[ $2 == "start" ]];then
  m=0;
 elif [[ $2 == "stop" ]];then
  m=1;
 else
  break
 fi
 echo ${_serviceName[@]} |grep -P -o -i "$1" >/dev/null && _go=1 || _go=0 
 if [[ $1 == "all" && ${_go} -eq 0 ]];then
 for (( i=0;$i<${#_serviceName[@]};i++ ));do
  __runStatus $m ${_serviceName[$i]} 
 done
 elif [[ ${_go} -eq 1 ]];then
  __runStatus $m $1
 fi
  
else
  
while true
do
clear
_description="使用方法:\n  sh run.sh all [start|stop]\n 或:\n  sh run.sh 实例名称 [start|stop] \n 或:\n  sh run.sh"
_len=$(echo ${_description}|wc -c)/3
for (( _t=0;${_t}<=${_len};_t++))
do
 F=${F}"-"
done
echo $F
echo -e ${_description}
echo $F
echo -e "\n--  本地Tomcat启动/关闭情况  --\n"
 _psTomcat=`ps -fe |grep  "${_tomcatVersion}"`
 count=0
 i=""
 for i in ${_serviceName[@]} ;do
  arr[$count]=0
  y="1"
  _status="\033[3${y}m stop  \033[0m"
   if [[ $(pgrep -f "$i") > 0 &&  $(echo ${_psTomcat}|grep -o -E "$i" |wc -l) > 0  ]];then
        y="6"
        _status="\033[3${y}m start \033[0m" 
        arr[$count]=1
   fi
  echo -e "${count}) - [ ${_status} ] - \033[3${y}m $i \033[0m [tomcat.port: $(__port $i) ]"
    
  ((count=$count+1))
 done
       
 echo -e "\n* 输入服务前的序号后,会将此序号对应服务状态置为相反状态"
 echo -n "请输入服务序号:" && read c
    
 if [[ "$(echo $c | sed 's/[0-9]/1/g')" == "1"  && -n $c ]];then
  if [[ $c -lt ${#_serviceName[@]} ]];then
  __runStatus ${arr[$c]} ${_serviceName[$c]}
  sleep  5
  fi
 else
  break
 fi
done
fi
echo -e "\n\n------------------------------------\nPowered by : http://www.kinggoo.com"

4).config.ini文件内容
[root@localhost tomcat7.0.57]# cat .config.ini 
; tomcat 安装目录
[TOMCATPATH]
T_PATH = /opt/webserver/tomcat7.0.57
; #
  
; 实例文件夹名称(按下面格式输写)
[SERVER_LIST]
S_LIST = kinggoo.com_0 kinggoo1 helpcmd4 kinggoo6 kinggoo5 kinggoo7
; #
  
; 识别tomcat服务标识,只要可以检索出所有的tomcat进行即可 \
; 请自己测试 。脚本里会用到:pgrep tomcat7.0.57
[T_VER]
T_VERSION = tomcat7.0.57


四、脚本使用方法:
 run.sh脚本有三种执行方式:
 1)为添加到service内使用,全部 停止|启动 服务;
sh  run.sh all [start|stop]
如:shell>$  sh run.sh all start

2)启动单实例tomcat服务;
sh  run.sh 单实例文件夹名称 [start|stop]
如:shell>$  run.sh kinggoo.com_0 start

3)运行脚本,列出实例运行状态。可停止|启动单个实例
sh run.sh

会有如下界面产生


五、Nginx的配置
请根据自己实际情况修改:
1)nginx 虚拟主机服务的配置我放在nginx/conf/vhost路径下(如果你需要nginx的配置请参考我上传的文件:百度网盘 )
upstream kinggoo_com{
        server ser0.kinggoo.com:8080 weight=1;
        }
log_format  kinggoo0  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
  
server {
        listen       9000;
        server_name  ser0.kinggoo.com;
        index index.jsp index.html;
        root /data00/htdocs/kinggoo.com/J.00/_ser0.kinggoo.com_/ROOT;
        location ~* "\.(jsp|do)$" {
                include proxy.conf;
                proxy_pass http://ser0.kinggoo.com;
        }
        location ~* "$" {
                include proxy.conf;
                proxy_pass http://ser0.kinggoo.com;
        }
        location ~^/(WEB-INF)/ {
                deny all;
        }
        location ~* "\.(jpg|jpeg|png|gif|html|css)$" {
                proxy_redirect off;
        }
        error_page 404 /html/404.html;
        access_log  /var/log/nginx/access_kinggoo.com  kinggoo0;
        # redirect server error pages to the static page /50x.html
        error_page 502 503 /html/502.html;
        error_page 500 504 /50x.html;
        location = /50x.html {
            root   html;
        }
}

2)nginx的proxy.conf的内容:
cat  proxy.conf 
proxy_redirect          off;
proxy_set_header        Host $host:$server_port;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header       X-Forwarded-For   $proxy_add_x_forwarded_for;
client_max_body_size    1000m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size       4k;
proxy_buffers           256 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;


更多:  http://kinggoo.com/app-tomcat-7057.htm

最新喜欢:

dongnandongna...
会不会我不知道,反正我在努力!
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币13236枚
  • 威望5838点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
沙发#
发布于:2015-02-15 07:13
感谢分享
tscccn
管理员
管理员
  • 粉丝31
  • 发帖数109
  • 铜币461枚
  • 威望589点
  • 银元200个
  • 社区居民
  • 忠实会员
板凳#
发布于:2015-03-11 18:01
dongnan:感谢分享回到原帖
你这上老限制我输入字数。。。
会不会我不知道,反正我在努力!
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币13236枚
  • 威望5838点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
地板#
发布于:2015-03-12 10:27
tscccn:你这上老限制我输入字数。。。回到原帖
不要复制站体,我编辑了下,没问题的哦。
tscccn
管理员
管理员
  • 粉丝31
  • 发帖数109
  • 铜币461枚
  • 威望589点
  • 银元200个
  • 社区居民
  • 忠实会员
4楼#
发布于:2015-03-12 12:02
dongnan:不要复制站体,我编辑了下,没问题的哦。回到原帖
额 让我复制粘贴多好
会不会我不知道,反正我在努力!
游客

返回顶部