我是靠谱客的博主 粗犷鸡翅,最近开发中收集的这篇文章主要介绍Nginx应用进阶(HTTP核心模块)connection和requestlimit_conn模块(对connection做处限制)limit_req模块(对request处理速率做出限制)access模块(限制特定ip或网段)auth_basic模块(限制特定用户访问)auth_request模块(基于HTTP响应码做权限控制)rewrite模块autoindexTCP连接相关变量,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

connection和request

connection就是我们常说的tcp连接
而request即请求,例如我们web开发常用的http协议,该应用层协议必须建立在connection的tcp协议之上。

limit_conn模块(对connection做处限制)

简介

该模块nginx会默认编译进去的,用于限制单位时间段内单客户连接并发数。使用的是共享内存,对所有worker子进程都生效。

指令

limit_conn_zone

语法格式:limit_conn_zonn key值 zone=自定义名称.共享空间大小
默认值:无
上下文:http
示例:limit_conn_zonn $binary_remote_addr zone=addr.10m

注意我们使用的key为binary_remote_addr,原因很简单,binary_remote_addr默认只用4字节的空间,而remote_addr却需要7-15个字节的空间。
上面的配置我们共享空间使用了10m,我们都知道1m可以维护3w2个连接,所以10m的共享空间足够了。

limit_conn_status

语法格式:limit_conn_status code;
默认值: limit_conn_status 503;
上下文:http、server、location

limit_conn_log_level

语法:limit_conn_log_level info | notice | warn | error;
默认值:limit_conn_log_level error;
上下文:http、server、location

limit_conn

语法:limit_conn_log_level info | notice | warn | error;
默认值:limit_conn_log_level error;
上下文:http、server、location

演示每个用户同一个时间段只能请求两次

在http模块增加下面这段配置,意味建立一个共享内存为10m的limit_conn模块。

 limit_conn_zone $binary_remote_addr zone=limit_addr:10m;

server模块配置如下

 server {
        listen       8081;
        server_name  localhost;

        location / {
            root   /etc/nginx/html;
            index  index.html;
            # 并发数超过2返回503
            limit_conn_status 503;
            # 打印的日志等级为warn
            limit_conn_log_level warn;
            # 
            limit_conn limit_addr 2;
            # 为了演示并发请求不超过2这里nginx向客户端传送响应的速率修改为150字节每秒
            limit_rate 150;

        }

配置后可以检查一下,在让nginx进行一次重载

/usr/sbin/nginx -t
 1004  /usr/sbin/nginx -s reload

可以看到若单位时间内连续刷新页面就会出现503错误页面

在这里插入图片描述

limit_req模块(对request处理速率做出限制)

简介

用于限制客户端请求的连接速率,nginx默认会编译该模块,使用共享内存,对所有worker子进程都有效。而限流算法用的是leaky_bucket算法。
如下图,上方表格0-212Mbps,而7-92Mbps,计算一下10s内Mbps为12*2+2*3=30,所以平均一下10s的速率我们可以设定为3Mbps,这样将突发的流量削平,确保应用稳定,当请求超过的负载后就会被拒绝。

在这里插入图片描述

语法

limit_req_zone

语法: limit_req_zone key zone=自定义名称:共享空间大小 rate=速率值
默认值:无
上下文:http
示例:limit_req_zone $binary_remote_addr zone =one:10m rate=2r/m

limit_req_status

语法: limit_req_status code
默认值:limit_req_status 503
上下文:http、server、location

limit_req_log_level

语法: limit_req_log_level info | notice |warn |error
默认值:limit_req_log_level 503
上下文:http、server、location

limit_req

语法:limit_req zone =name [burst=number] [nodelay | delay =number];
默认值: 无
上下文:http、server、location
示例:limit_req=one;

示例

http模块添加以下配置,即创建一个限流模块,一分钟只能请求两次即30s内只能请求一次

limit_req_zone $binary_remote_addr zone=limit_req:15m rate=2r/m;

server模块添加如下配置

 location / {
            root   /etc/nginx/html;
            index  index.html;
            # 连接数超过数量返回504
            limit_req_status 504;
            # 打印的日志级别为notice
            limit_req_log_level notice;
            # 使用上面配置的limit_req模块
            limit_req zone=limit_req;
            # 下面这条配置会在2+7次连接后报504
            # limit_req zone=limit_req burst=7 nodelay;



        }

从access.log中可以看到请求超过2之后就会在日志出现notice日志

在这里插入图片描述

access模块(限制特定ip或网段)

简介

用于限制特定网段、ip地址的访问

语法

allow

语法:allow address | cidr | unix |all;
默认值:无
上下文:http、server、location、limit_except
示例: allow 192.168.1.110;

deny

语法:deny address | cidr | unix |all;
默认值:无
上下文:http、server、location、limit_except
示例: deny 192.168.1.0/24;

组合示例

location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}

