Server 节点
nginx 的错误日志。
语法:error_log file [level];
file 除了在物理机上的位置,还可以使用syslog:
和 memory:
配置。
比如 error_log syslog:server=192.168.1.1:1234 debug;
,更多变量可看 http://nginx.org/en/docs/syslog.html
官网文档。
支持的日志级别:debug, info, notice, warn, error, crit, alert, emerg,越往后越严重。设置 error 级别的日志会接收 error, crit, alert, emerg 级别的日志。
示例:
server {
error_log /path/to/log debug;
}
请求访问日志。
语法:access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
当然也可以关闭当前配置:access_log off;
syslog:
和 memory:
配置。设置 buffer 的目的,是为了避免高频对磁盘进行读写操作,即暂时先不将日志写入磁盘,而是存入内存中,等达到了设置缓存大小之后再一次性写入,注意 flush 指令是和 buffer 一起使用的,即指定 buffer=size 之后,如果超过 flush 指令设定的时间仍然未达到缓存区大小,则也会被写入到磁盘,没有 buffer 而只有 flush 则会报错。
format 如果未配置的话默认使用 combined,当然如果想指定格式的话可以在 log_format 中指定,具体可参数上一篇。
设置请求行+请求头的大小,如果请求超过当前配置大小,则使用 large_client_header_buffers 配置,如果还是超过 large_client_header_buffers 配置大小,则返回 414 状态码。
语法:client_header_buffer_size size;
默认值:client_header_buffer_size 1k;
指定客户端请求中较大的消息头的缓存最大数量和大小。
语法:large_client_header_buffers number size;
默认值:large_client_header_buffers 4 8k;
设置客户端请求服务器最大允许大小,如果需要上传大文件的话,则需要修改当前的配置项。
语法:client_max_body_size size;
默认值:client_max_body_size 1m;
设置客户端请求正文的 buffer 大小。如果超过 buffer 的大小的话,请求正文就会放置在临时文件当时,引起系统的 IO。
语法:client_body_buffer_size size;
默认值:client_body_buffer_size 8k|16k;
在 x86, 其他 32 位、x86-64 系统上默认是 8k,64 位系统上默认是 16K。
设置每个连接的内容分配,对性能影响小,一般不建议使用。
语法:connection_pool_size size;
默认值:connection_pool_size 256|512;
32位系统上是256字节,64位上是512字节。
定义了一个会话状态存储区域,里边记录会话状态的信息
语法: limit_conn_zone key zone=name:size;
key 可以是变量、文本和变量文本的组合,后面的连接数量就是通过当前的 key 来判断的。
当信息超出 size 的大小的话,会直接返回 limit_conn_status 配置的状态码信息。
示例:
limit_conn_zone $binary_remote_addr zone=addr:10m;
(客户端的 IP 地址)remoteaddr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。remote_addr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。remoteaddr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
限制最大连接数。
语法:limit_conn zone number;
示例:limit_conn addr 1;
配合上面的 limit_conn_zone 使用,连接数通过 key 来判断。超出限制的连接直接返回 limit_conn_status 配置的状态码信息。
定义了一个会话状态存储区域,里边记录会话状态的信息。
语法:limit_req_zone key zone=name:size rate=rate [sync];
参数意思和上面 limit_conn_zone 一样,rate 是限制时间内能处理多少个请求,比如 30r/s 就是每秒只能处理 30 个请求,超出的请求直接拒绝。 r/m 就是每分钟最多处理多少个请求。
当存储空间耗尽的时候,如果需要记录新的值,那么就会通过 LRU 算法移除旧的变量来腾出空间,如果这样腾出来的空间还是不足以接纳新的记录值,那么 nginx 就会返回状态码 503 (Service Temporarily Unavailable)。此外,为了防止内存耗尽,nginx 每次创建一个新记录值的时候就会清理掉两个 60 秒内没被使用过的旧记录值。
示例:limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
语法:limit_req zone=name [burst=number] [nodelay | delay=number];
配置 limit_req_zone 使用。
示例:limit_req zone=mylimit
就是限制每秒只能处理 10 个请求了。
burst 参数则是设置突发请求的请求数,当达到限制请求数,则会将请求放置到队列当中,超出 burst 配置的请求数则会拒绝。
nodelay 配置是超出请求直接返回拒绝不等待。
delay 是分段线速。比如配置了 rate=10r/s burst=14 delay = 5,那么每秒处理完了 10 个请求,后面还能处理 14 个突发请求,其他 14 个突发请求分为 5 个插槽队列和 9 个缓冲队列,插槽队列的请求会立马被处理,也就是可以立马处理 10 + 5 个请求,后面的缓冲队列会被 10 r/s 匀速处理,只有当缓冲队列中的请求处理完毕后,插槽队列的请求才会填充回去。
限制客户端速率。
语法:limit_rate rate;
默认:limit_rate 0;
示例:limit_rate 4k;
限速是根据客户端连接来限速的,当客户端开启两个连接,那么每个连接限速 4k。
它还可以配合变量来动态限速:
map $date_local $limit_rate_time {
default 4K;
~(00:|01:|02:|03:|04:|05:|06:|07:).*:.* 16K;
~(08:|12:|13:|18:).*:.* 8K;
~(19:|20:|21:|22:|23:).*:.* 16K;
}
limit_rate $limit_rate_time
传输多少内容后再限速。
语法:limit_rate_after size;
默认:limit_rate_after 0;
示例:limit_rate_after 500k;
设置默认的 MIME 类型。
语法:default_type mime-type;
默认值:default_type text/plain;
有时候我们不想浏览器直接播放文件,想直接下载文件,这时候我们可以配置成 default_type application/octet-stream;
,只要匹配到相应规则的时候就会下载文件。
访问控制。允许访问指定规则
语法:allow address | CIDR | unix: | all;
访问控制。拒绝访问指定规则
语法:deny address | CIDR | unix: | all;
示例:deny 192.168.1.1;
将字段添加到请求头。
语法:add_header name value [always];
前提是响应代码等于 200、201 (1.3.10)、204、206、301、302、303、304、307 (1.1.16、1.0.13) 或 308 (1.13) .0)。参数值可以包含变量。
如果指定了 always(1.7.5)参数,则无论响应代码如何,都会添加到请求头。
修改发送给客户端 body 的内容。可以是文本、变量及其组合。
语法:proxy_set_body value;
允许重新定义或添加字段传递给代理服务器的请求头,值可以包含文本、变量和它们的组合。
语法:proxy_set_header field value;
url 重定向。
语法:rewrite regex replacement [flag];
regex:匹配的正则表达表 replacement:替换内容 flag:
rewrite支持使用 if,set,正则,文件和目录判断
正则表达式匹配:
\= 等值的比较 ~ 与指定正则表达式模式匹配,区分字符大小写 * 与指定正则表达式模式匹配,不区分字符大小写 ! 与指定正则表达式模式不匹配,区分字符大小写 !~* 与指定正则表达式模式不匹配,不区分字符大小写
文件及目录匹配:
-f ,!-f 判断指定路径的文件是否存在 -d, !-d 判断指定路径的目录是否存在 -e, !-e 判断指定路径的文件或目录是否存在 -x, !-x 判断指定路径的文件是否存在且可执行 -r,!-r 判断指定路径的文件是否存在且可读 -w,!-w 判断指定路径的文件是否存在且可写
案例:
判断一个url请求中是否含有敏感字符,包含敏感字符则拒绝请求
location /{
#获取url完整请求
set $URL $scheme://$http_host$request_uri;
#根据获取的URL匹配一些限制字符,满足条件拒绝访
#这里以www字符为例,可自行修改
if ($URL ~ "fuck"){
echo "请求带有敏感字符'fuck',拒绝访问!";
#重定向到首页
#rewrite ^/(.*) http://www.home.com/ permanent;
}
echo "正常访问,url=" $URL;
}
将imgs重写到images
location /imgs {
rewrite ^/imgs/(.*\.jpg)$ /images/$1 break;
}
# 访问 /last.html 的时候,页面内容重写到 /index.html 中,并继续后面的匹配,浏览器地址栏URL地址不变
rewrite /last.html /index.html last;
# 访问 /break.html 的时候,页面内容重写到 /index.html 中,并停止后续的匹配,浏览器地址栏URL地址不变;
rewrite /break.html /index.html break;
# 访问 /redirect.html 的时候,页面直接302定向到 /index.html中,浏览器地址URL跳为index.html
rewrite /redirect.html /index.html redirect;
# 访问 /permanent.html 的时候,页面直接301定向到 /index.html中,浏览器地址URL跳为index.html
rewrite /permanent.html /index.html permanent;
# 把 /html/*.html => /post/*.html ,301定向
rewrite ^/html/(.+?).html$ /post/$1.html permanent;
# 把当前域名的请求,跳转到新域名上,域名变化但路径不变
rewrite ^/(.*) http://www.jd.com/$1 permanent;
开启后,URL重写的相关日志将以notice级别输出到error_log指令配置的日志文件汇总。
语法:rewrite_log on | off;
默认值:rewrite_log off;
给 server 指定 PEM 格式的证书。
语法:ssl_certificate file;
示例:ssl_certificate example.com.rsa.crt;
给 server 指定 PEM 格式的密钥。
语法: ssl_certificate_key file;
示例:ssl_certificate_key example.com.rsa.key;
设置存储会话参数的缓存的类型和大小。
语法: ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
builtin:内置 OpenSSL 的缓存;仅由一个工作进程使用。缓存大小在会话中指定。如果未给出大小,则等于 20480 个会话。使用内置缓存会导致内存碎片。
shared:在所有工作进程之间共享的缓存。缓存大小以字节为单位指定;一兆字节可以存储大约 4000 个会话。每个共享缓存都应该有一个任意名称。可以在多个虚拟服务器中使用具有相同名称的缓存。
两个可以同时使用 ssl_session_cache builtin:1000 shared:SSL:10m;
指定启用的密码,密码格式遵循 OpenSSL 标准。
指定网站默认页。如果包括多个文件,Nginx会根据文件的枚举顺序来检查,直到查找的文件存在;
语法:index file ...;
语法:
listen address[:port] [default_server] [ssl] [http2 | quic | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen port [default_server] [ssl] [http2 | quic | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen unix:path [default_server] [ssl] [http2 | quic | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。