一、Nginx和Tomcat定义
tomcat 是一个中间件,在B/S架构中,浏览器发出的http请求经过tomcat中间件,转发到最终的目的服务器上,响应消息再通过tomcat返回给浏览器。tomcat更多用来做一个应用容器,让java web跑在里面的东西。
nginx 常用做静态内容服务和反向代理服务器,以及页面前端高并发服务器。适合做负载均衡,直面外来请求转发给后面的应用服务(tomcat什么的)。
nginx+tomcat响应速度明显要低于直接请求tomcat,性能不如直接请求tomcat,但是nginx由于多了中间一层转发,使得请求压力不会一次性都集中在tomcat上,因此nginx+tomcat的CPU明显低于直接请求tomcat,也大大避免了因请求量过大导致tomcat服务不可用。
单点tomcat在不使用nginx的情况下,能承载的最多也就是200-300的并发量,而加上了nginx之后,能大幅度提升服务器的并发承载量,不仅仅是因为nginx可以做负载均衡(load-banlance),更重要的是nginx可以让请求进行排队,而不是将压力赋予给tomcat,这样tomcat可以更加专注地完成业务操作,从而提高性能。
二、Nginx调优
这里只说nginx的简单优化,即让nginx处理html静态文件,图片,css,js等非动态文件,动态文件交给tomcat处理,这样的话可以减轻tomcat的压力,再说对于这些静态文件来说,不是tomcat的强项,而是nginx的强项。
2.1 静态资源配置
请在nginx.conf中添加如下配置
location ~ .*\.(gif|jpg|jpeg|png|bmp|ico)$ { root /www/; #即图片存在的根路径 expires 30d;#缓存时间 } location ~ .*\.(js|css)?$ { root /www/;#即图文件存在的根路径 expires 10h;#缓存时间
}
2.2 进程数的优化
一般nginx中,进程数一般设置为服务器cpu核数的倍数,例如:CPU为双核,则设置进程数目为4或者8,每个nginx进程消耗的内存10兆的模样
worker_processes 8;
2.3 将进程分配给制定CPU
假如是8核 cpu 分配如下:
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
2.4 Nginx最大打开文件数
当使用linux时,最大文件打开数是有限制的。在linux中可使用ulimit –n来查看最大文件打开数,一般设置值为系统最大文件打开数除以最大进程数,但是大多数都是除不尽,导致资源分配不均匀,所以最好与最大进程数一致
worker_rlimit_nofile 655350;
2.5 Nginx的事件模型
使用epoll 的I/O 模型
use epoll;
补充说明:
与apache相类,nginx针对不同的操作系统,有不同的事件模型
A)标准事件模型
Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
B)高效事件模型
Kqueue:使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD2.0 和 MacOSX. 使用双处理器的MacOSX系统使用kqueue可能会造成内核崩溃。
Epoll: 使用于Linux内核2.6版本及以后的系统。
/dev/poll:使用于 Solaris 7 11/99+, HP/UX 11.22+(eventport), IRIX 6.5.15+ 和 Tru64UNIX 5.1A+。
Eventport:使用于 Solaris 10. 为了防止出现内核崩溃的问题,有必要安装安全补丁。
2.6 最大连接数
每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。
worker_connections 655350;
2.7 超时时间
设置超时时间,默认的是60s,Nginx会自动踢出超时的连接,保持可用性。
keepalive_timeout 90;
2.8 客户端请求头部缓冲区大小
客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页小。
在Linux中,使用getconf PAGESIZE 来获得,并设置给nginx
client_header_buffer_size4k;
打开文件缓存大小
这个默认是没有开启的,此参数将为打开文件指定缓存大小
open_file_cachemax=65535 inactive=60s;
open_file_cachemax为最大缓存大小,inactive为缓存多久没使用就进行回收
2.9 检查缓存有效信息时间
open_file_cache_valid80s;
open_file_cache_min_uses1;
open_file_cache 指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
2.10 开启gzip
gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on;
nginx的5种负载均衡算法请跟进自身业务需要选择,此处不做阐述。
三、Tomcat调优
3.1 基础参数设置
在server.xml中配置
maxThreads:Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。
acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
connnectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
minSpareThreads:Tomcat初始化时创建的线程数。
maxSpareThreads:一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程
3.2 Tomat的4种连接方式对比
tomcat默认的http请求处理模式是bio(即阻塞型,下面第二种),每次请求都新开一个线程处理。下面做一个介绍
<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
得出结论:NIOP > NIO > POOL > HTTP 虽然Tomcat默认的HTTP效率最低,但是根据测试次数可以看出是最稳定的。且这只是一个简单页面测试,具体会根据复杂度有所波动。
配置参考:Linux系统每个进程支持的最大线程数是1000,windos是2000。具体跟服务器的内存,Tomcat配置的数量有关联。
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="500" minSpareThreads="25" maxSpareThreads="250" enableLookups="false" redirectPort="8443" acceptCount="300" connectionTimeout="20000" disableUploadTimeout="true"/>
3.3 Tomcat的集群
Tomcat的部署,是一台服务器部署一个Tomcat(上线多个项目),还是一台服务器部署多个tomact(每个tomcat部署1~n个项目)。多核必选配置多个Tomcat,微服务多线程的思想模式。
3.4 Tomcat内存设置
修改/bin/catalina.sh,增加如下设置:
JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'
需要把这个两个参数值调大,大小的可以根据服务器内存的大小进行调整。例如:
JAVA_OPTS='-Xms1024m –Xmx2048m'
服务器是8G 内存,跑了3个tomcat服务,给分配了2G的内存,因为还有其他进程。
以8核16G的服务器为例,服务器单点原本没配置优化参数,服务器承载量为1000个并发量,配置成功后,服务器动态并发访问为3000,按照并发适度冗余的原则同时在线用户为(3000/0.15=20000)。因此证明参数的配置非常有用,可以提高服务器的稳定性和性能。