Nginx

Nginx

八月 08, 2019

Nginx调优

一、Nginx调优选项参数

1.worker_processes

1
2
3
worker_processes 8;
nginx进程数,建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍
数。

2.worker_cpu_affinity

1
2
3
4
worker_cpu_affinity 00000001 00000010 00000100 00001000
00010000 00100000 01000000 10000000;
为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或
者将一个进程分配到多个cpu。

3.worker_rlimit_nofile

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

4.use epoll;

1
2
use epoll;
使用epoll的I/O模型,用这个模型来高效处理异步事件

5.accept_mutex

1
2
3
accept_mutex on;
优化同一时刻只有一个请求而避免多个睡眠进程被唤醒的设置,on为防止被
同时唤醒,默认为off,因此nginx刚安装完以后要进行适当的优化。

6.multi_accept

1
2
multi_accept on;
打开同时接受多个新网络连接请求的功能。

7.server_tokens

1
2
server_tokens off;
在http 模块当中配置

8.worker_connections

1
2
3
worker_connections 65535;
每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为
worker_processes*worker_connections。

9.keepalive_timeout

1
2
3
4
5
6
7
8
keepalive_timeout 60;
http连接超时时间,默认是60s,功能是使客户端到服务器端的连接在设定
的时间内持续有效,当出现对服务器的后继请求时,该功能避免了建立或者重
新建立连接。切记这个参数也不能设置过大!否则会导致许多无效的http连
接占据着nginx的连接数,终nginx崩溃!
keepalive_timeout 65 70;
这是前端keepalive_timeout的一个延伸配置,前面65是告诉客户端我给
你保持多久,后面一个是多久我就给断开连接了。

10.client_header_timeout

1
client_header_timeout 10s

11.client_header_timeout

1
2
3
4
5
6
7
client_body_timeout 10s;
都跟请求相关,就一起理解了说了,这两个参数是对请求头和请求体(想了解
请求头和请求体的概念自己百度)的超时时间,就是从三次握手到第一次读取
请求头和请求体失败的时间。比如当前服务器负载大、网络卡,恰好在第一次
读取请求头或请求提时没有得到且时间超过10s了,tengine就会超时报错,
对于我当前应用而言,60s显而是太长了,优化到10s。
client_body_timeout 10s;

12.proxy_connect_timeout

1
2
3
4
5
6
proxy_connect_timeout 10s;
在收到请求头后,会将请求转发到upstream里面的server,这个呢就是与
对应的server连接的超时时间,设置时最大值不能超过75s,我这里的
server和tengine是放在同一个交换机上的内网,所以将连接时间优化到
10s,超过10s连接不上,说明业务有问题了。
proxy_connect_timeout 10s

13.proxy_send_timeout

1
2
3
4
5
6
proxy_send_timeout 55s;
在与upstream的server建立连接后,就会把请求往server发送,这个时间
是两次数据的发送时间差,不是整个发送过程的。比如说负载大、网络卡,在
tengine向server发送请求时突然卡了一下,然后继续发送,而这两次的时
间差(其实就是两次write的时间差)超过了我设置的55s,tengine就会超
时报错,对于这个参数,我当前优化的是55s。

14.proxy_read_timeout

1
2
3
4
5
6
proxy_read_timeout 60s;
在将请求发送给upstream的server后,后端server就会回传数据,这个时
间是两次收取数据的时间差,不是整个的接收时间。比如说负载大、网络卡,
在第1次收到请求的数据时断了,然后过了60s后才收到后面的数据,这两个
时间差(其实就是两次read的时间差)超过了设置的60s,
tengine(nginx)就会超时报错,我当前走的是默认设置60s。

15.resolver_timeout

1
2
3
4
5
6

resolver_timeout 10s;

这个是dns解析超时时间,如果用作正向代理时就有用了,同时可以用
resolver 127.0.0.1 valid=10m;指令来指定dns,后面是解析后缓存
的有效时间。

16.fail_timeout

