前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nginx Server 节点常用指令

nginx Server 节点常用指令

原创
作者头像
啵啵肠
发布2023-11-20 14:18:03
2090
发布2023-11-20 14:18:03
举报
文章被收录于专栏:知无不言 - 畅所欲言

Server 节点


error_log

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 级别的日志。

示例:

代码语言:lua
复制
server {
        error_log /path/to/log debug;
	}
access_log

请求访问日志。

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

当然也可以关闭当前配置:access_log off;

  • path 表示指定日志存放位置,当然,这个也可以使用 syslog:memory: 配置。
  • format 表示日志格式即日志中记录的内容
  • buffer 用于指定日志写入时的缓存大小,默认 64k
  • gzip 日志写入前先压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢,默认1
  • flush 设置缓存的时间,如果超过flush指定的时间,缓存中的内容将被清空
  • if 判断条件,如果指定的条件计算为0或空字符串,那么该请求不会被写入日志

设置 buffer 的目的,是为了避免高频对磁盘进行读写操作,即暂时先不将日志写入磁盘,而是存入内存中,等达到了设置缓存大小之后再一次性写入,注意 flush 指令是和 buffer 一起使用的,即指定 buffer=size 之后,如果超过 flush 指令设定的时间仍然未达到缓存区大小,则也会被写入到磁盘,没有 buffer 而只有 flush 则会报错。

format 如果未配置的话默认使用 combined,当然如果想指定格式的话可以在 log_format 中指定,具体可参数上一篇。

client_header_buffer_size

设置请求行+请求头的大小,如果请求超过当前配置大小,则使用 large_client_header_buffers 配置,如果还是超过 large_client_header_buffers 配置大小,则返回 414 状态码。

语法:client_header_buffer_size size; 默认值:client_header_buffer_size 1k;

large_client_header_buffers

指定客户端请求中较大的消息头的缓存最大数量和大小。

语法:large_client_header_buffers number size; 默认值:large_client_header_buffers 4 8k;

client_max_body_size

设置客户端请求服务器最大允许大小,如果需要上传大文件的话,则需要修改当前的配置项。

语法:client_max_body_size size; 默认值:client_max_body_size 1m;

client_body_buffer_size

设置客户端请求正文的 buffer 大小。如果超过 buffer 的大小的话,请求正文就会放置在临时文件当时,引起系统的 IO。

语法:client_body_buffer_size size; 默认值:client_body_buffer_size 8k|16k;

在 x86, 其他 32 位、x86-64 系统上默认是 8k,64 位系统上默认是 16K。

connection_pool_size

设置每个连接的内容分配,对性能影响小,一般不建议使用。

语法:connection_pool_size size; 默认值:connection_pool_size 256|512;

32位系统上是256字节,64位上是512字节。

limit_conn_zone

定义了一个会话状态存储区域,里边记录会话状态的信息

语法: 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

限制最大连接数。

语法:limit_conn zone number;

示例:limit_conn addr 1;

配合上面的 limit_conn_zone 使用,连接数通过 key 来判断。超出限制的连接直接返回 limit_conn_status 配置的状态码信息。

limit_req_zone

定义了一个会话状态存储区域,里边记录会话状态的信息。

语法: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

语法: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

限制客户端速率。

语法:limit_rate rate; 默认:limit_rate 0;

示例:limit_rate 4k;

限速是根据客户端连接来限速的,当客户端开启两个连接,那么每个连接限速 4k。

它还可以配合变量来动态限速:

代码语言:ruby
复制
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

传输多少内容后再限速。

语法:limit_rate_after size; 默认:limit_rate_after 0;

示例:limit_rate_after 500k;

default_type

设置默认的 MIME 类型。

语法:default_type mime-type; 默认值:default_type text/plain;

有时候我们不想浏览器直接播放文件,想直接下载文件,这时候我们可以配置成 default_type application/octet-stream;,只要匹配到相应规则的时候就会下载文件。

