nginx优化和内核优化

nginx配置参数优化:

全局部分:

  1. worker_processes
    表示启用几个nginx工作进程,一般跟服务器cpu核数对应比较好。

  2. worker_rlimit_nofile

    表示nginx启用的最大描述符数量,需要配合系统的描述符数量,建议设置为102400。
    查看系统描述符数量:

     ulimit -n
     65535   #这个是我百度云服务器的默认参数,

查看描述符:

lsof -c nginx|grep -i ipv4

怎么修改这个内核参数呢:
编辑配置文件:

vim /etc/security/limits.conf

修改参数:

root soft nofile 655350   #改成了655350,自己定义。
  root hard nofile 655350
 \* soft nofile 655350
 \* hard nofile 655350

重启系统。查看

ulimit -n
655350

events部分:

  1. use epoll :#epoll是nginx事件驱动模型,linux系统最优选择。
  2. worker_connections:定义每个
    worker_processes的最大连接数,和它的乘积就是总的连接数,该参数建议设置为10240。

http部分

  1. multi_accept on:开启表示同时处理多个客户端请求,高并发。
  2. sendfile on:开启的话,表示使用内核的fd文件传输功能,要不然传输过程就是user-》内核-》另一个user-》内核,很浪费服务器性能,开启的话,可以减少user mode 和kernel mode之间的切换。
  3. tcp_nopush on:设置为on的话,会调用tcp_cork进行数据传输。效果为:当应用程序产生数据,内核并不会马上封装包,而是积累到一定量时一起传输。
  4. tcp_nodelay:定义为on,会关闭nagle算法,提高小数据传输的实时性。negle算法:当数据太小了,比如说几k,它就会先把数据放到缓存里,等待被发送的包确认了之后,才会发送,nagle可以较少网络里小数据包的数量,提高网络性能。
  5. keepalive_timeout:定义长连接的超时时间,建议30s。
  6. keepalive_requests,当客户端和服务端处于长连接下,每个客户端最多可以请求多少次,可以设置成很大,比如5000。
  7. reset_timeout_connection on:设置为on时,当客户端不再向服务端发送数据时,允许服务端关闭连接。
  8. client_body_timeout :当客户端没有在指定时间内传输完body数据,服务端就会断开连接。默认60,可以设置为10,单位s。
  9. send_timeout:当服务端发送数据,客户端并没有接收,则服务端会关闭连接。设置超时时间,看访问量设置,如果很大的话,可以设置为3,单位s。
  10. client_body_buffer_size:当客户端向服务端提交的请求为post时,服务端先把数据放到client_body_buffer中,写满了之后才会放到临时文件中。这个参数可以根据内存设置的,比如我2G的内存,可以设置为256k,或者更大一些。
  11. client_max_body_size:当浏览器发送含有较大http body的请求时,头部会有一个content-Length字段,client_max_body_size就是用来限制它的,不用等nginx接收完包体,就可以告诉用户请求过大,返回413状态码。将该数值设置为0,则表示禁用限制。
  12. client_header_buffer_size:设置客户端header的buffer大小,建议4k。
  13. large_client_header_buffers:对于比较大的header将会使用该部分buffer,两个数值,第一个是个数,第二个是每个buffer的大小。
  14. open_file_cache:格式 open_file_cache max=size inactive=time;max设定缓存文件的数量,inactive设定经过多长时间没被请求后删除缓存。open_file_cache max=102400 inactive=20s;该参数会对以下信息进行缓存:
    打开文件描述符的文件大小和修改时间信息;
    存在的目录信息;
    搜索文件的错误信息(文件不存在无权限读取等信息)。
  15. open_file_cache_valid:指多长时间检查一次缓存的有效信息。建议设置为30s。
  16. open_file_cache_min_users:open_file_cache指定中的inactive参数时间内文件的最少使用次数,如将该参数设置为1,则表示,如果文件在inactive时间内一次都内杯使用,它将被移除。建议设置为2.
  17. gzip on:开启gzip功能。
  18. gzip_min_length 1024:设置请求资源超过该数值才进行压缩,单位字节
  19. gzip_buffers 16 8k;设置压缩使用的buffer大小,第一个为数量,第二个为每个buffer的大小。
  20. gzip_comp_level 6;设置压缩的机别,范围1-9。
  21. gzip_types text/plain application/x-javascript text/css text/htm application/xml image/jpeg image/gif image/png;指定压缩文件类型。
  22. gzip_disable “MSIE 6.”;ie6浏览器不启用压缩。

静态文件过期:
对于静态文件,需要设置一个过期时间,这样可以让这些资源缓存到客户端浏览器上,在缓存为失效前,客户端不再向服务端请求添加相同的资源,从而节省带宽和资源。
配置需要在虚拟主机里面添加,配置如下:

 location ~* ^.+\.(gif|jpg|png|css|js)$
       {
           expires 1d;
      }