1
2
3
4
server 127.0.0.1:9999 max_fails=20 fail_timeout=10s;
这个是指某一个upstream的server如果失败20次后,不可以操作的时间,
默认就是10s,其实可以另外的写法配在http中,我习惯直接配在server的
后端。

17.send_timeout

1
2
3
send_timeout 15;
应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个
时间,客户端没有任何活动,nginx关闭连接

18.client_header_buffer_size

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

19.open_file_cache max

1
2
3
4
5
6
7
8
9
10
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时间内一次没被使用,它将被移除。

20.sendfile

1
2
3
4
sendfile on;
开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数
来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载
应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。

21.tcp_nopush

1
2
3
tcp_nopush on;
必须在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的
数量(将响应头和正文的开始部分一起发送,而不一个接一个的发送。)

22.reset_timeout_connection

1
2
3
reset_timeout_connection on;
告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空
间。

23.gzip(重要)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,
flash什么的不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU
的!
gzip on
gzip_min_length 2k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;

gzip_typestext/plain text/css
text/javascriptapplication/json application/javascript
application/x-javascriptapplication/xml;

示意

gzip on; #开启压缩功能
gzip_min_length 1k; #设置允许压缩的页面最小字节数,页面字节数从
header头的Content-Length中获取,默认值是0,不管页面多大都进行压
缩,建议设置成大于1K,如果小与1K可能会越压越大。
gzip_buffers 4 32k; #压缩缓冲区大小,表示申请4个单位为32K的内存
作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储
gzip压缩结果。
gzip_http_version 1.1; #压缩版本,用于设置识别HTTP协议版本,默
认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可
gzip_comp_level 6; #压缩比例,用来指定GZIP压缩比,1压缩比最小,
处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资
源。
gzip_types text/css text/xml application/javascript; #用
来指定压缩的类型,‘text/html’类型总是会被压缩。
gzip_proxied expired no-cache no-store private auth;

24.expires

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图
片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,
js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就
非常快了!缓存的时候,我们需要将需要缓存的拓展名列出来, Expires缓
存配置在server字段里面
location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
expires 30d;
#log_not_found off;
access_log off;
}
location ~* \.(js|css)$ {
expires 7d;
log_not_found off;
access_log off;
}

log_not_found off;是否在error_log中记录不存在的错误。默认

是。

expire功能优点 (1)expires可以降低网站购买的带宽,节约成本(2)
同时提升用户访问体验(3)减轻服务的压力,节约服务器成本,是web服务
非常重要的功能。 expire功能缺点:被缓存的页面或数据更新了,用户看
到的可能还是旧的内容,反而影响用户体验。解决办法:第一个缩短缓存时
间,例如:1天,但不彻底,除非更新频率大于1天;第二个对缓存的对象改
名。

25.防盗链

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
location ~*^.+\.
(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers noneblocked www.benet.com benet.com;
if($invalid_referer) {
#return 302 http://www.benet.com/img/nolink.jpg;
return 404;
break;
}
access_log off;
}
参数可以使如下形式:
none 意思是不存在的Referer头(表示空的,也就是直接访问,比如直接在
浏览器打开一个图片)
blocked 意为根据防火墙伪装Referer头,如:“Referer:XXXXXXX”。
server_names 为一个或多个服务器的列表,0.5.33版本以后可以在名称
中使用“*”通配符。

主配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 #user root;

