Nginx、Tomcat线上环境优化配置

Nginx优化:

Nginx安全方面的优化:

1. nginx安全优化,在nginx配置文件http标签段内添加“server_tokens  off”即可隐藏访问或者报错时提示web版本号信息。

2. server_tokens参数可以在http,server,location的位置添加

3. 还可以修改nginx的3个源码文件

4. 如还需要安全优化更改端口、用户。


nginx 性能优化:

对于nginx配置文件中对优化比较有作用的一般为以下几项:


worker_processes 8;

补充:(nginx有master和worker进程之分master为管理进程,worker数的设置可以等于CPU的核数,CPU个数查看命令grep -c  processor  /proc/cpuinfo 

查看CPU总颗数:grep  'physical  id'  /proc/cpuinfo|sort|uniq|wc -l  在执行top按1)


nginx进程数,建议按照cpu数目来指定,一般为它的倍数。

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;     (后面的数根据CPU得核数来定义比如四核、八核等)

为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。

压测命令:webbench  -c  20000  -t  180  http://web 地址)


worker_rlimit_nofile 102400;

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。


use epoll; 

nginx事件处理模型优化

在Linux下,nginx使用epoll的I/O多路复用模型

在events标签下,使用epoll的I/O模型,这个我就不用多说了吧。

注意:事件处理模型参数需要在events区块配置


worker_connections 102400;

调整Nginx单个进程允许客户端的最大连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。

注意:需要在events区块添加


keepalive_timeout 60;

设置客户端连接保持回话超时时间

keepalive超时时间。


client_header_buffer_size 4k;

客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。


open_file_cache max=102400 inactive=20s;

这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。


open_file_cache_valid 30s;

这个是指多长时间检查一次缓存的有效信息。


open_file_cache_min_uses 1;

open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例说述:如果有一个文件在inactive时间内一次没被使用,它将被移除。


关于内核参数的优化:

 

net.ipv4.tcp_max_tw_buckets = 6000

 

timewait的数量,默认是180000。(Deven:因此如果想把timewait降下了就要把tcp_max_tw_buckets值减小)

 

net.ipv4.ip_local_port_range = 1024     65000

 

允许系统打开的端口范围。

 

net.ipv4.tcp_tw_recycle = 1

 

启用timewait快速回收。

 

net.ipv4.tcp_tw_reuse = 1

 

开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。

 

net.ipv4.tcp_syncookies = 1

 

开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。

 

net.core.somaxconn = 262144

 

web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。

 

net.core.netdev_max_backlog = 262144

 

每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

 

net.ipv4.tcp_max_orphans = 262144

 

系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS***,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。

 

net.ipv4.tcp_max_syn_backlog = 262144

 

记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。

 

net.ipv4.tcp_timestamps = 0

 

时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。

 

net.ipv4.tcp_synack_retries = 1

 

为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

 

net.ipv4.tcp_syn_retries = 1

 

在内核放弃建立连接之前发送SYN包的数量。

 

net.ipv4.tcp_fin_timeout = 1

 

果套接字由本端要求关闭,这个参数 决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

 

net.ipv4.tcp_keepalive_time = 30

 

keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。

对于一个完整的系统内核优化配置请大家观看我之前的博客文档名为:centos7 系统内核优化。



下面是一个比较简单的Nginx配置文件的优化:


引用

user   www www;

worker_processes 8;

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;

error_log   /www/log/nginx_error.log   crit;

pid         /usr/local/nginx/nginx.pid;

worker_rlimit_nofile 204800;

 

events

{

   use epoll;

   worker_connections 204800;

}

 

http

{

   include       mime.types;

   default_type   application/octet-stream;

 

   charset   utf-8;

 

   server_names_hash_bucket_size 128;

   client_header_buffer_size 2k;

   large_client_header_buffers 4 4k;

   client_max_body_size 8m;

 

   sendfile on;

   tcp_nopush     on;

 

   keepalive_timeout 60;

 

   fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2

                 keys_zone=TEST:10m

                 inactive=5m;

   fastcgi_connect_timeout 300;

   fastcgi_send_timeout 300;

   fastcgi_read_timeout 300;

   fastcgi_buffer_size 16k;

   fastcgi_buffers 16 16k;

   fastcgi_busy_buffers_size 16k;

   fastcgi_temp_file_write_size 16k;

   fastcgi_cache TEST;

   fastcgi_cache_valid 200 302 1h;

   fastcgi_cache_valid 301 1d;

   fastcgi_cache_valid any 1m;

   fastcgi_cache_min_uses 1;

   fastcgi_cache_use_stale error timeout invalid_header http_500;  

   open_file_cache max=204800 inactive=20s;

   open_file_cache_min_uses 1;

   open_file_cache_valid 30s;  

 

   tcp_nodelay on;

  

   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;

 

   server

   {

     listen       8080;

     server_name   backup.aiju.com;

     index index.php index.htm;

     root   /www/html/;

 

     location /status

     {

         stub_status on;

     }

 

     location ~ .*\.(php|php5)?$

     {

         fastcgi_pass 127.0.0.1:9000;

         fastcgi_index index.php;

         include fcgi.conf;

     }

 

     location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$

     {

       expires       30d;

     }

 

     log_format   access   '$remote_addr - $remote_user [$time_local] "$request" '

               '$status $body_bytes_sent "$http_referer" '

               '"$http_user_agent" $http_x_forwarded_for';

     access_log   /www/log/access.log   access;

       }

}

如上是一个比较完整的Nginx优化配置。大家可以直接使用,不建议照搬使用。