allow

访问控制。允许访问指定规则

语法:allow address | CIDR | unix: | all;

deny

访问控制。拒绝访问指定规则

语法:deny address | CIDR | unix: | all;

示例:deny 192.168.1.1;

add_header

将字段添加到请求头。

语法: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)参数,则无论响应代码如何,都会添加到请求头。

proxy_set_body

修改发送给客户端 body 的内容。可以是文本、变量及其组合。

语法:proxy_set_body value;

proxy_set_header

允许重新定义或添加字段传递给代理服务器的请求头,值可以包含文本、变量和它们的组合。

语法:proxy_set_header field value;

rewrite

url 重定向。

语法:rewrite regex replacement [flag];

regex:匹配的正则表达表 replacement:替换内容 flag:

  • last : 本条规则匹配完成后,继续向下匹配新的location URI规则
  • break: 本条规则匹配完成即终止,不再匹配后面的任何规则
  • redirect : 回302临时重定向,浏览器地址会显示跳转后的URL地址 (防爬虫)
  • permanent : 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

rewrite支持使用 if,set,正则,文件和目录判断

正则表达式匹配:

\= 等值的比较 ~ 与指定正则表达式模式匹配,区分字符大小写 * 与指定正则表达式模式匹配,不区分字符大小写 ! 与指定正则表达式模式不匹配,区分字符大小写 !~* 与指定正则表达式模式不匹配,不区分字符大小写

文件及目录匹配:

-f ,!-f 判断指定路径的文件是否存在 -d, !-d 判断指定路径的目录是否存在 -e, !-e 判断指定路径的文件或目录是否存在 -x, !-x 判断指定路径的文件是否存在且可执行 -r,!-r 判断指定路径的文件是否存在且可读 -w,!-w 判断指定路径的文件是否存在且可写

案例:

代码语言:shell
复制
判断一个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;
rewrite_log

开启后,URL重写的相关日志将以notice级别输出到error_log指令配置的日志文件汇总。

语法:rewrite_log on | off; 默认值:rewrite_log off;

ssl_certificate

给 server 指定 PEM 格式的证书。

语法:ssl_certificate file;

示例:ssl_certificate example.com.rsa.crt;

ssl_certificate_key

给 server 指定 PEM 格式的密钥。

语法: ssl_certificate_key file;

示例:ssl_certificate_key example.com.rsa.key;

ssl_session_cache

设置存储会话参数的缓存的类型和大小。

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

builtin:内置 OpenSSL 的缓存;仅由一个工作进程使用。缓存大小在会话中指定。如果未给出大小,则等于 20480 个会话。使用内置缓存会导致内存碎片。

shared:在所有工作进程之间共享的缓存。缓存大小以字节为单位指定;一兆字节可以存储大约 4000 个会话。每个共享缓存都应该有一个任意名称。可以在多个虚拟服务器中使用具有相同名称的缓存。

两个可以同时使用 ssl_session_cache builtin:1000 shared:SSL:10m;

ssl_ciphers

指定启用的密码,密码格式遵循 OpenSSL 标准。

index

指定网站默认页。如果包括多个文件,Nginx会根据文件的枚举顺序来检查,直到查找的文件存在;

语法:index file ...;

listen

语法:

代码语言:text
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • error_log
  • access_log
  • client_header_buffer_size
  • large_client_header_buffers
  • client_max_body_size
  • client_body_buffer_size
  • connection_pool_size
  • limit_conn_zone
  • limit_conn
  • limit_req_zone
  • limit_req
  • limit_rate
  • limit_rate_after
  • default_type
  • allow
  • deny
  • add_header
  • proxy_set_body
  • proxy_set_header
  • rewrite
  • rewrite_log
  • ssl_certificate
  • ssl_certificate_key
  • ssl_session_cache
  • ssl_ciphers
  • index
  • listen
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档