********** 第一部分 Tomcat基础配置 ***********
一、Apatch Tomcat 在win下配置
大部分转载自:http://blog.csdn.net/liuhaomatou/article/details/39893897
首先从官方网站http://tomcat.apache.org/下载Tomcat,我这里下载的是最新版本的Tomcat8.0
下载后解压得到:
进入到bin目录下面:
运行tomcat8w.exe tomcat8.exe ,提示 指定的服务未安装 unable to open the service 'tomcat8'
解决方法:
打开命令行提示符窗口=> 进入Tomcat安装目录==> 进入bin目录下==> 输入:
service.bat install //这个命令的实质就是给windows安装一个服务
这个时候会提示:
The CATALINA_HOME
environment variable is not defined correctly 的错误信息。
这个是因为环境变量没有配置正确导致的。
解决方法如下: 1、JAVA_HOME中的路径不能使用分号结尾,如 E:Javajdk1.6.0_10; 这样写就会出现提示CATALINA_HOME或是JAVA_HOME没有配置好的错误,,还有就是JAVA_HOME的路径一定不要写成了JRE的路径 2、CATALINA_BASE,CATALINA_HOME,TOMCAT_HOME中的路径不能以""结尾,如 E:Javaapache-tomcat-6.0.29 这样写就会出现java.util.logging.ErrorManager的错误,屏幕一闪而过 正确的写法:
JAVA_HOME C:Program FilesJavajdk1.8.0_11 CATALINA_BASE D: oolsapache-tomcat-8.0.14-windows-x64apache-tomcat-8.0.14 CATALINA_HOME D: oolsapache-tomcat-8.0.14-windows-x64apache-tomcat-8.0.14 TOMCAT_HOME D: oolsapache-tomcat-8.0.14-windows-x64apache-tomcat-8.0.14
事实上,tomcat的核心就是catalina,startup.sh, shutdown.sh本质就是调用catalina命令
配置好了环境变量后在重新打开运行->cmd->进入到tomcat8.0的bin目录下运行:
service.bat install</span>
这个时候就会提示如下信息:最后在进入到tomcat8.0的解压后的bin目录下运行tomcat8w.exe 即可
在浏览器网页中输入:http://localhost:8080/ 后不能打开,是因为Tomcat没有启动,点击如下图片所示的start按钮即可以启动。
二、Apatch Tomcat 在Linux 和 MacOS上的配置问题
1、下载压缩包
2、解压缩
3、配置环境变量,这里重点介绍两个方法
(1)方法一,修改~/.bash_profile文件
export PATH=$PATH:/Users/fuhua/Documents/Tomcat/apache-tomcat-8.0.30/bin
完了之后可以在bash中,输入startup.sh, shutdown.sh进行开启和关闭tomcat
(2)方法二,写一个脚本文件,丢入/usr/bin变为全局命令,更加灵活和方便
执行方法,bash中输入tomcat start 之类
- #!/bin/bash
-
- case $1 in
- start)
- sh /Library/Tomcat/bin/startup.sh
- ;;
- stop)
- sh /Library/Tomcat/bin/shutdown.sh
- ;;
- restart)
- sh /Library/Tomcat/bin/shutdown.sh
- sh /Library/Tomcat/bin/startup.sh
- ;;
- *)
- echo “Usage: start|stop|restart”
- ;;
- esac
-
- exit 0
********** 第二部分 Tomcat高级配置 ***********
Tomcat默认监听的是8080端口,如果想修改此端口号,打开
D:Program Filesapache-tomcat-8.0.3confserver.xml,找到如下代码段,修改port属性即可
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
(1)制作xx.keystore文件
在命令行下输入如下命令:
keytool -genkey -alias tomcat -keyalg RSA -keystore D: est.keystore
(keytool.exe 在C:Program FilesJavajdk1.7.0_51in目录下。因为已设置jdk环境变量,因此可以在命令行下可直接使用keytool)
密钥库口令随意填,最后一步的密钥口令也随意填,也可以选择跟密钥库口令一样(按”Enter”键即可)
在D盘下可以看到test.keystore 文件
(2) 修改server.xml
打开D:Program Filesapache-tomcat-8.0.3confserver.xml,找到如下代码段
- <!--
- <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
- maxThreads="150" scheme="https" secure="true"
- clientAuth="false" sslProtocol="TLS" />
- -->
将注释打开,并修改Connector 标签内容,keystorePass为密钥库口令
- <Connector port="8443"
- protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true"
- maxThreads="150" scheme="https" secure="true"
- keystoreFile="D: omcat.keystore" keystorePass="password"
- clientAuth="false" sslProtocol="TLS" />
重启Tomcat,在浏览器下输入https://localhost:8443,即可看到Tomcat首页
3、iOS, Android设置https
具体实现,参考这篇文章,有点小复杂
http://blog.csdn.net/wangyadong99/article/details/49124413
4、Tomcat设置默认WEB项目
修改后的Host 标签
- <Host name="localhost" appBase="webapps"
- unpackWARs="true" autoDeploy="true">
- <Context path="" docBase="examples" reloadable="true" crossContext="true">
- </Context>
- <!-- SingleSignOn valve, share authentication between web applications
- Documentation at: /docs/config/valve.html -->
- <!--
- <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
- -->
- <!-- Access log processes all example.
- Documentation at: /docs/config/valve.html
- Note: The pattern used is equivalent to using pattern="common" -->
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
- prefix="localhost_access_log" suffix=".txt"
- pattern="%h %l %u %t "%r" %s %b" />
- </Host>
重新启动Tomcat,在浏览器下输入http://localhost:8080,即可看到examples的首页
访问http://localhost:8080/host-manager/index.jsp,会提示输入用户名、密码,点”取消”,会弹出错误页面,根据此错误页面可以找到设置Tomcat账号的办法
打开D:Program Filesapache-tomcat-8.0.3conf omcat-users.xml,在tomcat-users标签下添加如下内容
重启Tomcat,然后访问http://localhost:8080/host-manager/index.jsp,用户名输入tomcat,密码输入s3cret,即可
5、修改Session有效时间
默认情况下,Session有效时间为30分钟。打开confweb.xml,修改session-timeout标签的值
- <session-config>
- <session-timeout >30</session-timeout>
- </session-config>
6、maxThreads 连接数限制
maxThreads 是 Tomcat 所能接受最大连接数。一般设置不要超过8000以上,如果你的网站访问量非常大可能使用运行多个Tomcat实例的方法。
即,在一个服务器上启动多个tomcat然后做负载均衡处理。
- <Connector port="8080" address="localhost"
- maxThreads="2048" maxHttpHeaderSize="8192"
- emptySessionPath="true" protocol="HTTP/1.1"
- enableLookups="false" redirectPort="8181" acceptCount="100"
- connectionTimeout="20000" disableUploadTimeout="true" />
maxThreads 配置要结合 JVM -Xmx 参数调整,也就是要考虑内存开销。
7、压错传输
通常所说的gzip压缩,Tomcat通过在server.xml配置设置压缩的选项。
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443"
- compression="on"
- compressionMinSize1="2048"
- noCompressionUserAgents="gozilla, traviata"
- compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,,application/octet-stream"/>
当Tomcat完成安装后你首先要做的事情如下:
首次安装完成后立即删除webapps下面的所有代码(已经没有用了)
rm -rf /srv/apache-tomcat/webapps/*
注释或删除 tomcat-users.xml 所有用户权限,看上去如下:
- # cat conf/tomcat-users.xml
- <?xml version='1.0' encoding='utf-8'?>
- <tomcat-users>
- </tomcat-users>
隐藏Tomcat版本信息
- vim $CATALINA_HOME/conf/server.xml
-
- <Connector port="80" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443"
- maxThreads="8192"
- minSpareThreads="64"
- maxSpareThreads="128"
- acceptCount="128"
- enableLookups="false"
- server="Neo App Srv 1.0"/>
-
-
-
- # curl -I http://localhost:8080/
- HTTP/1.1 400 Bad Request
- Transfer-Encoding: chunked
- Date: Thu, 20 Oct 2011 09:51:55 GMT
- Connection: close
- Server: Neo App Srv 1.0
服务器信息已经被改为 Server: Neo App Srv 1.0
不要使用root用户启动tomcat,Java程序与C程序不同。nginx,httpd 使用root用户启动守护80端口,子进程/线程会通过setuid(),setgid()两个函数切换到普通用户。即父进程所有者是root用户,子进程与多线程所有者是一个非root用户,这个用户没有shell,无法通过ssh与控制台登陆系。Java 的JVM 是与系统无关的,是建立在OS之上的,你使用什么用户启动Tomcat,那麽Tomcat 就会继承该所有者的权限。
这造成了一个问题,Linux系统小于1024的端口只有root可以使用,这也是为什么Tomcat默认端口是8080。如果你想使用80端口只能使用root启动Tomcat。这有带来了很多安全问题。
解决方案是创建一个不同用户,如:
- groupadd -g 80 daemon
- adduser -o --home /daemon --shell /sbin/nologin --uid 80 --gid 80 -c "Web Server" daemon
注意 /sbin/nologin , 意味着该用户不能登录,同时我也没有给它指定密码,这个用户只能用于启动tomcat
- chown daemon:daemon -R /srv/*
- su - daemon -c "/srv/apache-tomcat/bin/startup.sh"
接下来解决80端口问题, 思路就是80去调用8080,或者映射端口。
下面是影射方案,80 跳转 8080
- iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
-
- 取消跳转
- iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
-
- 查看规则
- iptables -t nat -L
另一个就是从80请求去调用8080的方案
这个方案可以在 Tomcat 前段增加反向代理,例如:Nginx,Apache,Squid,Varnish或者F5, Array这类设备等等
关闭war自动部署 unpackWARs="false" autoDeploy="false"。防止被植入木马等恶意程序
应用程序部署与tomcat启动,不能使用同一个用户。
我的tomcat 安装在 /srv目录下,Tomcat启动用户为daemon; 应用程序放在/www目录下www所有者是www用户。这样的目的是一旦tomcat被植入web shell程序,它将不能创建或编辑/www目录下面的任何内容。
adduser --home /www -c "Web Application" www
********** 第三部分 延伸阅读 catalin.sh脚本分析 ***********
1、解释startup.sh 和 catalin.sh 的区别
Linux下Tomcat启动后显示控制台:
采用 ./startup.sh 启动,则没有显示控制台。
要像windows一样显示控制台,则 : ./catalina.sh run
2、(转载)tomcat学习笔记之catalina.sh
原文链接:http://blog.csdn.net/jackie_xiaonan/article/details/49229139
本文基于tomcat 8.0.18版本的源码实现写作,随tomcat7发布的脚本可能会有些差异。
最早是在07年部门培训的时候接触到tomcat,但后来的工作都和web开发不相关,所以没有积累多少使用经验,只有一点肤浅的感性认识;12年中项目组启动了新部件的开发,使用tomcat做为运行平台,但和我的工作内容不相关,所以还没有实质性的接触;15年初,调离原项目,加入新产品的研发,而新产品是基于tomcat的j2ee项目,工作这么多年终于有机会和tomcat做一次亲密接触。
与catalina.sh相关的脚本
tomcat发布版本中附带了很多脚本,和catalina.sh相关有如下
- version.sh,查看当前tomcat的版本号。
- startup.sh,启动运行tomcat实例。
- shutdown.sh,停止tomcat实例的运行。
- configtest.sh,校验tomcat配置文件server.xml的格式、内容等是否合法、正确。
- setclasspath.sh,catalina.sh依赖这个脚本来设置一些运行时变量。
脚本version.sh、startup.sh、shutdown.sh、configtest.sh都是对catalina.sh的包装,内容大同小异,差异在于功能介绍和调用catalina.sh时的参数不同。
下面就重点分析下catalina.sh的实现。
catalina.sh的命令行选项
在shell下不带任何参数来执行catalina.sh,可以看到类似如下的输出信息。
Usage: catalina ( commands ... )
commands:
debug Start Catalina in a debugger
debug -security Debug Catalina with a security manager
jpda start Start Catalina under JPDA debugger
run Start Catalina in the current window
run -security Start in the current window with security manager
start Start Catalina in a separate window
start -security Start in a separate window with security manager
stop Stop Catalina, waiting up to 5 seconds for the process to end
stop n Stop Catalina, waiting up to n seconds for the process to end
stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running
stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running
configtest Run a basic syntax check on server.xml - check exit code for result
version What version of tomcat are you running?
帮助信息给出了各选项的意义,但tomcat提供的封装脚本中只用到了其中的一部分,比如:
- version,在version.sh中使用。
- start,在startup.sh中使用。
- stop,在shutdown.sh中使用。
- configtest,在configtest.sh中使用。
如果需要使用其它命令行选项,最简单的方法即是复制startup.sh脚本并重命名为新的脚本,使用文本编辑器调整传给catalina.sh的参数,如此操作之后,满足自定义需求的脚本即创建好了。
catalina.sh中使用的变量
catalina.sh提供了哪些变量?
用文本编辑器打开catalina.sh,首先可以看到一些环境变量的说明,基于功能可以做如下分类:
-
指定tomcat和应用的启动路径
- CATALINA_HOME,指向tomcat的安装路径,或者脚本catalina.sh所在位置的父目录。
- CATALINA_BASE,可选项,如无定义,则与CATALINA_HOME取值相同。用于指向用户自定义的tomcat路径,tomcat启动时将以CATALINA_BASE变量值来计算配置文件、日志文件等的路径。
-
Java运行时路径,tomcat运行依赖系统已安装好的Java运行时软件,因此如下两个变量中至少定义一个,并且变量值指向合法路径。
- JAVA_HOME,指定JDK的安装路径。
- JRE_HOME,指定JRE的安装路径。取值原则,如用户未指定JRE_HOME,则取JAVA_HOME的值;如JRE_HOME和JAVA_HOME都有定义,则优先取JRE_HOME的定义。
- Java运行时参数
- JAVA_OPTS,顾名思义,用来定义传递Java运行时的参数,对全部命令行选项都会生效,因此不建议在本变量中定义堆大小、GC参数、JMX参数等。
- CATALINA_OPTS,用来定义传递给Java运行时的参数,仅在命令行选项为run/start/debug时有效,可以用来传递堆大小、GC参数、JMX参数等。
- CATALINA_TMPDIR,用来定义java.io.tmpdir变量的值,默认值为$CATALINA_BASE/temp。
- JAVA_ENDORSED_DIRS,以分号相隔的目录列表,用来替换非JCP提供的jar实现,默认值为$CATALINA_HOME/endorsed。
-
远程调试参数。当开发环境与应用运行环境不一致,或者开发环境下出于各种原因不适合调试应用时,这时即可借助远程调试来解决问题。JPDA的介绍可参考阅读资料。
- JPDA_TRANSPORT,默认值dt_socket。
- JPDA_ADDRESS,默认值localhost:8000。
- JPDA_SUSPEND,默认值n
- JPDA_OPTS,默认值为-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND
-
其它
- CATALINA_OUT,使用全路径方式指定stdout和stderr重定向之后的文件名,默认值为$CATALINA_BASE/logs/catalina.out。
- CATALINA_PID,本选项在*nix下有效,指定pid文件的存储路径,默认值为空,如用户指定,则启动、停止时都会从变量指定的文件中提取进程ID。
- LOGGING_CONFIG,定义tomcat使用的日志配置文件的路径,默认值为$CATALINA_BASE/conf/logging.properties。
- LOGGING_MANAGER,定义tomcat使用的日志管理器。
看过变量的定义之后,是否有定制变量取值的冲动了?
如何定义catalina.sh提供的变量?
- 方法一,修改catalina.sh,在脚本的开始位置为前述变量赋值。
- 方法二,提供自定义的启动、停止脚本,在自定义的脚本中为前述变量赋值。
- 方法三,使用tomcat开发人员预留的扩展方法,在$CATALINA_BASE/bin/setenv.sh中为前述变量赋值。
个人推荐方法二,升级tomcat版本时非常简单,不需要从原tomcat安装路径下复制文件到升级后的tomcat的安装路径下。
catalina.sh的实现
catalina.sh规格接近600行代码,这足以吓退很多人,但如果肯硬着头皮看几遍的话,其实可以了解到catalina.sh的代码并不复杂,可读性还是很高的。
除去catalina.sh中对cygwin、os400的特殊处理,代码做了如下操作:
- 加载类路径,通过加载、执行setclasspath.sh实现。
- 加载用户自定义变量,通过加载setenv.sh实现。
- 校验变量,包括前述介绍的变量,检查是否存在定义,如无定义则使用默认值,并依据用途做相应的校验。
- 运行命令,依据脚本接收到的选项,将变量拼接为命令,并执行。
阅读材料
- JPDA是Java Platform Debugger Architecture的简写,详尽的阅读材料可参考http://docs.oracle.com/javase/8/docs/technotes/guides/jpda。
3、tomcat启动脚本startup.sh分析
原文地址:
一、分析说明
为了写出更加完善的tomcat启动方面的自动化脚本,健壮自己用于代码上线自动化部署的脚本,特分析下tomcat的bin目录下的starup.sh脚本,学习标准的sh脚本的编写方法,从中吸取经验
二、脚本分析
#!/bin/sh # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ----------------------------------------------------------------------------- # Start Script for the CATALINA Server # # $Id: startup.sh 1130937 2011-06-03 08:27:13Z markt $ # ----------------------------------------------------------------------------- # Better OS/400 detection: see Bugzilla 31132 os400=false darwin=false #os400是 IBM的AIX #darwin是MacOSX 操作环境的操作系统成份 #Darwin是windows平台上运行的类UNIX模拟环境 case "`uname`" in CYGWIN*) cygwin=true;; OS400*) os400=true;; Darwin*) darwin=true;; esac #上一个判断是为了判断操作系统,至于何用,往下看 # resolve links - $0 may be a softlink #读取脚本名 PRG="$0" #test �h File 文件存在并且是一个符号链接(同-L) while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> (.*)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`/"$link" fi done #上面循环语句的意思是保证文件路径不是一个连接,使用循环直至找到文件原地址 #遇到一时看不明白的shell,可以拆解后自己在linux反复运行验证,一点点拆解就会明白的 #link=`expr "$ls" : '.*-> (.*)$'` 模拟后: expr 'lrwxrwxrwx 1 root root 19 3月 17 10:12 ./bbb.sh -> /root/shell/test.sh' : '.*-> (.*)$' #很明确的发现是用expr来提取/root/shell/test.sh的内容 #而这个循环就可以明确其目的,排除命令为链接,找出命令真正的目录,防止后面的命令出错 #这段代码如果在以后有这方面的找出链接源头的需求可以完全借鉴#获取这个脚本的目录
PRGDIR=dirname <span class="string" style="color:#dd1144;">"<span class="variable">$PRG</span>"</span>
EXECUTABLE=catalina.sh
# Check that target executable exists
#这些判断是否气是其他的操作系统
if $os400; then
# -x will Only work on the os400 if the files are:
# 1. owned by the user
# 2. owned by the PRIMARY group of the user
# this will not work if the user belongs in secondary groups
eval
#这个eval还没有理解
else
if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
#判断脚本catalina.sh是否存在并有可执行权限,没有执行权限就退出
echo "Cannot find $PRGDIR/$EXECUTABLE"
echo "The file is absent or does not have execute permission"
echo "This file is needed to run this program"
exit 1
fi
fi
exec "$PRGDIR"/"$EXECUTABLE" start "$@"
#exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。
#exec命令可以很好的进行脚本之间过渡,并且结束掉前一个脚本这样不会对后面执行的脚本造成干扰。
#exec 命令:常用来替代当前 shell 并重新启动一个 shell,换句话说,并没有启动子 shell。使用这一命令时任何现
#有环境都将会被清除。exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会覆盖你当前的 shell 环境。
#exec 可以用于脚本执行完启动需要启动另一个脚本是使用,但须考虑到环境变量是否被继承。
三、总结
tomcat的startup.sh脚本主要用来判断环境,找到catalina.sh脚本源路径,将启动命令参数传递给catalina.sh执行。然而catalina.sh脚本中也涉及到判断系统环境和找到catalina.sh脚本原路径的相关代码,所以执行tomcat启动时,无需使用startup.sh脚本(下一篇分析的shutdown.sh也类似),直接./catalina.sh start|stop|restart 即可。
http://vekergu.blog.51cto.com/9966832/d-2