文章有些地方可能介绍的不一样,因为我直接本地用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)修改主机服务名,主机名等
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)* 检查没问题保存 ;
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 ############# 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
会有如下界面产生
文内参考:
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
- 本文来自:Linux教程网