worker_processes 2;
worker_cpu_affinity 0001 0010;
worker_rlimit_nofile 102400;
error_log /home/sc_nginx/logs/errorlog/main-error.log;
error_log /home/sc_nginx/logs/errorlog/main-error.log
notice;
error_log /home/sc_nginx/logs/errorlog/main-error.log
info;
pid /home/sc_nginx/logs/nginx.pid;
events {
use epoll;
worker_connections 102400;
accept_mutex on;
multi_accept on;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 60 75;
keepalive_requests 1000;
server_tokens off;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
log_format main '$remote_addr - $remote_user
[$time_local] "$request" '
'$status $body_bytes_sent
"$http_referer" '
'"$http_user_agent"
$http_x_forwarded_for';
log_format main_json
'{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
'"status":"$status"}';
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript
application/x-javascript text/javascript text/css
application/xml application/xml+rss;
gzip_vary on;
gzip_proxied expired no-cache no-store private
auth;
gzip_disable "MSIE [1-6]\.";

upstream new_shop_ant { #新商城前端
server 127.0.0.1:8080;
server 127.0.0.1:9080 backup;
}
upstream new_shop { #新商城管理

server 127.0.0.1:8081;
server 127.0.0.1:9081 backup;
}
upstream wechat { #微信对接
server 192.168.101.59:6705 max_fails=4
fail_timeout=10s;
server 192.168.101.61:6705 max_fails=4
fail_timeout=10s;
}
upstream open { #开放平台
server 192.168.101.59:7705 max_fails=4
fail_timeout=10s;
server 192.168.101.61:7705 max_fails=4
fail_timeout=10s;
}
upstream ew { #交易平台
server 192.168.101.59:8705 max_fails=4
fail_timeout=10s;
server 192.168.101.61:8705 max_fails=4
fail_timeout=10s;
}
upstream vmims { #商户管理端
server 192.168.101.59:9705 max_fails=4
fail_timeout=10s;
server 192.168.101.61:9705 max_fails=4
fail_timeout=10s;
}
include conf.d/*.conf;
}

websocket配置

1
2
3
4
5
6
7
8
9
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

子配置文件

①shop(新商城前端展示和后台管理)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
server {
listen 1080;
server_name mall.eguagua.cn;
access_log
/home/sc_nginx/logs/accesslog/mall_access.log main;
error_log
/home/sc_nginx/logs/errorlog/mall_error.log ;
client_header_timeout 120s; #调大点
client_body_timeout 120s; #调大点
client_max_body_size 100m; #主要是这个参
数,限制了上传文件大大小
client_body_buffer_size 256k;
location = /MP_verify_hhvX6XfZQCOwWWpf.txt {
root html;
}
location / {
proxy_http_version 1.1;
proxy_connect_timeout 10s;
proxy_send_timeout 55s;
proxy_read_timeout 60s;
proxy_pass_request_body on;
proxy_pass_request_headers on;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;

proxy_pass http://new_shop_ant;
}
location /coalition-admin-api {
proxy_http_version 1.1;
proxy_connect_timeout 10s;
proxy_send_timeout 55s;
proxy_read_timeout 60s;
proxy_pass_request_body on;
proxy_pass_request_headers on;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
proxy_pass http://new_shop;
}
location ~* .*\.(css|js)$ {
expires 7d;
log_not_found off;
access_log off;
proxy_pass http://new_shop_ant;
}
location ~* .*\.(jpg|jpeg|gif|png|ico|pdf|txt)$
{
expires 7d;
log_not_found off;
access_log off;
proxy_pass http://new_shop_ant;
}
location ~ /coalition-admin-api/.*\.(css|js)$ {
expires 7d;
log_not_found off;
access_log off;
proxy_pass http://new_shop;
}
}

②ew(交易中心)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
server {
listen 1080;
server_name egege.eguagua.cn;

access_log
/home/sc_nginx/logs/accesslog/egege_access.log main;
error_log
/home/sc_nginx/logs/errorlog/egege_error.log ;
location = /wifi_welcome.html {
root html;
}
location = /MP_verify_hhvX6XfZQCOwWWpf.txt {
root html;
}
location / {
proxy_http_version 1.1;
proxy_connect_timeout 10s;
proxy_send_timeout 55s;
proxy_read_timeout 60s;
proxy_pass_request_body on;
proxy_pass_request_headers on;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
proxy_pass http://ew;

#try_files $uri /weihu.html;

}
location /test/ {
proxy_set_header Host $http_host;

#proxy_pass http://127.0.0.1:9305/;

proxy_pass http://10.168.171.105:1994/;
proxy_redirect default;
#try_files $uri /weihu.html;
}
}

③open(开放平台)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 1080;
server_name open.eguagua.cn;
access_log
/home/sc_nginx/logs/accesslog/open_access.log main;

error_log
/home/sc_nginx/logs/errorlog/open_error.log ;
location / {
proxy_http_version 1.1;
proxy_connect_timeout 10s;
proxy_send_timeout 55s;
proxy_read_timeout 60s;
proxy_pass_request_body on;
proxy_pass_request_headers on;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
proxy_pass http://open;
}
}

④vmims(商户管理端)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
server {
listen 1080;
server_name vmims.eguagua.cn;
access_log
/home/sc_nginx/logs/accesslog/vmims_access.log main;
error_log
/home/sc_nginx/logs/errorlog/vmims_error.log ;
location / {
proxy_http_version 1.1;
proxy_connect_timeout 10s;
proxy_send_timeout 55s;
proxy_read_timeout 60s;
proxy_pass_request_body on;
proxy_pass_request_headers on;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
proxy_pass http://vmims;
}
location /ws/ {
proxy_http_version 1.1;

⑤wechat(微信调试)
proxy_connect_timeout 10s;
proxy_send_timeout 55s;
proxy_read_timeout 60s;
proxy_pass_request_body on;
proxy_pass_request_headers on;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
proxy_pass http://vmims/ws/;
}
}

⑤wechat(微信调试)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
server {
listen 1080;
server_name wechat.eguagua.cn;
access_log
/home/sc_nginx/logs/accesslog/wechat_access.log main;
error_log
/home/sc_nginx/logs/errorlog/wechat_error.log ;
if ( $host = wechat.eguagua.cn ) {
rewrite
^/test/egege/hatch_selector/wechatAuth
http://egege.eguagua.cn/egege/hatch_selector/wechatAuth
break;
}
location / {
proxy_http_version 1.1;
proxy_connect_timeout 10s;
proxy_send_timeout 55s;
proxy_read_timeout 60s;
proxy_pass_request_body on;
proxy_pass_request_headers on;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
proxy_pass http://wechat;
}
}

二、内核参数调优

1.选项参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
fs.file-max = 204800 # 这个参数表示进程(比如一个
worker进程)可以同时打开的最大句柄数,这个参数直线限制最大并发连接
数,需根据实际情况配置。
fs.nr_open = 204800 # nr_open定义是单进程最大
file-handles,file-handles(即文件句柄)
net.ipv4.tcp_syncookies = 1 # 开启SYN
Cookies,当出现SYN等待队列溢出时,启用cookies来处理。
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 3500 # 这个参数表示操作系统允
许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字
将立刻被清除并打印警告信息。该参数默认为180000,过多的TIME_WAIT套
接字会使Web服务器变慢。
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 10240 87380 12582912 # 这个参数定义了
TCP接受缓存(用于TCP接受滑动窗口)的最小值、默认值、最大值。
net.ipv4.tcp_wmem = 10240 87380 12582912 # 这个参数定义了
TCP发送缓存(用于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 = 40960 # web 应用中
listen 函数的 backlog 默认会给我们内核参数的
net.core.somaxconn 限制到128,而nginx定义的
NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值。

注:对于一个TCP连接,Server与Client需要通过三次握手来建立网络

1
2
3
4
5
6
连接.当三次握手成功后,我们可以看到端口的状态由LISTEN转变为
ESTABLISHED,接着这条链路上就可以开始传送数据了.每一个处于监听
(Listen)状态的端口,都有自己的监听队列.监听队列的长度与如
somaxconn参数和使用该端口的程序中listen()函数有关

# somaxconn参数:定义了系统中每一个端口最大的监听队列的长度,这是个
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
全局的参数,默认值为128,对于一个经常处理新连接的高负载 web服务环境
来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更
多。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。
net.ipv4.tcp_max_orphans = 3276800 # 系统中最多有多少个TCP
套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将
即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不
能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之
后)。
net.ipv4.tcp_max_syn_backlog = 262144 # 这个参数标示TCP三次
握手建立阶段接受SYN请求队列的最大长度,默认为1024,将其设置得大一
些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失
客户端发起的连接请求。
net.ipv4.tcp_timestamps = 0 # 时间戳可以避免序列
号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内
核接受这种“异常”的数据包。
net.ipv4.tcp_max_syn_backlog = 262144 # 记录的那些尚未收到
客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值
是1024,小内存的系统则是128。
net.ipv4.tcp_synack_retries = 1 # 为了打开对端的连
接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓
三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK
包的数量。
net.ipv4.tcp_syn_retries = 1 # 在内核放弃建立连接
之前发送SYN包的数量。
net.ipv4.tcp_tw_recycle = 1 # 启用timewait快速回
收。
net.ipv4.tcp_tw_reuse = 1 # 开启重用。允许将
TIME-WAIT sockets重新用于新的TCP连接。这对于服务器来说很有意义,
因为服务器上总会有大量TIME-WAIT状态的连接。
net.ipv4.tcp_mem = 94500000 915000000 927000000
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小时,若将
其设置的小一些,可以更快地清理无效的连接。
net.ipv4.tcp_keepalive_probes = 3 # 果对方不予应答,探
测包的发送次数
net.ipv4.tcp_keepalive_intvl = 15 # keepalive探测包
的发送间隔
net.ipv4.ip_local_port_range = 1024 65535 # 允许系统打开
的端口范围。
net.ipv4.tcp_sack = 1 # 启用有选择的应答
(Selective Acknowledgment),这可以通过有选择地应答乱序接收到
的报文来提高性能(这样可以让发送者只发送丢失的报文段);(对于广域网
通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。
net.ipv4.tcp_slow_start_after_idle = 0 # 关闭tcp的连接传输
的慢启动,即先休止一段时间,再初始化拥塞窗口。
net.ipv4.icmp_echo_ignore_broadcasts = 1 # 避免放大攻击,拒
绝ping
net.ipv4.icmp_ignore_bogus_error_responses = 1 # 开启恶意
icmp错误消息保护

net.inet.udp.checksum=1 # 防止不正确的udp
包的攻击

关于timewait快速回收

不要轻易打开

net.ipv4.tcp_tw_recycle = 1 # 启用timewait快速回
收。

net.ipv4.tcp_tw_recycle = 0
实际上,net.ipv4.tcp_tw_recycle功能的开启,要需要
net.ipv4.tcp_timestamps(一般系统默认是开启这个功能的)这个开关
开启后才有效果;
当tcp_tw_recycle 开启时(tcp_timestamps 同时开启,快速回收
socket 的效果达到),对于位于NAT设备后面的 Client来说,是一场灾
难!
会导致到NAT设备后面的Client连接Server不稳定(有的 Client 能连接
server,有的 Client 不能连接 server)。
也就是说,tcp_tw_recycle这个功能,是为内部网络(网络环境自己可控 ”
——不存在NAT 的情况)设计的,对于公网环境下,不宜使用。
通常来说,回收TIME_WAIT状态的socket是因为“无法主动连接远端”,因为
无可用的端口,而不应该是要回收内存(没有必要)。
即:需求是Client的需求,Server会有“端口不够用”的问题吗?
除非是前端机,需要大量的连接后端服务,也就是充当着Client的角色。
正确的解决这个总是办法应该是:
net.ipv4.ip_local_port_range = 9000 6553 #默认值范围较小
net.ipv4.tcp_max_tw_buckets = 10000 #默认值较小,还可适当调小
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10

2.方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
fs.file-max = 204800
fs.nr_open = 204800
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 25600
net.core.netdev_max_backlog = 262144
net.core.rmem_default=262144 # 接收套接字缓冲区大小的默认值
net.core.wmem_default=262144 # 发送套接字缓冲区大小的默认值
net.core.rmem_max=16777216 # 接收套接字缓冲区大小的最大值
net.core.wmem_max=16777216 # 发送套接字缓冲区大小的最大值
net.core.optmem_max=16777216 # socket buffer的最大初始化
值,默认10K
net.core.somaxconn = 40960
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0 # 选择不开启
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 0 # 选择不开启
net.ipv4.tcp_tw_reuse = 0 # 选择不开启
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_sack = 1 # 谨慎开启
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.icmp_echo_ignore_broadcasts = 0 # 选择不开启,允许
ping
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.inet.udp.checksum=1