Junhc

岂止于博客

Tomcat

Tomcat相关端口

端口:8005 主要负责启动关闭
8008 主要负责通过AJP均衡,常用于Apache与Tomcat整合
8080 WEB访问,常用于Nginx与Tomcat整合

// 1.在tomcat安装目录的conf目录下的server.xml文件中,以下内容中的port属性指定了默认端口
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

// 2.默认的根目录是tomcat7\webapps\ROOT,我们可以在tomcat\conf\server.xml文件Host标签中指定根目录和其他目录
//   根据上面的配置,我们访问http://127.0.0.1/aaa时候,使用F:\aaa目录中的web程序,bbb同理。
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
        <Context docBase="F:\aaa" path="/aaa" reloadable="true"/>
        <Context docBase="F:\bbb" path="/bbb" debug="0" reloadable="true" crossContext="true" />
</Host>

// 3.三种设置根目录的方法
// 第一种方法:
// 打开tomcat\conf\server.xml文件,在Host标签之间加入代码
<Context docBase="F:\aaa" path="" debug="0"  reloadable="true"/>

// 第二种方法:
// 在tomcat默认安装后,tomcat的主目录是webapps/ROOT目录,将war包解压后的文件全部拷进去即可。

// 第三种方法:
// tomcat5.0以下版本在tomcat/conf/Catalina/localhost目录下会自动生成了一个ROOT.Xml,
// 但是5.0以上版本不再生成此文件,所以可以新建个ROOT.xml,在里面加入如下代码:
<?Xml version='1.0' encoding='utf-8'?>
  <Context crossContext="true" docBase="F:\aaa" path="" reloadable="true"/>
Tomcat实现多域名之间Session共享

问题:
启用二级域名后,面临一个主域名与二级域名之间Session不能共享的问题。
因为Tomcat下,JSESSIONID(Cookie)的path是默认没有限制的,访问不同的二级域名,Cookie就重新生成,那么Session也会不一样。
解决方案:
1.在项目的/MET-INF/目录下创建一个context.xml文件

<Context ... sessionCookiePath="/">...</Content>

2.Tomcat的server.xml文件

<Context ... sessionCookiePath="/">...</Content>

当然也可以配置域名、Http只读

<Context ... useHttpOnly="true" sessionCookiePath="/" sessionCookieDomain=".XXXX.com">...</Content>
Tomcat线程优化

Tomcat的server.xml文件

maxThreads : 表示Tomcat可创建的最大线程数, 默认值: 150 (Tomcat使用线程来处理每个请求)
acceptCount : 指定当没有可用线程时, 可以放到处理队列中的请求数, 超过这个数的请求将不被处理, 默认值: 10
minSpareThreads : Tomcat初始化时创建的线程数, 默认值: 25
enableLookups : 是否反查域名, 默认值: true. 为了提供性能, 设置为false.
connnectionTimeout : 网络连接超时时间, 默认值: 60000/ms. 设置为0表示永不超时. 经验值: 30000
maxKeepAliveRequests : 保持请求数量, 默认值: 100
bufferSize : 输入流缓冲大小, 默认值: 2048bytes
compression : 压缩传输,取值on/off/force,默认值off。

其中和最大连接数相关的参数为maxThreads和acceptCount。如果要加大并发连接数,同时加大这两个参数。  

示例 :

<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="1000"
minSpareThreads="60"
maxSpareThreads="600"  
acceptCount="120"
redirectPort="8443"
URIEncoding="utf-8"/>
Tomcat内存优化

Tomcat默认可以使用的内存为128MB, Windows下, 在文件/bin/catalina.bat. Unix下,在文件/bin/catalina.sh下,
增加如下设置 :
JAVA_OPTS=’-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】 -XX:PermSize=64M -XX:MaxPermSize=128m’ 需要把几个参数值调大。
例如: JAVA_OPTS=’-Xms256m -Xmx512m’ 表示初始化内存为256MB,可以使用的最大内存为512MB。
参数详解 :

-server 启用jdk的server版
-Xms java虚拟机初始化时的最小内存
-Xmx   java虚拟机可使用的最大内存 (一般建议堆的最大值设置为可用内存的最大值的80%)
-XX:PermSize   内存永久保留区域
-XX:MaxPermSize 内存最大永久保留区域
-Xmn jvm最小内存

示例 :

JAVA_OPTS="$JAVA_OPTS  -Xms10g -Xmx10g -XX:PermSize=1g -XX:MaxPermSize=2g -Xshare:off -Xmn1024m
Tomcat设置maxPostSize=0,导致POST方式请求获取不到数据
问题: 最近部署项目,用到的Tomcat 版本:7.0.65,发现一直POST方式请求登录不了,改成GET方式请求后台就可以拿到入参

排查问题: 通过debug日志发现,后端没有接受到前端用户的登陆数据,检查发现Tomcat在server.xml中加入了,maxPostSize=0这个参数,当时为了
解除上传文件大小限制

分析:
查询了表示maxPostSize=0表示post请求不限制大小的,原来从apache-tomcat-7.0.63开始,参数maxPostSize的含义就变了: 如果将值设置为0,表示POST最大值为 0,不限制POST大小需要将值设置为-1。在此版本之前设置为0表示不限制POST大小。