关于FastCGI的几个指令:


fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;

这个指令为FastCGI缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动删除时间。

 

fastcgi_connect_timeout 300;

指定连接到后端FastCGI的超时时间。

 

fastcgi_send_timeout 300;

FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。

 

fastcgi_read_timeout 300;

接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。


fastcgi_buffer_size 16k;


fastcgi_buffers 16 16k;


fastcgi_busy_buffers_size 32k;   ###默认值是fastcgi_buffers的两倍。


fastcgi_temp_file_write_size 32k;

在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍。


fastcgi_cache TEST

开启FastCGI缓存并为其制定一个名称。自己感觉开启缓存还是非常有用的,可以有效降低CPU负载,并且可以防止502报错。注意:开启这个缓存可能会引起很多问题。因为它缓存的是动态页面。具体使用情况还需根据自己的真实需求而定。


fastcgi_cache_valid 200 302 1h;

fastcgi_cache_valid 301 1d;

fastcgi_cache_valid any 1m;

如上配置是为了指定的应答代码指定缓存时间。


fastcgi_cache_min_uses 1;

缓存在fastcgi_cache_path指令inactive参数值时间内的最少使用次数。解释:如果在5分钟内某文件1次也没有没使用过,那么这个文件将会被移除。


fastcgi_cache_use_stale error timeout invalid_header http_500;


以上为Nginx中fastCGI的相关参数,fastCGI自身也有一些配置需要进行优化,例如你使用的为php-fpm来管理,可以修改配置文件中的如下值:


60  

 ###同时处理的并发请求,即开启最多60个子进程来处理。


102400 

最多打开文件数。


204800

每个进程在重置之前能够执行的最大请求数。

以上为Nginx的优化,下面来看Tomcat的配置优化。



优化tomcat配置:

Tomcat有很多方面,我们可以从内存、并发、缓存几个方面优化:


一.Tomcat内存优化

Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 java_OPTS 参数。

JAVA_OPTS参数说明

-server 启用jdk server 版;

-Xms Java虚拟机初始化时的最小内存;

-Xmx java虚拟机可使用的最大内存;

-XX: PermSize 内存永久保留区域

-XX:MaxPermSize 内存最大永久保留区域 

服务器参数配置


例如:现公司服务器内存一般可以加到最大2G ,可以采取以下配置:

 

JAVA_OPTS=-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m


配置完成后可重启Tomcat,可以通过以下命令进行查看配置是否生效:

查看Tomcat进程号:

lsof -i:9027

可以看到Tomcat进程号为12222.

查看是否配置生效:

sudo jmap heap 12222

可以看到maxheapsize等参数已经生效。


.Tomcat并发优化

1.Tomcat连接相关参数

 

Tomcat 配置文件 server.xml 中的

"

protocol="HTTP/1.1"

maxHttpHeaderSize="8181"

minProcessors="100"

maxProcessors="1000"

acceptCount="1000"

redirectPort="8443"

disableUploadTimeout="true"/>

 

2.调整连接器connector的并发处理能力


1>参数说明

maxThreads 客户请求最大线程数

minSpareThreads Tomcat初始化时创建的 socket 线程数

maxSpareThreads Tomcat连接器的最大空闲 socket 线程数

enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名

redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL redirectPort 端口

acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads

connectionTimeout 连接超时

minProcessors 服务器创建时的最小处理线程数

maxProcessors 服务器同时最大处理线程数

URIEncoding URL统一编码

 

2>Tomcat中的配置:

"

protocol="HTTP/1.1"

maxHttpHeaderSize="8181"

maxThreads="1000"

minSpareThreads="100"

maxSpareThreads="1000"

minProcessors="100"

maxProcessors="1000"

enableLookups="false"

URIEncoding="utf-8"

acceptCount="1000"

redirectPort="8443"

disableUploadTimeout="true"/>

 

3.Tomcat缓存优化

1>参数说明

c ompression 打开压缩功能

compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB

compressableMimeType 压缩类型

connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间

 

2>Tomcat中的配置示例

"

protocol="HTTP/1.1"

maxHttpHeaderSize="8181"

maxThreads="1000"

minSpareThreads="100"

maxSpareThreads="1000"

minProcessors="100"

maxProcessors="1000"

enableLookups="false"

compression="on"

compressionMinSize="2048"

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

connectionTimeout="20000"

URIEncoding="utf-8"

acceptCount="1000"

redirectPort="8443"

disableUploadTimeout="true"/>


如下是一个Tomcat的配置参考:

4.参考配置

1>旧有的配置

  参考网络对服务器做过如下配置:

"

protocol="HTTP/1.1"

maxHttpHeaderSize="8181"

maxThreads="1000"

minSpareThreads="25"

maxSpareThreads="75"

enableLookups="false"

compression="on"

compressionMinSize="2048"

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

connectionTimeout="20000"

URIEncoding="utf-8"

acceptCount="200"

redirectPort="8443"

disableUploadTimeout="true" />

后来发现在访问量达到3 百万多的时候出现性能出现了瓶颈。

 

2>更改后的配置

"

protocol="HTTP/1.1"

maxHttpHeaderSize="8181"

maxThreads="1000"

minSpareThreads="100"

maxSpareThreads="1000"

minProcessors="100"

maxProcessors="1000"

enableLookups="false"

compression="on"

compressionMinSize="2048"

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

connectionTimeout="20000"

URIEncoding="utf-8"

acceptCount="1000"

redirectPort="8443"

disableUploadTimeout="true"/>

以上为Tomcat的配置优化的几个方面。希望可以帮到大家!谢谢!