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

文章有些地方可能介绍的不一样,因为我直接本地用nginx做了一个代理。属于本人留存!
还有就是这个已经写了好久了,断断续续修修改改,尽管我已经检查了但可能发到博客上的这份有些位置还是难免忘记解释什么。我及时修正。

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

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

系统信息:

[root@localhost webserver]# cat /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m

[root@localhost webserver]# uname -r 2.6.32-431.17.1.el6.x86_64

* – * 我使用的是apache-tomcat-7.0.57.tar.gz

一、Tomcat配置
1)下载安装
wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57.tar.gz

解压->软连后,没用的删除了。然后看下文件夹结构树

[root@localhost webserver]# 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 二级目录下树结构:

[root@localhost webserver]# 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。

[root@localhost conf]# 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-2) 修改这个位置的服务名以及下面的主机名
3-3)


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同级)

该脚本放在__masterplate_Basis__(每个项目下与conf,logs同级)

2)此脚本单独的使用方法

sh tomcat.sh  [start|stop]

如果你不需要下面这个我自己写的脚本,你可以定制了。多实例差不多看到这里就可以了,下面你可以看看参考资料,帮助很大哦!

3)整体多实例启动及相关信息脚本(切记还有一个ini的文件)

[root@localhost tomcat7.0.57]# 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

会有如下界面产生

image

五、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的内容:

[root@localhost 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;

文内参考:

tree

中文解释:tree
功能说明:以树状图列出目录的内容。
语  法:tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式>][目录…]
补充说明:执行tree指令,它会列出指定目录下的所有文件,包括子目录里的文件。
参  数:
-a 显示所有文件和目录。
-A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
-C 在文件和目录清单加上色彩,便于区分各种类型。
-d 显示目录名称而非内容。
-D 列出文件或目录的更改时间。
-f 在每个文件或目录之前,显示完整的相对路径名称。
-F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上”*”,”/”,”=”,”@”,”|”号。
-g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
-i 不以阶梯状列出文件或目录名称。
-I<范本样式> 不显示符合范本样式的文件或目录名称。
-l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
-n 不在文件和目录清单加上色彩。
-N 直接列出文件和目录名称,包括控制字符。
-p 列出权限标示。
-P<范本样式> 只显示符合范本样式的文件或目录名称。
-q 用”?”号取代控制字符,列出文件和目录名称。
-s 列出文件或目录大小。
-t 用文件和目录的更改时间排序。
-u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
-x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。

二、Tomcat配置文件Host元素属性介绍

属性名:appBase、使用对象:all、含义:这一Host的Web应用程序目录的路径(Web应用程序和/或WAR文件驻留的目录)。可以是CATALINA_HOME的相对路径,或者是绝对路径、默认值:无;必要的元素

属性名:autoDeploy、使用对象:all、含义:Boolean型表值,在Tomcat正运行时,决定Tomcat是否自动部署最佳到Host的appBase目录中的新Web应用程序。如果该属性被设置为true,则在Tomcat正运行时,在appBase目录中追加Web应用程序的解包目录或WAR文件,则Tomcat将立即对其实现部署。、默认值:ture
属性名:className、使用对象:all、含义:Host容器实现的完全限定类名。该类必须实现org.apache.catalina.Host、默认值:org.apache.catalina.core.standardHost
属性名:deployOnstartup、使用对象:all、含义:Boolean型标记,决定Tomcat在启动时是否自动部署在Host的appBase目录下找到的Web应用程序。、默认值:true
属性名:deployXML、使用对象:S、含义:Boolean型标记,决定Tomcat是否在CATALINA_HOME/conf/[engine-name]/[host-name]目录下自动部署拥有context XML片段文件的Web应用程序、默认值:true
属性名:errorReportValVeClass、使用对象:S、含义:允许由Java开发者定制错误网页,必须实现org.apache.catalina.Valve、默认值:org.apache.catalina.valves.Error-ReportValve
属性名:name、使用对象:all、含义:Host名。在所有Engine的Host名中,必须惟一、默认值:无;必要的属性
属性名:unpackHars、使用对象:S、含义:决定在Tomcat启动Web应用程序之前是否解包WAR文件的标志。如果为true,则Tomcat在解压目录之外提供Web应用程序的资源。如果为false,则在压缩的的WAR文件之外提供Web应用程序的资源、默认值:true
属性名:workDir、使用对象:S、含义:除了在Contexts指定不同的workDir之外,在该Host中所有Web应用程序使用的临时文件路径名、默认值:\${catalina.base}/work
属性名:xmlNamespaceAware、使用对象:、含义:该标志知道启用或禁用XML命名空间。设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验、默认值:false
属性名:xmlValidation、使用对象:、含义:决定Tomcat是否对Web.xml文件执行有效性检验的标志。在大部分Tomcat版本中,该功能不是很有用,因为XML分析器与一直到Sun JDK 1.6.0(包括1.6.0)的JVM中的XML分析器不兼容、默认值:false
此介绍来自于网络 http://blog.csdn.net/mmm123lmj/article/details/6649306

