Tomcat内存优化主要是对启动参数的优化,能够在Tomcat的启动脚本catalina.sh中设置JAVA_OPTS参数。javascript
-server 启用jdk 的 server 版; -Xms java虚拟机初始化时的最小内存; -Xmx java虚拟机可以使用的最大内存;
配置完成后重启Tomcat,经过如下命令查看配置是否生效。css
1.首先查看Tomcat进程号html
ps -ef|grep java;进程号22222前端
2.经过进程号查看配置是否生效java
sudo jmap -heap 22222nginx
Tomcat的主要配置文件,该配置中包含不少元素service、host、connector等。web
<Server> <Listener /> <GlobaNamingResources> </GlobaNamingResources <Service> <Connector /> <Engine> <Logger /> <Realm /> <host> <Logger /> <Context /> </host> </Engine> </Service> </Server>
maxThreads 客户请求最大线程数,默认200shell
minSpareThreads Tomcat初始化时建立的 socket 线程数apache
maxSpareThreads Tomcat链接器的最大空闲 socket 线程数浏览器
minProcessors:最小空闲链接线程数,用于提升系统处理性能,默认值为 10
maxProcessors:最大链接线程数,即:并发处理的最大请求数,默认值为 75
acceptCount:容许的最大链接数,应大于等于 maxProcessors ,默认值为 100
enableLookups:是否反查域名,取值为: true 或 false 。为了提升处理能力,应设置为 false
redirectPort 在须要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
acceptAccount 监听端口队列最大数,满了以后客户请求会被拒绝(不能小于maxSpareThreads )
connectionTimeout:网络链接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。一般可设置为30000 毫秒。
URIEncoding URL统一编码
其中和最大链接数相关的参数为maxProcessors 和 acceptCount 。若是要加大并发链接数,应同时加大这两个参数。
<Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192" maxThreads="1000" minSpareThreads="100" maxSpareThreads="1000" minProcessors="100" maxProcessors="1000" enableLookups="false" URIEncoding="utf-8" acceptCount="1000" redirectPort="8443" disableUploadTimeout="true"/>
maxThreads 和acceptCount生效状况
maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100
状况1:接受一个请求,此时tomcat起动的线程数没有到达maxThreads,tomcat会起动一个线程来处理此请求。
状况2:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,tomcat会把此请求放入等待队列,等待空闲线程。
状况3:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,等待队列中的请求个数也达到了acceptCount,此时tomcat会直接拒绝这次请求,返回connection refused
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="800" acceptCount="1000"/>
强烈建议不要使用 Tomcat 的虚拟主机,推荐每一个站点使用一个实例。即,能够启动多个 Tomcat,而不是启动一个 Tomcat 里面包含多个虚拟主机。由于 Tomcat是多线程,共享内存,任何一个虚拟主机中的应用崩溃,都会影响到全部应用程序。虽然采用多实例的方式会产生过多的开销,但至少保障了应用程序的隔离和安全。
tomcat做为一个应用服务器,也是支持 gzip 压缩功能的。咱们能够在 server.xml 配置文件中的 Connector 节点中配置以下参数,来实现对指定资源类型进行压缩。
compression="on" # 打开压缩功能 compressionMinSize="50" # 启用压缩的输出内容大小,默认为2KB noCompressionUserAgents="gozilla, traviata" # 对于如下的浏览器,不启用压缩 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" # 哪些资源类型须要压缩
Tomcat 的压缩是在客户端请求服务器对应资源后,从服务器端将资源文件压缩,再输出到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程 HTML、CSS、Javascript和Text,它能够节省40% 左右的流量。更为重要的是,它能够对动态生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等输出的网页也能进行压缩,压缩效率也很高。可是, 压缩会增长 Tomcat 的负担,所以最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,将压缩的任务交由 Nginx/Apache 去作。
Tomcat是根据浏览器请求头中的accept-encoding来判断浏览器是否支持 压缩功能,若是这个值包含有gzip,就代表浏览器支持gzip压缩内容的浏览
AJP是为 Tomcat 与 HTTP 服务器之间通讯而定制的协议,能提供较高的通讯速度和效率。若是tomcat前端放的是apache的时候,会使用到AJP这个链接器。因为咱们公司前端是由nginx作的反向代理,所以不使用此链接器,所以须要注销掉该链接器。
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
server.xml中定义了能够直接关闭 Tomcat 实例的管理端口。咱们经过 telnet 链接上该端口以后,输入 SHUTDOWN (此为默认关闭指令)便可关闭 Tomcat 实例(注意,此时虽然实例关闭了,可是进程仍是存在的)。因为默认关闭 Tomcat 的端口和指令都很简单。默认端口为8005,指令为SHUTDOWN 。所以咱们须要将关闭指令修改复杂一点。
固然,在新版的 Tomcat 中该端口仅监听在127.0.0.1上,所以你们也没必要担忧。除非黑客登录到tomcat本机去执行关闭操做。
<Server port="8005" shutdow n="9SDKJ29jksjf23sjf0LSDF92JKS9DKkjsd">
通常公司的 Tomcat 都是放在内网的,所以咱们针对 Tomcat 服务的监听地址都是内网地址。
<Connector port="8080" address="172.16.100.1" />
默认 Tomcat 是开启了对war包的热部署的。为了防止被植入木马等恶意程序,所以咱们要关闭自动部署。
<Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false">
1.配置Tomcat运行内存;2.利用缓存和压缩《利用nginx加速web访问》;3.采用集群《利用nginx+tomcat+memcached组建web服务器负载均衡》4.Tomcat的参数优化;5.改用APR库
tomcat默认采用的BIO模型,在几百并发下性能会有很严重的降低。tomcat自带还有NIO的模型,另外也能够调用APR的库来实现操做系统级别控制。
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改成
<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol " connectionTimeout="20000" redirectPort="8443" />
NIO模型是内置的,调用很方便,只须要将上面配置文件中protocol修改为org.apache.coyote.http11.Http11NioProtocol,重启便可生效。上面配置我已经改过了,默认的是HTTP/1.1。
APR则须要安装第三方库,在高并发下会让性能有明显提高。
Tomcat的四种基于HTTP协议的Connector性能比较
<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443"/> <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> <Connector executor="tomcatThreadPool" port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector executor="tomcatThreadPool" port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" />
Connector按照顺序命名为 NIO, HTTP, POOL, NIOP
NIO HTTP POOL NIOP
281 | 65 | 208 | 365 |
666 | 66 | 110 | 398 |
692 | 65 | 66 | 263 |
256 | 63 | 94 | 459 |
440 | 67 | 145 | 363 |
服务器上不要安装JDK,请使用 Server JRE. 服务器上根本不须要编译器,代码应该在Release服务器上完成编译打包工做。
理由:一旦服务器被控制,能够防止在其服务器上编译其余恶意代码并植入到你的程序中。
1. 禁用Tomcat管理页面,删除webapps下面的全部代码,删除conf/Catalina/localhost/下的host-manager.xml和manager.xml这两个文件。
rm -rf /srv/apache-tomcat/webapps/*
2. 注释或删除 tomcat-users.xml 全部用户权限
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> </tomcat-users>
3. 隐藏Tomcat版本信息
<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"/>
4. 启动用户与端口
建立一个用户,这个用户只用于启动Tomcat
groupadd -g 80 daemon adduser -o --home /daemon --shell /sbin/nologin --uid 80 --gid 80 -c "Web Server" daemon
chown daemon:daemon -R /srv/* su - daemon -c "/srv/apache-tomcat/bin/startup.sh"
应用程序的部署和Tomcat启动不能使用同一用户(tomcat被植入web shell程序时,不能建立或编辑应用程序目录下任何内容)
5. 关闭自动部署
unpackWARs="false" autoDeploy="false";防止被植入木马等恶意程序
6. JSESSIONID
修改 Cookie 变量 JSESSIONID, 这个cookie 是用于维持Session关系。建议你改成PHPSESSID。
7. 超时自动退出
查看tomcat配置文件server.xml是否有设置connectionTimeout值,设置帐户自动登出。
session超时失效设置
<session-config> <session-timeout>30</session-timeout> </session-config>
8. 自定义错误页面
<error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> <error-page> <error-code>500</error-code> <location>/500.html</location> </error-page>
9. 禁止列目录(高版本默认已禁止)
编辑tomcat/conf/web.xml配置文件
<init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param>
当WEB目录中没有默认首页如index.html,index.jsp等文件时,不会列出目录内容,直接访问http://ip:8800/webadd。
10. 配置httponly
可在conf/context.xml配置文件中配置
<Context useHttpOnly="true"></context>
而且修改tomcat/conf/web.xml配置文件
<session-config> <session-timeout>30</session-timeout> <cookie-config> <http-only>true</http-only> </cookie-config> </session-config>
11. 配置cookie加密传输
在web.xml中sesion-config节点配置cookie-config中secure属性,此配置只容许cookie在加密方式下传输。只有当使用https协议链接时cookie才能够被页面访问.
<session-config> <session-timeout>30</session-timeout> <cookie-config> <http-only>true</http-only> <secure>true</secure> </cookie-config> </session-config>
12. HTTPS加密协议
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" />