【nginx】详细配置

这里写目录标题

    • location
    • return
    • if
    • 变量参数
    • 访问限流
      • limit_req_zone
      • limit_req

location

location
语法: location[=|~|~*|^~|@]/uri/{...}
 
配置块: 
server location会尝试根据用户请求中的URI来匹配上面的/uri表达式,
  1. = 进行普通字符精确匹配。也就是完全匹配,非正则。一旦匹配成功,则不再查找其他匹配项;
  2. ^~ 表示普通字符匹配。使用前缀匹配,非正则。如果有多个匹配则使用表达式最长的那个;
  3. ~* 表示执行一个正则匹配不区分大小写。一旦匹配成功,则不再查找其他匹配项;
  4. ~ 表示执行一个正则匹配区分大小写。一旦匹配成功,则不再查找其他匹配项;
  5. @ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

return

语法:return code [text] return code URL;
return URL;

配置块:server,location,if
该指令用于结束规则的执行并返回状态吗给客户端。

状态码包括:
204(No Content)
400(Bad Request)
402(Payment Required)
403(Forbidden) 
404(Not Found)
405(Method Not Allowed)
406(Not Acceptable)408(Request Timeout)
410(Gone)
411(Length Required)
413(Request Entity Too Large)
416(Requested Range Not Satisfiable)
500(Internal Server Error)
501(Not Implemented)
502(Bad Gateway)503(Service Unavailable)
504(Gateway Timeout)

示例,如果访问的URL以.sh .bash 结尾,返回状态码403

location ~ .*\.(sh|bash)?$ {
    return 403;
}

if

语法:if(condition){...}
默认值:无
配置块:server,location
对给定的条件condition进行判断。

条件(conditon)可以是以下任何内容:

  1. 一个变量名,空字符串、以0开始的字符串都为false
  2. = ,!=, 比较的一个变量和字符串
  3. ~, ~*,与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用单引号'包围
  4. -f, !-f ,检查一个文件是否存在
  5. -d, !-d ,检查一个目录是否存在
  6. -e, !-e, 检查一个文件、目录、符号链接是否存在
  7. -x, !-x, 检查一个文件是否可执行

自定义变量使用示例:

set $var hello;

if($host != '${var}:8080'){
	return 403;
}
或
if($host != $var:8080){
	return 403;
}

变量参数

$args                    #请求中的参数值
$query_string            #同 $args
$arg_NAME                #GET请求中NAME的值
$is_args                 #如果请求中有参数,值为"?",否则为空字符串
$uri                     #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。
$document_uri            #同 $uri
$document_root           #当前请求的文档根目录或别名
$host                    #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称
$hostname                #主机名
$https                   #如果开启了SSL安全模式,值为"on",否则为空字符串。
$binary_remote_addr      #客户端地址的二进制形式,固定长度为4个字节
$body_bytes_sent         #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$bytes_sent              #传输给客户端的字节数
$connection              #TCP连接的序列号
$connection_requests     #TCP连接当前的请求数量
$content_length          #"Content-Length" 请求头字段
$content_type            #"Content-Type" 请求头字段
$cookie_name             #cookie名称
$limit_rate              #用于设置响应的速度限制
$msec                    #当前的Unix时间戳
$nginx_version           #nginx版本
$pid                     #工作进程的PID
$pipe                    #如果请求来自管道通信,值为"p",否则为"."
$proxy_protocol_addr     #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
$realpath_root           #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
$remote_addr             #客户端地址
$remote_port             #客户端端口
$remote_user             #用于HTTP基础认证服务的用户名
$request                 #代表客户端的请求地址
$request_body            #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
$request_body_file       #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传 递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion      #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
$request_filename        #当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_length          #请求的长度 (包括请求的地址,http请求头和请求主体)
$request_method          #HTTP请求方法,通常为"GET"或"POST"
$request_time            #处理客户端请求使用的时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$request_uri             #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
$scheme                  #请求使用的Web协议,"http" 或 "https"
$server_addr             #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
$server_name             #服务器名
$server_port             #服务器端口
$server_protocol         #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"
$status                  #HTTP响应代码
$time_iso8601            #服务器时间的ISO 8610格式
$time_local              #服务器时间(LOG Format 格式)
$cookie_NAME             #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
$http_NAME               #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",$http_accept_language即可
$http_cookie        #请求的所有cookie
$http_host               #请求地址,即浏览器中你输入的地址(IP或域名)
$http_referer            #url跳转来源,用来记录从那个页面链接访问过来的
$http_user_agent         #用户终端浏览器等信息
$http_x_forwarded_for    #客户端的IP和代理服务器的IP,以逗号隔开;可伪造
$http_x_forwarded_proto  #请求的协议
$sent_http_NAME          #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可
$sent_http_cache_control
$sent_http_connection
$sent_http_content_type
$sent_http_keep_alive
$sent_http_last_modified
$sent_http_location

访问限流

ngx_http_limit_req_module模块是默认安装的
limit_req_zone指令可进行限流访问,防止用户恶意攻击刷爆服务器

在http模块下

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
limit_req_zone $binary_remote_addr$uri zone=two:10m rate=1r/m;

在location
对于同一ip不同请求地址,限制平均速率为1请求/秒,超过部分进行延迟处理,若超过1请求/秒,丢弃超过部分

location /api/index/login {
        proxy_pass http://127.0.0.1:8082/index/login; 
        limit_req zone=one burst=1 nodelay;
 }

对于同一ip相同请求地址,限制平均速率为1请求/秒,超过部分进行延迟处理,若超过1请求/秒,丢弃超过部分

location / {
        root   /opt/webapp;
        index  index.html index.htm;
        limit_req zone=two burst=1 nodelay;
}

limit_req_zone

语法

limit_req_zone key zone=name:size rate=rate;
  • 只能在http块中使用
  • key:匹配请求,则进入zone,可以是文本、变量,通常为Nginx变量。
    $binary_remote_addr(客户的ip),$uri(不带参数的请求地址),$request_uri(带参数的请求地址),$server_name(服务器名称)。
  • zone:指定该zone名称
  • size:指定内存大小,1m可以保持16000个状态
  • rate:限速,使用rate=1r/s,限制平均1秒不超过1个请求。使用rate=1r/m,限制平均1分钟不超过1个请求
# 同一ip不同请求地址,进入名为one的zone,限制速率为5请求/秒
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
# 同一ip同一请求地址,进入名为two的zone,限制速率为1请求/分钟
limit_req_zone $binary_remote_addr$uri zone=two:10m rate=1r/m;

limit_req

语法

imit_req zone=name [burst=number] [nodelay];
  • 可在http, server, location块中使用
  • zone:被声明过的名字
  • burst(可选):指定最大突发请求数,及缓存队列,延迟处理超过rate限制的请求
  • nodelay(可选):在突发请求数大于burst时,会丢弃掉这部分请求
server {
    location /search/ {
        limit_req zone=one burst=5;
    }
}

burst=5时:

  1. 请求速率 < rate(1r/s),正常处理
  2. rate(1r/s) < 请求速率 < burst(5r/s),大于rate部分延迟
  3. burst(5r/s) < 请求速率,大于burst部分丢弃(返回503服务暂时不可用)

你可能感兴趣的:(运维,nginx,运维)