Linux基础服务 ·

Nginx配置及常用模块

[隐藏]

Nginx简介

Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器。Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011 年 6 月 1 日,nginx 1.0.4 发布。

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个 BSD-like 协议下发行。由俄罗斯的程序设计师 Igor Sysoev 所开发,供俄国大型的入口网站及搜索引擎 Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx 配置结构

主配置文件结构:

主配置段,也即全局配置段;

main block

事件驱动相关的配置;

event {

...

}

http/https 协议相关的配置段;

http {

...

}

mail {

...

}

stream {

...

}

配置文件的组成部分:

主配置文件:nginx.conf

辅配置文件:include conf.d/*.conf

主配置文件的配置指令:directive value [value2 ...];

注意:

(1) 指令必须以分号结尾;

(2) 支持使用配置变量;

  • 内建变量:由 Nginx 模块引入,可直接引用;
  • 自定义变量:由用户使用set命令定义;如:set variable_name value;

引用变量:$variable_name

 

main配置段常见的配置指令:

正常运行必备的配置:

1、user     定义工作进程使用的用户和组凭证。 如果省略group,则使用名称等于user的组。

Syntax: user user [group];

Default: user nobody nobody;

Context: main

2、pid /PATH/TO/PID_FILE;    指定存储 nginx 主进程进程号码的文件路径;

3、include file | mask;    指明包含进来的其它配置文件片断;

4、load_module file;    指明要装载的动态模块;

性能优化相关的配置:

1、worker_processes number | auto;   指定 worker 进程的数量;通常应该为当前主机的 cpu 的物理核心数。

2、worker_cpu_affinity cpumask ...;   绑定 worker  与 CPU 核心对应。

worker_cpu_affinity auto [cpumask];

CPU MASK:

00000001:0 号 CPU

00000010:1 号 CPU

... ...

3、worker_priority number;    指定 worker 进程的 nice 值,设定 worker 进程优先级;[-20,20]

4、worker_rlimit_nofile number;    worker 进程所能够打开的文件数量上限;

调试、定位问题:

1、daemon on|off;    是否以守护进程方式运行Nignx;

2、master_process on|off;   是否以master/worker模型运行nginx;默认为on;

3、error_log file [level];    错误日志等级。

事件驱动相关的配置:

events {

...

}

1、worker_connections number;

每个 worker 进程所能够打开的最大并发连接数数量;

worker_processes * worker_connections

2、use method;    指明并发连接请求的处理方法;use epoll;

3、accept_mutex on | off;    处理新的连接请求的方法;on意味着由各worker轮流处理新请求,Off意味着每个新请求的到达都会通知所有的worker进程;

 与套接字相关配置:

server {......} 配置一个虚拟主机

格式大致如下:

server{

listen address[:PORT]|PORT;

server_name SERVER_NAME;

root /PATH/TO/DOCUMENT_ROOT;

}


  • 1.listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]

监听对象,可写监听地址加端口,不写地址则默认监听本机所有地址;可监听套接字,需指定套接字文件路径。

default_server:多个虚拟主机可使用 default_server 指定默认虚拟主机。

ssl:限制仅能够通过 ssl 连接提供服务。

backlog=number:后援队列长度。

rcvbuf=size:接收缓存区大小。

sndbuf=size:发送缓存区大小。


  • 2.server_name name ...;

指明虚拟主机的主机名称;

后可跟多个由空白字符分隔的字符串,支持 * 通配任意长度的任意字符;

示例:

支持 ~ 起始的字符做正则表达式模式匹配;

示例:

匹配机制:

(1) 首先是字符串精确匹配;

(2) 然后左侧 * 通配符;

(3) 然后右侧 * 通配符;

(4) 最后正则表达式匹配;


  • 3.tcp_nodelay on | off;

在keepalived模式下的连接是否启用TCP_NODELAY选项。


  • 4.sendfile on | off;

是否启用 sendfile 功能。

定义路径相关的配置:

  • 1.root path;

设置 web 资源路径映射;用于指明用户请求的 url 所对应的本地文件系统上的文档所在目录路径;

可用的位置:http, server, location, if in location;


  • 2.location [ = | ~ | ~* | ^~ ] uri { ... }

location @name { ... }

在一个 server 中 location 配置段可存在多个,用于实现从 uri 到文件系统的路径映射;

ngnix 会根据用户请求的 URL 来检查定义的所有 location,并找出一个最佳匹配,而后应用其配置;

=:对URI做精确匹配;

例如我们访问一个网站,而当我们 URL 结尾为 / 时,默认会读取此路径下的 index.* 的预设主页,而我们定义一个 / 那么访问时那个路径是,则显示我们定义的资源,却不会去找预设的主页。

 

~:对 URI 做正则表达式模式匹配,区分字符大小写;

~*:对 URI 做正则表达式模式匹配,不区分字符大小写;

^~:对 URI 的左半部分做匹配检查,不区分字符大小写;

不带符号:匹配起始于此 uri 的所有的 url;

匹配优先级:=, ^~, ~/~*,不带符号;


  • 3.alias path;

定义路径别名,文档映射的另一种机制;仅能用于location上下文;

注意:location 中使用 root 指令和 alias 指令的意义不同,alias 定义不是 / ;

(a) root,给定的路径对应于location中的/uri/左侧的/;

(b) alias,给定的路径对应于location中的/uri/右侧的/;


  • 4.index file ...;

默认资源;默认路径首页;可用于 http, server, location;


  • 5.error_page code ... [=[response]] uri;

错误码,返回页面自定义。


  • 6.try_files file ... uri;

 

定义客户端请求的相关配置

  • 1.keepalive_timeout timeout [header_timeout];

设定保持连接的超时时长,0 表示禁止长连接;默认为 75s;


  • 2.keepalive_requests number;

在一次长连接上所允许请求的资源的最大数量,默认为 100;


  • 3.keepalive_disable none | browser ...;

对哪种浏览器禁用长连接;


  • 4.send_timeout time;

向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长;


  • 5.client_body_buffer_size size;

用于接收客户端请求报文的 body 部分的缓冲区大小;默认为16k,超出此大小时,其将被暂存到磁盘上的由 client_body_temp_path 指令所定义的位置;


  • 6.client_body_temp_path path [level1 [level2 [level3]]];

设定用于存储客户端请求报文的 body 部分的临时存储路径及子目录结构和数量;默认为哈希运算后的 16 进制数;

如:client_body_temp_path path  /var/tmp/client_body  1 2 2 则表示,取运算后第一位做一级目录,第二、三位做二级目录,第四、五位做三级目录,便于大量数据检索。

对客户端进行限制的相关配置

  • 1.limit_rate rate;

限制响应给客户端的传输速率,单位是 bytes/second,0 表示无限制;


  • 2.limit_except method ... { ... }

限制对指定的请求方法之外的其它方法的使用客户端;

示例:

limit_except GET {

allow 192.168.1.0/24;

deny all;

}

如上表示仅允许本地 192.168.1.0/24 网段使用除 GET 模式外的请求方式。

文件操作优化的配置

  • 1.aio on | off | threads[=pool];

是否启用 aio 功能;也就是异步 I/O 。


  • 2.directio size | off;

在 Linux 主机启用 O_DIRECT 标记,此处意味文件大于等于给定的大小时使用,例如 directio 4m;


  • 3.open_file_cache off;open_file_cache max=N [inactive=time];

nginx 可以缓存以下三种信息:

(1) 文件的描述符、文件大小和最近一次的修改时间;

(2) 打开的目录结构;

(3) 没有找到的或者没有权限访问的文件的相关信息;

max=N:可缓存的缓存项上限;达到上限后会使用 LRU 算法实现缓存管理;

inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于 open_file_cache_min_uses 指令所指定的次数的缓存项即为非活动项;


  • 4.open_file_cache_valid time;

缓存项有效性的检查频率;默认为 60s;


  • 5.open_file_cache_min_uses number;

在 open_file_cache 指令的 inactive 参数指定的时长内,至少应该被命中多少次方可被归类为活动项;


  • 6.open_file_cache_errors on | off;

是否缓存查找时发生错误的文件一类的信息;

ngx_http_access_module模块

实现基于 ip 的访问控制功能。

allow address | CIDR | unix: | all; 允许

deny address | CIDR | unix: | all; 拒绝

可用于 http, server, location, limit_except;

ngx_http_auth_basic_module模块

实现基于用户的访问控制,使用 basic 机制进行用户认证,需要使用 httpd htpasswd 工具生成验证文件,由 httpd-tools 提供;

auth_basic string | off;

auth_basic_user_file file;

示例:

location /admin/ {

alias /webapps/app1/data/;

auth_basic "Admin Area";

auth_basic_user_file /etc/nginx/.ngxpasswd;

}

如上配置表示访问 admin 路径需要验证用户,admin 路径位于 /webapps/app1/data/ ,其验证文件位于 /etc/nginx/.ngxpasswd;

ngx_http_stub_status_module模块

用于输出 nginx 的基本状态信息;

示例:

Active connections: 291

server accepts handled requests

16630948 16630948 31070465

Reading: 6 Writing: 179 Waiting: 106


Active connections: 活动状态的连接数;

accepts:已经接受的客户端请求的总数;

handled:已经处理完成的客户端请求的总数;

requests:客户端发来的总的请求数;

Reading:处于读取客户端请求报文首部的连接的连接数;

Writing:处于向客户端发送响应报文过程中的连接数;

Waiting:处于等待客户端发出请求的空闲连接数;


可使用 stub_status; 调用

配置示例:

location /basic_status {

stub_status;

}

ngx_http_log_module模块

Nginx 日志定义模块

log_format name string ...;

string 可以使用 nginx 核心模块及其它模块内嵌的变量;


access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

定义日志路径与格式。

access_log off;  定义是否开启。

访问日志文件路径,格式及相关的缓冲的配置;

buffer=size  定义日志缓存区大小。

flush=time  定义日志缓存过期时间

可使用 if 判断语句


open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

open_log_file_cache off;

缓存各日志文件相关的元数据信息;

max:缓存的最大文件描述符数量;

min_uses:在 inactive 指定的时长内访问大于等于此值方可被当作活动项;

inactive:非活动时长;

valid:验正缓存中各缓存项是否为活动项的时间间隔;

ngx_http_gzip_module模块

Gzip 压缩过滤模块,可过滤压缩传输文件,节省带宽,消耗资源。

gzip on | off;

gzip 是否开启。


gzip_comp_level level;

gzip 压缩等级,level 有 1-9 。


gzip_disable regex ...;

排除对指定报文头部类型进行压缩。


gzip_min_length length;

启用压缩功能的响应报文大小阈值;


gzip_buffers number size;

支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小;


gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;

nginx 作为代理服务器接收到从被代理服务器发送的响应报文后,在何种条件下启用压缩功能的;

off:对代理的请求不启用

no-cache, no-store,private:表示从被代理服务器收到的响应报文首部的 Cache-Control 的值为此三者中任何一个,则启用压缩功能;


gzip_types mime-type ...;

压缩过滤器,仅对此处设定的 MIME 类型的内容启用压缩功能;

示例:

gzip on;

gzip_comp_level 6;

gzip_min_length 64;

gzip_proxied any;

gzip_types text/xml text/css application/javascript;

ngx_http_ssl_module模块

SSL模块,启用加密传输 HTTPS 。

ssl on | off;

是否启用 https 。


ssl_certificate file;

当前虚拟主机使用PEM格式的证书文件;


ssl_certificate_key file;

当前虚拟主机上与其证书匹配的私钥文件;


ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];

支持ssl协议版本,默认为后三个;


ssl_session_cache off | none | [builtin[:size]] [shared:name:size];

builtin[:size]:使用 OpenSSL 内建的缓存,此缓存为每 worker 进程私有;

[shared:name:size]:在各 worker 之间使用一个共享的缓存;


ssl_session_timeout time;

客户端一侧的连接可以复用 ssl session cache 中缓存的 ssl 参数的有效时长;

配置示例:

server {

listen 443 ssl;

server_name www.getlinux.cn;

root /vhosts/ssl/htdocs;

ssl on;

ssl_certificate /etc/nginx/ssl/nginx.crt;

ssl_certificate_key /etc/nginx/ssl/nginx.key;

ssl_session_cache shared:sslcache:20m;

}

ngx_http_rewrite_module模块

将用户请求的 URI 基于 regex 所描述的模式进行检查,而后完成替换;

rewrite regex replacement [flag]

将用户请求的 URI 基于 regex 所描述的模式进行检查,匹配到时将其替换为 replacement 指定的新的 URI;

注意:如果在同一级配置块中存在多个 rewrite 规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;

如果 replacement 是以 http:// 或 https:// 开头,则替换结果会直接以重向返回给客户端;

[flag] 所表示的标志位用于控制此循环机制;

[flag]:

last:重写完成后停止对当前 URI 在当前 location 中后续的其它重写操作,而后对新的 URI 启动新一轮重写检查;提前重启新一轮循环;

break:重写完成后停止对当前 URI 在当前 location 中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环;

redirect:重写完成后以临时重定向方式直接返回重写后生成的新 URI 给客户端,由客户端重新发起请求;不能以 http:// 或 https:// 开头;

permanent:重写完成后以永久重定向方式直接返回重写后生成的新 URI 给客户端,由客户端重新发起请求;


return ...

停止处理并将指定的代码返回给客户端。

return code [text];

return code URL;

return URL;


rewrite_log on | off;

是否开启重写日志;


if (condition) { ... }

引入一个新的配置上下文 ;条件满足时,执行配置块中的配置指令;server, location;

condition 为比较操作符:

== 模式匹配

!= 模式不匹配

~:模式匹配,区分字符大小写;

~*:模式匹配,不区分字符大小写;

!~:模式不匹配,区分字符大小写;

!~*:模式不匹配,不区分字符大小写;

文件及目录存在性判断:

-e, !-e  判断是否存在

-f, !-f   判断是否存在且为文件

-d, !-d  判断是否存在且为目录

-x, !-x   判断是否存在且具有可执行权限


set $variable value;

用户自定义变量 ;

ngx_http_fastcgi_module模块

此模块用于阻止对 “Referer” 报文首部具有无效值的请求对站点的访问。

valid_referers none | blocked | server_names | string ...;

定义referer首部的合法可用值;

none:请求报文首部没有referer首部;

blocked:请求报文的referer首部没有值;

server_names:参数,其可以有值作为主机名或主机名模式;

arbitrary_string:直接字符串,但可使用*作通配符;

regular expression:被指定的正则表达式模式匹配到的字符串;要使用~打头,例如 ~.*\.magedu\.com;

配置示例:

valid_referers none block server_names *.getlinux.cn *.getlinux.cn getlinux.*  ~\.getlinux\.;

if($invalid_referer) {

return 403;

}

ngx_http_proxy_module模块

此模块允许将请求传递到另一个服务器,URL 重定向。

proxy_pass URL;

Context: location, if in location, limit_except

注意:proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机;

server {

...

server_name HOSTNAME;

location /uri/ {

proxy http://hos[:port];

}

...

}

http://HOSTNAME/uri --> http://host/uri

proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri;

server {

...

server_name HOSTNAME;

location /uri/ {

proxy http://host/new_uri/;

}

...

}

http://HOSTNAME/uri/ --> http://host/new_uri/

如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用uri;

用户请求时传递的uri将直接附加代理到的服务的之后;

server {

...

server_name HOSTNAME;

location ~|~* /uri/ {

proxy http://host;

}

...

}

http://HOSTNAME/uri/ --> http://host/uri/;


proxy_set_header field value;

设定发往后端主机的请求报文的请求首部的值;可用于 http, server, location ;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


proxy_cache_path

定义可用于proxy功能的缓存;Context: http

proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];


proxy_cache zone | off;

指明要调用的缓存,或关闭缓存机制;Context: http, server, location


proxy_cache_key string;

缓存中用于“键”的内容;

默认值:proxy_cache_key $scheme$proxy_host$request_uri;


proxy_cache_valid [code ...] time;

定义对特定响应码的响应内容的缓存时长;

 

定义在 http{...} 中;

proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;

 

定义在需要调用缓存功能的配置段,例如 server{...};

proxy_cache pxycache;

proxy_cache_key $request_uri;

proxy_cache_valid 200 302 301 1h;

proxy_cache_valid any 1m;


proxy_cache_use_stale

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;

确定在与代理服务器通信期间发生错误时,在哪些情况下可以使用过时的高速缓存响应。


proxy_cache_methods GET | HEAD | POST ...;

如果客户端请求方法列在此指令中,那么响应将被缓存。 “GET”和“HEAD”方法总是添加到列表中,但建议明确指定它们。


proxy_hide_header field;

默认情况下,nginx 不从代理服务器到客户端的响应中传递头字段 “Date”,“Server”,“X-Pad”和“X-Accel -...”。 proxy_hide_header 指令设置不会传递的其他字段。


proxy_connect_timeout time;

定义与代理服务器建立连接的超时时长。 应该注意,该时长通常不能超过 75 秒,默认为 60 秒。

ngx_http_headers_module模块

此模块允许将 “Expires” 和 “Cache-Control” 报文头部和任意字段添加到响应首部。

add_header name value [always];

添加自定义首部;

add_header X-Via $server_addr;

add_header X-Accel $server_name;


expires [modified] time;

expires epoch | max | off;

用于定义 Expire 或 Cache-Control 首部的值;

ngx_http_fastcgi_module模块:

此模块允许传递请求到服务器的FastCGI。

fastcgi_pass address;

address 为 fastcgi server 的地址; location, if in location;


fastcgi_index name;

fastcgi 默认的主页资源;


fastcgi_param parameter value [if_not_empty];

设置应传递到 FastCGI 服务器的参数。 该值可以包含文本,变量及其组合。

配置示例1:

前提:配置好 fpm server 和 mariadb-server 服务;

location ~* \.php$ {

root /usr/share/nginx/html;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;

include fastcgi_params;

}

配置示例2:通过 /pm_status 和 /ping 来获取 fpm server 状态信息;

location ~* ^/(pm_status|ping)$ {

include fastcgi_params;

fastcgi_pass 127.0.0.1:9000

fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;

}


fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

定义 fastcgi 的缓存;缓存位置为磁盘上的文件系统,由 path 所指定路径来定义;

levels=levels:缓存目录的层级数量,以及每一级的目录数量;levels=ONE:TWO:THREE,示例:leves=1:2:2

keys_zone=name:size  k/v映射的内存空间的名称及大小

inactive=time   非活动时长

max_size=size   磁盘上用于缓存数据的缓存空间上限


fastcgi_cache zone | off;

调用指定的缓存空间来缓存数据;可用于 http, server, location;


fastcgi_cache_key string;

定义用作缓存项的 key 的字符串;


fastcgi_cache_methods GET | HEAD | POST ...;

为哪些请求方法使用缓存;


fastcgi_cache_min_uses number;

缓存空间中的缓存项在 inactive 定义的非活动时间内至少要被访问到此处所指定的次数方可被认作活动项;


fastcgi_cache_valid [code ...] time;

不同的响应码各自的缓存时长;

示例:

http {

...

fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgi:20m inactive=120s;

...

server {

...

location ~* \.php$ {

...

fastcgi_cache fcgi;

fastcgi_cache_key $request_uri;

fastcgi_cache_valid 200 302 10m;

fastcgi_cache_valid 301 1h;

fastcgi_cache_valid any 1m;

...

}

...

}

...

}


fastcgi_keep_conn on | off;

默认情况下,FastCGI 服务器将在发送响应后立即关闭连接。 但是,当此指令设置为 on 时,nginx 将指示 FastCGI 服务器保持连接打开。

ngx_http_upstream_module模块

此模块用于定义可由 proxy_pass,fastcgi_pass,uwsgi_pass,scgi_pass 和 memcached_pass 指令引用的服务器组。

pstream name { ... }

定义后端服务器组,会引入一个新的上下文;可用于 http

upstream httpdsrvs {

server ...

server...

...

}


server address [parameters];

在 upstream 上下文中 server 成员,以及相关的参数;Context: upstream

address的表示格式:

unix:/PATH/TO/SOME_SOCK_FILE

IP[:PORT]

HOSTNAME[:PORT]

parameters:

weight=number       权重,默认为1;

max_fails=number   失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用;

fail_timeout=time    设置将服务器标记为不可用状态的超时时长;

max_conns              当前的服务器的最大并发连接数;

backup                    将服务器标记为“备用”,即所有服务器均不可用时此服务器才启用;

down                      标记为“不可用”;


least_conn;

最少连接调度算法,当 server 拥有不同的权重时其为 wlc;


ip_hash;

源地址hash调度方法;


hash key [consistent];

基于指定的key的hash表来实现对请求的调度,此处的 key 可以直接文本、变量或二者的组合;

作用:将请求分类,同一类请求将发往同一个 upstream server;

如果指定了一致的参数,将使用 ketama 一致性哈希方法。

示例:

hash $request_uri consistent;

hash $remote_addr;


keepalive connections;

为每个 worker 进程保留的空闲的长连接数量;

ngx_stream_core_module模块

模拟反代基于 tcp 或 udp 的服务连接,即工作于传输层的反代或调度器;

stream { ... }

定义stream相关的服务;Context:main

示例:

stream {

upstream sshsrvs {

server 192.168.22.2:22;

server 192.168.22.3:22;

least_conn;

}

server {

listen 10.1.0.6:22022;

proxy_pass sshsrvs;

}

}


listen

监听地址端口

listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

参与评论