示例

 location / {
            root   /etc/nginx/html;
            allow 192.168.0.0/24
            deny all;
            index  index.html;
            limit_req_status 504;
            limit_req_log_level notice;
            limit_req zone=limit_req burst=7 nodelay;
#           limit_req zone=limit_req burst=7 nodelay;

        }


auth_basic模块(限制特定用户访问)

简介

基于http authentication协议进行用户密码认证,默认已编译进nginx。

语法

字符串

语法: auth_basis string | off ;
默认值: auth_basic off;
上下文: http、server、location、limit_except;

文件

语法: auth_basic_user_file file;
默认值: -
上下文:http、server、location、limit_except;

示例

首先需要安装这两个依赖

yum -y install apr apr-util

然后再安装http-tool

rpm -ivh httpd-tools-2.4.6-90.el7.centos.x86_64.rpm

然后进入nginx目录执行下方命令

# 创建一个auth文件夹
 mkdir auth
 # 进入该文件夹
 cd auth/
 # 创建一个encry_pass 文件,添加一个jack用户,密码为123456
htpasswd -b -c encry_pass jack 123456
# 追加一个mike用户
htpasswd -b  encry_pass mike 123456


此时使用cat指令就可以看到下方内容

jack:$apr1$.H1TiTiN$Sid9MY8sU9wirj5X56u3Q1
mike:$apr1$L8gMN2Lp$ZT7rrOuza0ELPrVc.o3uu1

 location / {
            root   /etc/nginx/html;

            index  index.html;
            auth_basic "test user pass";
           auth_basic_user_file /etc/nginx/auth/encry_pass;
        }



这时候我们键入网站就会弹出这个页面,输入上文的账号密码即可进入页面

在这里插入图片描述

auth_request模块(基于HTTP响应码做权限控制)

简介

基于http响应码部署一个鉴权服务器,做到访问控制,该模块默认未编译进nginx。

在这里插入图片描述

语法

基于uri

语法:auth_request uri |off;
默认值: auth_request off;
上下文:http、server、location

基于变量

语法: auth_request|_set $variable value;
默认值:-
上下文:http、server、location

示例

在这里插入图片描述

rewrite模块

return指令

简介

该指令会直接返回http响应码或者重定向到指定的url,return指令之后的语句都不会被执行。

语法

return code [text](text为可选项文本);
return code URL;
return URL;

默认值 :-

上下文:server、location、if

示例

 server {
        listen       8081;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   /etc/nginx/html;
           return 404;
            index  index.html;

        }

在这里插入图片描述
我们也可以返回404,并响应一个页面

server {
        listen       8081;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   /etc/nginx/html;
            # 响应302 并跳转到notFound这个映射
           return 302 /notFound;
            index  index.html;

        }


        location /notFound {
            root   /etc/nginx/html;
		# 注意 我们必须在nginx的html文件夹下创建一个notFound文件夹,然后创建一个notFound.html
            index  notFound.html;

        }
}

可以看到被重定向到notFound了

在这里插入图片描述

还有一个是地址重定向的,不多赘述,即通过/ 302跳转到notFound这个地址

 server {
        listen       8081;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   /etc/nginx/html;
           return http://192.168.0.104:8081/notFound/;
            index  index.html;

        }


        location /notFound {
            root   /etc/nginx/html;

            index  notFound.html;

        }
}

rewrite指令

简介

指定请求重定向到对应映射

语法

语法:rewire regex replacement [flag];
默认值:无
上下文:server、location、if
示例:rewrite/images/(.*.jpg)$ /pic/$1

rewrite中的flag
last:重写后的URL会再次进入server段匹配location
break:匹配到下一个url后不再匹配其他location
redirect:302临时重定向
permanent:301永久重定向

示例

永久重定向到notFound

 server {
        listen       8081;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
#            root   /etc/nginx/html;
           rewrite ^/(.*) http://192.168.0.104:8081/notFound permanent;
 #           index  index.html;

        }


        location /notFound {
            root   /etc/nginx/html;

            index  notFound.html;

        }
}

在这里插入图片描述

示例2 ,如下所示rewrite,下面这段命令就会一直跳到photos 这个location上

