Tomcat优化
# Tomcat安全优化
# 1. 修改默认Shutdown端口和暗号
虽然Tomcat的Shutdown端口默认只允许本地访问,但还是修改一下比较好。
# 配置方式
vim ./conf/server.xml
- 修改配置文件中Server标签的属性<Server port="端口号" shutdown="暗号">
1
# 2. 关闭AJP连接端口
如果Web服务器和Tomcat做的是短链接,就需要频繁的创建和关闭TCP连接,于是Tomcat就做了个优化,架设了一个叫做AJP的长连接,在多个请求和响应周期过程中会重用该连接,以减少了创建连接和关闭连接的次数。 但是AJP服务只有Apache服务器才能使用。而我们一般是使用Nginx+Tomcat的架,用不着AJP协议,所以一般会把AJP连接器关闭以节省资源。
# 配置方式
vim ./conf/server.xml
- 注释掉配置文件中包含protocol="AJP/1.3"
的Connector标签。- Tomcat8.5之后默认是关闭(注释)的。
# 3. 关闭WEB管理端
# 配置方式
注释掉server.xml中管理端配置
<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>
1
2
3
4
5
6
7
8
9删除管理端相关的WEB文件
- webapps/下的默认文件都可以删掉
# 4. 降权启动
让服务以普通用户运行。
# 配置方式
# 1.创建普通用户 useradd -M tomcat # 2.将Tomcat目录所有者改为普通用户 chown -R tomcat:tomcat /data/apps/tomcat chmod -R 744 /data/apps/tomcat # 3.以普通用户的身份启动TOMCAT su - tomcat -c /data/apps/tomcat/tomcat/bin/startup.sh # 4.加入自启动 su - tomcat -c /data/apps/tomcat/tomcat/bin/startup.sh >> /etc/rc.local
1
2
3
4
5
6
7
8
9
10
11
12
# 5. 关闭文件列表访问控制
Tomcat默认是关闭的。
# 配置方式
vim ./conf/web.xml
<init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param>
1
2
3
4
# 6. 关闭Tomcat错误页面信息
Tomcat默认错误页面会显示版本信息,一般不应该将版本号信息展示出来。
# 配置方式
- 通过指定错误页面解决。
- 我们可以通过修改./conf/web.xml下的配置进行错误页面的重定向。
- 也可以修改应用程序下的WEB-INF/web.xml下的配置进行错误页面的重定向。
# 7. 修改服务端响应头信息
# 配置方式
vim ./conf/server.xml
- 在Connector中添加头信息即可, 比如:server="myserver"
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" server="myserver" />
1
2
3
4注意:通过Nginx转发访问时,可能会被Nginx的信息覆盖。
# 8. 访问限制
类似于nginx的allow和deny。
# 配置方式
vim ./conf/server.xml
- 在<Host>
虚拟主机中配置<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.10.*,10.0.0.1" deny="*.*.*.*" />
1
2
# 9. 回收脚本权限
不让其他用户拥有执行脚本的权限。
# 配置方式
chmod -R 750 ./bin/
- 将./bin/中的文件全部修改为750权限
# Tomcat性能优化
# 1. tomcat工作模式(io模型)
bio(blocking io)
- 阻塞模型- Tomcat7之前使用的工作模型,同步阻塞,每个客户端的连接都会启动一个线程来处理。并发量高时,线程数较多,会造成资源浪费。
nio(new io)
- 非阻塞模型- Tomcat8之后的工作模型,异步非阻塞,nio1(默认)/nio2可以通过少量的线程处理大量的请求。
apr(Apache Portable Runtime)
- 也是一个异步模型,同时也会提升Tomcat在静态文件方面的处理能力,但配置较复杂。Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。
- 平时使用Nginx处理静态文件的话,可以不用apr模式。
# 2. 禁用DNS逆向解析功能
该功能可用于获取客户端的主机名,但实际上从IP解析到域名的意义不大,而且会消耗一定的查询时间,所以一般可以关闭该功能,以提高性能。 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址。
# 配置方式
vim ./conf/server.xml
- 在Connector中添加配置<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" enableLookups="false" />
1
2
3
4enableLookups="false"
- 关闭DNS逆向解析
# 3. 开启压缩功能
压缩静态资源,例如css/js/html/jpg等。开启GZIP压缩虽然可以提高Web响应速度,但是会提高服务器CPU消耗,看如何取舍。
# 配置方式
vim ./conf/server.xml
- 在Connector中添加配置<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,application/javascript,text/css,text/plain,text/json" />
1
2
3
4
5
6compression="on"
- 启用压缩功能compressionMinSize="2048"
- 文件压缩最小大小阈值,单位B,默认2048B- 此处是大于2KB的文件才进行压缩,注意此值的大小,如果配置不合理,产生的后果是小文件压缩后反而变大了,达不到预想的效果。
compressableMimeType="text/html,text/xml"
- 会被压缩的MIME类型列表- 多个用逗号隔开,表明支持html、xml、js、css、json等文件格式的压缩。
# 4. 线程相关优化
需要根据实际情况进行配置,一般要结合压力测试工具边测试边进行调整。测试工具一般有ab(http)、stree(系统)、jmeter(http/接口)、LoadRunner(专业压力测试)。
# 配置方式
vim ./conf/server.xml
- 在Connector中添加配置<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="500" minSpareThread="10" acceptCount="500" acceptorThreadCount="2" />
1
2
3
4
5
6
7maxThreads="500"
- 最大工作线程数量minSpareThread="10"
- 始终打开的最小工作线程数量- 并发量低时可以节省创建线程的开支。
acceptCount="500"
- 接收新请求的最大队列长度- 一般保持和最大线程数量一致即可,当工作线程达到最大线程数量时,新请求就需要排队等待线程处理。
acceptorThreadCount="2"
- 单个线程处理请求数- 也就是一个线程最多能处理多少个请求,一般和CPU核心数一致,或者设为其2倍。
# 5. JVM内存优化
服务器内存小时,一般最大内存可以设为初始内存的两倍,让JVM按需使用资源。但在内存资源比较充足时,建议JVM初始内存和最大内存设为一致,分配一个固定的内存大小以减少内存抖动。 JVM向操作系统申请内存时都需要一定的开销,所以在启动项目的时候就直接设置好足够的堆内存大小,省下了申请内存的开销。
# 配置方式
vim ./tomcat/bin/setenv.sh
- 在setenv.bat或setenv.sh文件中配置- 如果tomcat的bin目录下没有这个文件,可以手动创建。
- setenv.bat或setenv.sh是tomcat的变量通用文件,里面的变量会被daemon.sh和startup.sh等启动器引用。
# -Xms 初始内存 # -Xmx 最大内存 # -Xloggc执行GC时打印日志 JAVA_OPTS="-Xms1024m -Xmx1024m \ -Xloggc:/var/log/tomcat_gc.log"
1
2
3
4
5
# 6. 动静分离优化
Nginx处理静态资源,Tomcat处理动态资源。
# Nginx+Tomcat
Nginx配置文件
- 注意目录权限问题,需要让Nginx有访问Tomcat静态资源的权限。
upstream tomcat { 192.168.10.11:8080 max_fails=3 fail_timeout=10s; 192.168.10.12:8080 max_fails=3 fail_timeout=10s; } server { listen 80; server_name zrlog.test.com; root /data/apps/tomcat/tomcat/webapps/zrlog.test.com/ROOT; # 需要程序做动静分离才会有index.jsp location / { index index.jsp; } location ~ \.(gif|jpg|png|js|css)$ { expires 1d; } location ~ \.jsp$ { proxy_pass http://tomcat; proxy_set_header Host $http_host; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# LB+Nginx+Tomcat
LB配置文件
upstream nginx { 192.168.10.11:80 max_fails=3 fail_timeout=10s; 192.168.10.12:80 max_fails=3 fail_timeout=10s; } upstream tomcat { 192.168.10.13:8080 max_fails=3 fail_timeout=10s; 192.168.10.14:8080 max_fails=3 fail_timeout=10s; } server { listen 80; server_name zrlog.test.com; # 默认走Tomcat动态请求,因为动态请求不太好区分 location / { proxy_pass http://tomcat; proxy_set_header Host $http_host; } # 静态资源走Nginx获取 location ~* \.(htm|html|js|css|jsp|json|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { proxy_pass http://nginx; proxy_set_header Host $http_host; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27Nginx配置文件
- 需要将静态资源传输到Nginx后端或者挂NFS,如果有上传的文件的功能应当挂NFS,以保证任意以一台Nginx服务器都能访问上传的资源。
server { listen 80; server_name zrlog.test.com; root /data/apps/webapps/zrlog.test.com/ROOT; location / { index index.html; } location ~ \.(htm|html|js|css|jsp|json|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 1d; } }
1
2
3
4
5
6
7
8
9
10
11
12
13