Nginx服务器Linux内核的优化(摘抄)

默认的Linux内核参数考虑的是最通用场景,不符合用于支持高并发访问的Web服务器的定义,根据业务特点来进行调整,当Nginx作为静态web内容服务器、反向代理或者提供压缩服务器的服务器时,内核参数的调整都是不同的,此处针对最通用的、使Nginx支持更多并发请求的TCP网络参数做简单的配置,修改/etc/sysctl.conf来更改内核参数

net.ipv4.ip_nonlocal_bind = 1
#作为负载均衡服务器一定要开启(LVS、haproxy、nginx),允许某个服务监听在本机所没有的IP地址的端口上,如LVS的vip;作为负载均衡服务器不开启此参数,则服务是无法起来的。

net.ipv4.ip_forward = 1
#开启ipv4转发功能,用于跨网段转发;负载均衡服务器一定要开启。

net.ipv4.tcp_timestamps = 0
#给报文添加时间戳,会对添加时间戳的报文做校验;作为web服务器可开启,作为负载均衡服务器一定要关闭。一个局域网内,都是用一个公网IP,如果访问一个网站的index.html资源,负载均衡服务器处理完一个请求后,又有第二个相同的IP访问相同网站的index.html,这时负载均衡服务器会把第二个报文校验完毕后,发现IP和请求的资源一致,会把报文抛弃掉,所以作为负载均衡服务器必须关闭此参数。

net.ipv4.tcp_tw_reuse = 0
#端口复用;依赖于net.ipv4.tcp_timestamps参数,如果net.ipv4.tcp_timestamps开启,则net.ipv4.tcp_tw_reuse生效,如果没开启,则此参数也不生效。
#参数设置为 1 ,表示允许将TIME_WAIT状态的socket重新用于新的TCP链接,这对于服务器来说意义重大,因为总有大量TIME_WAIT状态的链接存在;用于TCP连接。

net.ipv4.tcp_tw_recycle = 0
#快速回收TIME_WAIT状态,用于大量TIME_OUT场景;依赖于net.ipv4.tcp_timestamps参数。
#这个参数用于设置启用timewait快速回收;开启后,用户如果正在看网页,过会儿再点,会发现断开连接,会重新TCP三次握手建立连接。

fs.file-max = 1000000
#表示单个进程最多可以打开的文件描述符的数量。

net.ipv4.tcp_keepalive_time = 600
#当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可更快的清理无效链接。

net.ipv4.tcp_fin_timeout = 30
#当服务器主动关闭链接时,socket保持在FIN_WAIT_2状态的较大时间。

net.ipv4.tcp_max_tw_buckets = 5000
#表示操作系统允许TIME_WAIT套接字数量的较大值,如超过此值,TIME_WAIT套接字将立刻被清除并打印警告信息,默认为8000,过多的TIME_WAIT套接字会使Web服务器变慢。

net.ipv4.ip_local_port_range = 1024 65000
#定义UDP和TCP链接的本地端口的取值范围。

net.ipv4.tcp_rmem = 10240 87380 12582912
#定义了TCP接受socket请求缓存的内存最小值、默认值、较大值。

net.ipv4.tcp_wmem = 10240 87380 12582912
#定义TCP发送缓存的最小值、默认值、较大值。

net.core.netdev_max_backlog = 8096
#当网卡接收数据包的速度大于内核处理速度时,会有一个列队保存这些数据包。这个参数表示该列队的较大值。

net.core.rmem_default = 6291456
#表示内核套接字接受缓存区默认大小。

net.core.wmem_default = 6291456
#表示内核套接字发送缓存区默认大小。

net.core.rmem_max = 12582912
#表示内核套接字接受缓存区较大大小。

net.core.wmem_max = 12582912
#表示内核套接字发送缓存区较大大小。
注意:以上的四个参数,需要根据业务逻辑和实际的硬件成本来综合考虑。

net.ipv4.tcp_syncookies = 1
#与性能无关。用于解决TCP的SYN攻击。

net.ipv4.tcp_max_syn_backlog = 8192
#这个参数表示TCP三次握手建立阶段接受SYN请求列队的较大长度,默认1024,将其设置的大一些可使出现。
Nginx繁忙来不及accept新连接时,Linux不至于丢失客户端发起的链接请求。