++ 增加 nginx.conf、proxy.conf配置

- THE END -
版权声明:
转载原创文章请注明,文章出处:http://kinggoo.com
原文地址:http://kinggoo.com/app-tomcat-7057.htm
发表评论?

5 条评论。

  1. #!/bin/sh
    #
    # Startup script for jakarta tomcat
    #
    #chkconfig --add xxx # 添加服务
    #chkconfig xxx on # 启动自动运动
    #chkconfig --list xxx # 查看是否成功
     
    #xxx为所在/etc/init.d/下的文件名
    #保证xxx有可执行权限(755以上
    #启动tomcat: service tomcat start
    #停止tomcat:  service tomcat stop
    
    # chkconfig: - 85 20
    # description: Tomcat running
    # processname: tomcat6
    # pidfile: /var/run/tomcat.pid # config:# Source function library.
    . /etc/rc.d/init.d/functions
    # Source networking configuration.
    . /etc/sysconfig/network
    # Check that networking is up.
    [ ${NETWORKING} = "no" ] && exit 0
    # Set Tomcat environment.
    export JAVA_HOME=/usr/java/latest/
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$JAVA_HOME/bin:$PATH
    export PATH=$PATH:/usr/bin:/usr/lib/bin
    # See how we were called.
    tomcat_path=/opt/webserver/tomcat7.0.57/
    case "$1" in
            start)
                    # Start daemon.
                    echo -n "Starting Tomcat: "
                    sh ${tomcat_path}run.sh all start
                    RETVAL=$?
                    echo
                            [ $RETVAL = 0 ] && touch /var/lock/subsys/tomcat ;;
            stop)
                    # Stop daemons.
                    echo -n "Shutting down Tomcat: "
                    sh ${tomcat_path}run.sh all stop 
                    RETVAL=$?
                    echo
                            [ $RETVAL = 0 ] && rm -f /var/lock/subsys/tomcat ;;
            restart)
                    $0 stop
                    $0 start
            ;;
            condrestart)
                    [ -e /var/lock/subsys/tomcat ] && $0 restart ;;
            status)
                   status tomcat
            ;;
            *)
                    echo "Usage: $0 {start|stop|restart|status}"
            exit 1
    esac
    exit 0
    
    
  2. 有人问不改tomcat service.xml内的shutdown端口会有什么问题。我想说:“会对有这个端口的第一个实例执行shutdown操作”

  3. 如果出现tomcat报 EL 表达式的错误
    Stacktrace:] with root cause
    java.lang.ClassCastException: org.apache.jasper.runtime.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl
    at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:1023)
    at org.apache.jsp.login.userLogins_jsp._jspService(userLogins_jsp.java:192)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

    请查看本站 http://kinggoo.com/tomcat-el-error.htm

  4. Tomcat中实现IP访问限制
    原文地址:http://zhumeng8337797.blog.163.com/blog/static/10076891420129231118360/
    效果:只有指定的主机或IP地址才可以访问部署在Tomcat下的应用。Tomcat提
    供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve,前者用于限
    制主机名,后者用于限制IP地址。

    通过配置这两个参数,可以让你过滤来自请求的主机或IP地址,并允许或拒绝
    哪些主机/IP。
    一、全局设置,对Tomcat下所有应用生效
    server.xml中添加下面一行,重启服务器即可:

    此行放在之前。
    例:
    1,只允许192.168.1.10访问:
    2,只允许192.168.1.*网段访问:
    3,只允许192.168.1.10、192.168.1.30访问:
    4,根据主机名进行限制:
    二、局部设置,仅对具体的应用生效
    根据项目配置情况进行设置:
    1,使用conf目录下xml文件进行配置${tomcat_root}\conf\proj_1.xml
    2,直接在server.xml中进行设置${tomcat_root}\conf\server.xml
    在上述文件对应项目的前增加下面一行:

    特别需求:测试版本不想提供别人访问
    打开tomcat6\conf\server.xml文件
    如果是要限制整个站点别人不能访问,则要将

    加入到标签中
    如果是要限制某个站点不能被访问,则要加入到里面就可以。



    RemoteHostValve
    根据主机名进行限制:

    修改文件:
    tomcat/conf/server.xml
    通过tomcat限制ip访问

    域名限制
    IP限制

    重启tomcat升效

发表评论