Nginx和Tomcat调优

一、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)。因此证明参数的配置非常有用,可以提高服务器的稳定性和性能。

原文地址:https://www.cnblogs.com/zeussbook/p/12882743.html