net.core.somaxconn = 262114
#选项默认值是128,这个参数用于调节系统同时发起的TCP连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此需要结合高并发请求数来调节此值。

net.ipv4.tcp_max_orphans=262114
#选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立链接将立即被复位并输出警告信息。这个限制指示为了防止简单的DOS攻击,不用过分依靠这个限制甚至认为的减小这个值,更多的情况是增加这个值。

关于内核参数的优化:
net.ipv4.tcp_max_tw_buckets = 6000
timewait的数量,默认是180000。
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 秒,
2 你可以按这个设置,但要记住的是,即使你的机器是一个轻载的 WEB 服务器,也有因为大
量的死套接字而内存溢出的风险,FIN- WAIT-2 的危险性比FIN-WAIT-1 要小,因为它最多只
能吃掉1.5K内存,但是它们的生存期长些。
net.ipv4.tcp_keepalive_time = 30
当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2 小时。

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter =1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000 #timewait的数量
net.ipv4.tcp_sack = 1 #有选择的应答
net.ipv4.tcp_window_scaling = 1 #设置tcp/ip会话滑动窗口是否可变,1可变,0不可变。开启使滑动窗口大小增加数个数量级,提高数据传输能力
net.ipv4.tcp_rmem = 4096 87380 4194304 #tcp接收缓冲区
net.ipv4.tcp_wmem = 4096 16384 4194304 #tcp发送缓冲区
net.core.wmem_default = 8388608 #发送套接字缓冲区大小的缺省值(字节单位)
net.core.rmem_default = 8388608 #接收套接字缓冲区大小的缺省值
net.core.rmem_max = 16777216 #接收套接字缓冲区大小的最大值
net.core.wmem_max = 16777216 #发送套接字缓冲区大小的最大值
net.core.netdev_max_backlog = 262144 #允许送到队列的数据包最大数目
net.core.somaxconn = 262144 #web应用中listen函数的backlog(积压)
net.ipv4.tcp_max_orphans = 3276800 #最多有多少个TCP套接字不被关联到任何一个用户的句柄上
net.ipv4.tcp_max_syn_backlog = 262144 #记录那些尚未收到客户端确认信息的连接请求最大值,表示SYN队列的长度,可以容纳更多等待连接的网络连接数
net.ipv4.tcp_timestamps = 0 #时间戳关闭
net.ipv4.tcp_synack_retries = 1 #这个设置决定了内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_syn_retries = 1 #内核放弃连接之前发送SYN包的数量
net.ipv4.tcp_tw_recycle = 1 #timewait快速回收
net.ipv4.tcp_tw_reuse = 1 #timewait 用于新的连接
net.ipv4.tcp_mem = 1835008 2752512 3670016 #out of socket memory
net.ipv4.tcp_fin_timeout = 15 #保持在FIN-WAIT-2状态的时间,对端出错永不关闭甚至当机缺省值是60s
net.ipv4.tcp_keepalive_time = 30 #keepalived 发送消息的频度
net.ipv4.ip_local_port_range = 1024 65000 #端口范围

#以下可能需要加载ip_conntrack模块 modprobe ip_conntrack ,有文档说防火墙开启情况下此模块失效
#缩短established的超時時間

net.netfilter.nf_conntrack_tcp_timeout_established = 180

#CONNTRACK_MAX 允许的最大跟踪连接条目,是在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目)

net.netfilter.nf_conntrack_max = 1048576

net.nf_conntrack_max = 1048576

执行生效:/sbin/sysctl -p

一般来说nginx配置文件中对优化比较有作用的为以下几项:
worker_processes 8;
3 nginx进程数,建议按照cpu数目来指定,一般为它的倍数。
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000
01000000 10000000;
为每个进程分配 cpu,上例中将 8 个进程分配到 8 个 cpu,当然可以写多个,或者将一
个进程分配到多个cpu。
worker_rlimit_nofile 102400;
这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文
件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit
-n的值保持一致。
use epoll;
使用epoll的I/O模型,这个不用说了吧。
worker_connections 102400;
每个进程允许的最多连接数,理论上每台 nginx 服务器的最大连接数为
worker_processes*worker_connections。
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 时间内一次没被使用,
它将被移除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值