server {
        listen       8081;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

       


        location /images {
        # 跳转/images 注意这里我们需要在html创建一个images文件夹,并在下面创建一个test.html
            rewrite /images/(.*) /pics/$1 ;
       
        }

        location /pics {
        # 跳转/photos 注意这里我们需要在html创建一个pics文件夹,并在下面创建一个test.html
            rewrite /pics/(.*) /photos/$1 ;
       
        }

        location /photos {
            return 200 "return 200 in /photos";

        }

可以看到跳转到photo这个映射

在这里插入图片描述
示例3 在rewrite后面增加break,执行images时会直接获取/pics映射资源,不会重新遍历location

 server {
        listen 8081;
        server_name localhost;
        root html;

  

        location /images {
            rewrite /images/(.*) /pics/$1 break;
   
        }

        location /pics {
            rewrite /pics/(.*) /photos/$1 ;
      
        }

        location /photos {
            return 200 "return 200 in /photos";
        }

在这里插入图片描述

执行结果,可以看到获取的结果就是html的page文件夹下的资源

 curl 10.168.104.32:8081/images/test.html
this is pics page

return和rewrite执行顺序

如下所示,遇到last会重新遍历查找location,若没加last或者break则顺序执行,遇到return就返回结果不再执行后续动作。

  server {
        listen 8081;
        server_name localhost;
        root html;

        location /search {
            rewrite /(.*) http://www.cctv.com permanent;
        }

        location /images {
            rewrite /images/(.*) /pics/$1 last;
            return 200 "return 200 in /images";
        }

        location /pics {
            rewrite /pics/(.*) /photos/$1 ;
            return 200 "return 200 in /pics";
        }

        location /photos {
            return 200 "return 200 in /photos";

        }

在这里插入图片描述

所以最终结果如下

 curl 10.168.104.32:8081/images/test.html
return 200 in /pics

rewrite的if指令

语法: if(condition){};
默认值:无
上下文:server、location
示例:

 if($http_user_agent ~ Chrome){
	rewirte /(.*) /browser/$1 break;
}

condition:

  1. $variable:仅为变量时,值为空或以0开头字符串都会被当作false处理
  2. =或者!=: 等于或者不等于
  3. ~或!~:匹配或者不匹配
  4. ~*: 正则匹配,不区分大小写
  5. -f或!-f:检查文件存在或者不存在
  6. -d 或者!-d:检查目录存在或不存在
  7. -e 或!-e:检查文件、目录、符号连接等存在或不存在
  8. -x或!-x:检查文件可执行或不可执行

示例1:若远程连接的ip地址为指定ip返回200

配置

 server{
                                listen 8081;
                                server_name localhost;
                                root html;
                                # 注意,这里我们需要为search专门在html中配置一个search的文件夹并创建index.html文件,否则会报404
                          location /search/ {

               			 if ( $remote_addr = "103.0.0.0") {
                  			      return 200 "test if ok ";
            			    }
                }

          }

假如我们不用指定ip访问,就会报如下问题

[root@localhost ~]# curl 10.168.104.32:8081/search
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.10.2</center>
</body>
</html>

若使用指定ip访问

在这里插入图片描述

示例2 若location匹配到images,我们就将其重写到pics目录下

 server{
                                listen 8081;
                                server_name localhost;
                                root html;
                          location / {
				# 如果匹配到的uri为images,则重写到pics目录下
                if ( $uri  = "/images/") {
                        rewrite (.*) /pics/ break;
                }

                                         }
                      }

测试

curl http://10.168.104.32:8081/images/
# 可以看到输出结果跳转到了index html了
this is pics index html


autoindex

作用:当请求的location以/结尾时,会以文件格式显示,常用于提供于对外文件下载
指令集:

1. autoindex
		语法:autoindex on |off
		默认值:autoindex off;
		上下文:http、server、location
2. autoindex_exact_size
	   语法: autoindex_exact_size on | off;
	   默认值:autoindex_exact_size on;
	   上下文: http、server、location
3. autoindex_format(重点 决定文件目录的格式)
		语法:autoindex_format html | xml | json | jsonp
		默认值:autoindex_format html;
		上下文:http、server、location
	
4. autoindex_localtime
		语法:autoindex_localtime on |off;
		默认值:autoindex_localtime off;
		上下文:http、server、location

示例

  server{
                                listen 8081;
                                server_name localhost;

                          location /download/ {
                          			# 这里选定目录为tmp目录,所以我们需要在tmp目录下新建一个download文件夹,否则会报404
                                    root /tmp;
                                    # 注意若该目录下有a.html页面就不会显示下载文件而是显示a.html的内容
                                   index a.html;
                                   # 开启autoindex
                                   autoindex on;
                                   # 配置为off就不会精确计算大小,更好看一些
                                   autoindex_exact_size on;
                                   autoindex_format html;
                                   # on的话会按照24消失进行计算
                                   autoindex_localtime off;


                              }



                   }

显示结果

在这里插入图片描述

TCP连接相关变量

分类

  1. TCP连接变量
  2. HTTP请求变量
  3. nginx处理HTTP请求变量
  4. nginx返回响应变量
  5. nginx内部变量

TCP连接相关变量

		remote_addr				客户端地址,例如192.168.1.1
		remote_port				客户端端口,例如58473
		binary_remote_addr		客户端地址的整型格式
		connection				已处理连接,是一个递增的序号
		connection_request		当前连接上执行的请求数,对于keepalive连接有意义
		proxy_protocol_addr		如果使用proxy_protocol协议,则返回原始用户的地址,否则为空
		proxy_protocol_port		如果使用proxy_protocol协议,则返回原始用户的端口,否则为空
		server_addr				服务器地址,例如192.168.184.240
		server_port				服务器端口,例如80
		server_protocol			服务端协议,例如HTTP/1.1

配置

 server{
                                listen 8081;
                                server_name localhost;


                location / {
                        return 200 "remote_addr:               $remote_addr
                        remote_port:            $remote_port
                        server_addr:            $server_addr
                        server_port:            $server_port
                        server_protocol:        $server_protocol
                        connection:             $connection
                        proxy_protocol_addr:    $proxy_protocol_addr

";
        }

演示

# 可以看到connection不断+1
[root@localhost download]# curl 10.168.104.32:8081
remote_addr:           10.168.104.32
                        remote_port:            54868
                        server_addr:            10.168.104.32
                        server_port:            8081
                        server_protocol:        HTTP/1.1
                        connection:             20
                        proxy_protocol_addr:

[root@localhost download]# curl 10.168.104.32:8081
remote_addr:           10.168.104.32
                        remote_port:            54870
                        server_addr:            10.168.104.32
                        server_port:            8081
                        server_protocol:        HTTP/1.1
                        connection:             21
                        proxy_protocol_addr:

HTTP请求相关变量

		conten_length	请求包体头部长度
		content_type	请求包体类型
		arg_参数名		URL中某个参数
		args			所有URL参数
		is_args			URL中有参数,则返回?;否则返回空
		query_string	与args完全相同
		uri				请求的URL,不包含参数
		request_uri		请求的URL,包含参数
		scheme			协议名,http或者https
		request_method	请求的方法,GET、HEAD、POST等
		request_length	所有请求内容的大小,包含请求行,头部,请求体
		remote_user		由HTTP Basic Authentication协议传入的用户名
		request_body_file	暂缺
		request_body		暂缺
		request				暂缺

配置

 location / {
            auth_basic  "Test Auth";
            auth_basic_user_file  auth/encrypt_pass;
            return 200 "uri:                 $uri
	request_uri:         $request_uri
	scheme:              $scheme
	request_method:      $request_method
	request_length:      $request_length
	args:                $args
	is_args:             $is_args
	arg_pid:             $arg_pid
	query_string:        $query_string
	remote_user:         $remote_user
	host:                $host
";
        }

测试


[root@localhost download]# curl 10.168.104.32:8081?par=1
uri:                 /
request_uri:         /?par=1
scheme:              http
request_method:      GET
request_length:      88
args:                par=1
is_args:             ?
arg_pid:
query_string:        par=1
remote_user:
host:                10.168.104.32




[root@localhost download]# curl "10.168.104.32:8081?par=1&par2=2"
uri:                 /
request_uri:         /?par=1&par2=2
scheme:              http
request_method:      GET
request_length:      95
args:                par=1&par2=2
is_args:             ?
arg_pid:
query_string:        par=1&par2=2
remote_user:
host:                10.168.104.32

Nginx处理请求时相关变量(也可以作为配置变量,如limit_rate)

		request_time				请求处理到现在所耗费的时间,单位为秒,例如0.03代表30毫秒
		request_completion			请求处理完成,则返回OK,否则为空
		request_id					16进制显示的请求id,随机生成的
		server_name					匹配上请求的server_name值
		https						若开启https,则值为on,否则为空
		request_filename			待访问文件的完整路径
		document_root				由URI和root/alias规则生成的文件夹路径
		realpath_root				将document_root中的软链接换成真实路径
		limit_rate					返回响应时的速度上限值

Nginx返回响应时相关变量

		body_bytes_sent				响应体中真实内容的大小	
		body_sent					全部响应体大小
		status						HTTP返回状态码

最后

以上就是粗犷鸡翅为你收集整理的Nginx应用进阶(HTTP核心模块)connection和requestlimit_conn模块(对connection做处限制)limit_req模块(对request处理速率做出限制)access模块(限制特定ip或网段)auth_basic模块(限制特定用户访问)auth_request模块(基于HTTP响应码做权限控制)rewrite模块autoindexTCP连接相关变量的全部内容,希望文章能够帮你解决Nginx应用进阶(HTTP核心模块)connection和requestlimit_conn模块(对connection做处限制)limit_req模块(对request处理速率做出限制)access模块(限制特定ip或网段)auth_basic模块(限制特定用户访问)auth_request模块(基于HTTP响应码做权限控制)rewrite模块autoindexTCP连接相关变量所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部