ssl优化:
适当减少worker_processes数量,因为ssl功能需要使用cpu的计算。
使用长连接,因为每次建立ssl会话,都会耗费一定的资源(加密、解密)
开启ssl缓存,简化服务端和客户端的“握手过程”。

ssl_session_cache shared:SSL:10m; //缓存为10m
ssl_session_timeout 10m;//会话超时时间为10分钟

nginx之系统内核参数优化:

以下配置都可以在/etc/sysctl.conf配置
sysctl -p生效

  1. net.ipv4.tcp_max_tw_buckets
    对于tcp连接,当服务端和客户端通信完成之后状态就会变成timewait,假如某台服务器非常繁忙,连接数非常多的话,那么这个值就会越来越大。
    就应该设置一个数值,当超过这个数值,系统就会删除最早的连接。
    centos7中可以用命令sysctl -a|grep tw_buckets来查看它的值。
   sysctl -a|grep tw_buckets
    net.ipv4.tcp_max_tw_buckets = 8192  #我的默认值为8192

查看time_wait:

ss -an
  1. net.ipv4.tcp_tw_recycle = 1
    该参数的作用是快速回收timewait状态的连接,上面是删除,但是回收的话就可以再利用,和下面的参数一起使用:
    net.ipv4.tcp_tw_reuse =1 //这个参数表示重新用于新的连接。
  2. net.ipv4.tcp_syncookies = 1
    tcp三次握手中,客户端向服务器发起syn请求,服务端收到后,也会给客户端发起syn请求同时连带ack确认,假如客户端发送请求后直接断开连接和服务端的连接,不接收服务端发起的这个请求,服务端会重试多次,这个重试的过程会持续一段时间(通常高于30s),当这种状态连接量非常大时,服务器会消耗很大的资源,从而造成瘫痪。
    正常的连接进不来,这种恶意的半连接行为叫做syn flood攻击。
    开启该参数后,服务端接收客户端的ack后,再向客户端附送ack+syn之前会要求client在短时间内回应一个序号,如果客户端不能提供序号或者提供的序号不会,则认为不合法,不会发syn+ack给客户端,更不会重试。
  3. net.ipv4.tcp_max_syn_backlog
    该参数定义系统能接受的最大半连接的tcp连接数,客户端发送了syn之后,服务端会记录以下,该参数决定最多记录多少个,在centos7中,默认256,当有syn flood攻击时,这个数值太小则很容易导致服务器瘫痪,实际上此时并没有消耗太多服务器的资源,所以可以适当调大一些,比如30000。
  4. net.ipv4.tcp_syn_retries

该参数适用于客户端,它定义发起syn的最大重试次数,默认为6,建议为2。

  1. net.ipv4.tcp_synack_retries

该参数适用于服务端,它定义发起syn+ack的最大重试次数,默认为5,建议改为2,可以适当预防syn flood攻击。

  1. net.ipv4.ip_local_port_range

该参数定义端口范围,系统默认保留端口为1024及以下,以上部分为自定义端口,这个参数适用于客户端。当客户端和服务端建立连接时,不如说访问服务端的80端口,客户端随机开启了一个端口和服务端发起连接,默认为32768-61000,建议调整1050-61000.

  1. net.ipv4.tcp_fin_timeout

tcp连接的状态中,客户端上有一个时fin-wait-2状态,它是状态变迁为timewait前一个状态。该参数定义不属于任何进程的超时时间,默认值为60,建议调整为6.

  1. net.ipv4.tcp_keepalive_time

tcp连接状态里,有一个时established状态,只有在这个状态下,客户端和服务端才能通信。正常情况下,当通信完毕,客户端或服务端会告诉对方要关闭连接,此状态就会变成timewait,如果客户端没有告诉服务端,并且服务端也没有告诉客户端关闭的话(比如,客户端断网),此时需要改参数来判定。就需要每隔一段时间去发一个探测包去确认。默认7200秒,建议设置30s。

  1. net.ipv4.tcp_keepalive_intvl

该参数和上面参数是一起的,服务端在规定时间内发起了探测,查看客户端是否在线,如果客户端没有却惹,此时服务端还不能认定为对方不在线,而是要尝试多次,该参数定义重新发送探测的时间,即第一次发现对方有问题后,过多久再次发起探测。默认为75,可以改为3秒。

  1. net.ipv4.tcp_keepalive_proves

该参数是上面两个参数的补充,之前规定了合适发起探测和探测多久后再次发起探测,但并没有定义一共探测几次才算结束。该参数定义了发起探测包的数量,默认为9,建议设置为2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值