一. POST_READ阶段

    1. 用户ip在http请求中的传递?

前提:Tcp连接四元组(src ip,src port,dst ip,dst port)

HTTP头部 X-Formarded-For 用于传递Ip

HTTP头部X-Real-IP用于传递IP

网络中存在许多反向代理

客户端的请求往往不会直接到达客户端,而是会经过多个代理服务器 比如CDN、Nginx等。如果一个客户端请求经由Nginx与上游服务器通讯,建立Tcp连接,那么Tcp连接四元组中保存的src ip和src port都是Nginx代理服务器的。而我们要想做限流,就必须拿到用户的IP地址。在Http协议中,提供了两个请求头可以实现这个功能:X-Formarded-For、X-Real-IP。

a)X-Formarded-For:保存每个节点的ip地址,形成一个链表

b)X-Real-IP:保存第一个节点的ip地址

    2. Nginx如何拿到用户IP地址?realip模块。

realip模块默认不会编译进Nginx,通过--with-http-realip-module启用功能

realip模块提供了两个变量来获取ip地址:binary_remote_addr(二进制数据,size较小)、remote_addr

指令:

a)set_real_ip_from address|CIDR|unix:定义什么样的连接才替换变量

b)real_ip_header field | X-Real-IP | X-Forward-For | proxy_protocol:定义变量从哪个header中取值

c)real_ip_recursive on | off:定义是否使用环回地址。默认不启用。开启时,如果X-Forward-For的最后一个地址与客户端地址相同,会删去最后一个地址。

二. SERVER_REWRITE和REWRITE阶段

这两个阶段所作的事情差不多,都是定制请求的后继行为,只不过配置的块不一样,作用域不一样。

    Rewrite模块

        提供了指令return、rewrite来改变客户端的行为,重定向或者直接返回状态码等。

rewrite模块不可删除。

1. return指令:向客户端返回信息

a)return code [text]

b)return code URL

            c)return URL

            思考:server与location下的return指令关系?

return与error_page指令的关系?

        2. rewrite指令:重写客户端请求

a) rewrite regex replacement [flag]

1. 将regex指定的这个url替换成replacement这个新的url,可以使用正则表达式及变量提取

2. 当replacement以http://或者https://或者$schema开头,则直接返回302重定向

3. 替换后的url根据flag指定的方式进行处理

- last:用replacement这个URI进行新的location匹配

- break:break指令停止当前脚本指令的执行

- redirct:返回302重定向

- permanent:返回301重定向

开启rewrite行为记入日志:rewrite_log on | off; 默认为off,所属块:http、server、location、if

b)if(condition){ ... }:基于变量做重定向

1. 检查变量为空或者值是否为0,直接使用

2. 将变量与字符串做匹配,使用=或者!=

3. 将变量与正则表达式做匹配

大小写敏感,~或者!~

大小写不敏感,~*或者!~*

4. 检查文件是否存在,-f或者!-f

5. 检查目录是否存在,-d或者!-f

6. 检查是否为可执行文件,-x或者!-x

7. 检查文件、目录、软连接是否存在,使用-e或者!-e

三. FIND-CONFIG阶段

寻找处理请求的location指令块。

指令:location、merge_slashes

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

location指令规则:仅匹配URI,忽略参数

  1. 合并连续的符号:merge_slashes  on

  2. 前缀字符串:

    常规匹配

    =:精准匹配

    ^~:匹配上后则不再进行正则表达式匹配

  3. 用于内部跳转的命令:location

  4. 正则表达式:

    ~:大小写敏感的正则匹配

    ~*:忽略大小写敏感的正则匹配

location匹配顺序

  1. 遍历匹配全部前缀字符串location

  2. 匹配上=字符串,使用匹配上的=精准匹配location,否则进入下一步

  3. 匹配上^~字符串,使用匹配上的^~字符串location,否则进入下一步

  4. 记住最长匹配的前缀字符串location,进入正则表达式匹配

  5. 按nginx.conf中的顺序依次匹配正则表达式location

  6. 匹配上,使用匹配上的正则表达式

  7. 未匹配上,使用最长匹配的前缀字符串location

总结优先级:=精准匹配前缀>^~停止正则匹配前缀>按位置顺序正则匹配>最长前缀匹配

注:前缀匹配符号:无符号、=符号、^~符号

正则匹配符号:~大小写敏感正则、~*大小写不敏感正则

四. preaccess阶段

1. 限制客户端的并发连接数

模块:http_limit_conn_moudule

默认编译进nginx,通过--without-http_limit_conn_module禁用

生效范围:全部worker进程(基于共享内存)

进入proaccess阶段前不生效

限制的有效性取决于key的设计:依赖postread阶段的realip模块的真实ip

limit_conn命令:

    1. 定义共享内存(包括名字和大小),以及key关键字

      limit_conn_zone key zone=name:size;

      context:http

    2. 限制并发连接数

      limit_conn zone number;

      context:http,server,location

    3. 限制发生时的日志级别

      limit_conn_log_level info | notice | warn | error;

      default:limit_conn_log_level error;

      context:http,server,location

    4. 显示发生时向客户端返回的错误码

      default:limit_conn_status  code;

      default:limit_conn_status  503;

      context:http,server,location

2. 限制每个客户端的每秒处理请求数

模块:http_limit_req_module

默认编译进nginx,通过--without-http_limit_req_module禁用功能

生效算法:leaky bucket 算法

生效范围:全部worker进程(基于共享内存)

进入proaccess前不会生效

限制的有效性取决于key的设计:依赖postread阶段的realip模块的真实ip

limit_req在limit_conn之前生效

limit_req命令:

    1. 定义共享内存(包括名字和大小),以及key关键字

      limit_req_zone key zone=name:size rate=rate;

      context:http

    2. 限制并发连接数

      limit_req zone =name [burst=number]  [nodelay];  

      context:http,server,location

    3. 限制发生时的日志级别

      limit_req_log_level info | notice | warn | error;

      default:limit_req_log_level error;

      context:http,server,location

    4. 显示发生时向客户端返回的错误码

      default:limit_req_status  code;

      default:limit_req_status  503;

      context:http,server,location

五. access阶段

1. 限制某些Ip地址的访问权限

模块:http_access_moudule

默认编译进nginx,通过--without-http_access_moudule禁用

生效范围:进入access阶段前不会生效

命令

Syntax: allow address | CIDR | unix: | all;

Default: —

Context: http, server, location, limit_except

Syntax: deny address | CIDR | unix: | all;

Default: —

Context: http, server, location, limit_except

示例

location / {

deny  192.168.1.1;

allow  192.168.1.0/24;

allow  10.1.1.0/16;

allow  2001:0db8::/32;

deny all;

}

2. 限制客户端登陆验证

RFC2617 HTTP Basic Authentication

auth_basic模块的指令

基于HTTP Basic Authutication 协议进行用户名密码的认证

默认编译进Nginx: --without-http_auth_basic_module disable ngx_http_auth_basic_module

Syntax: auth_basic string | off;

Default: auth_basic off;

Context: http, server, location, limit_except

Syntax: auth_basic_user_file file;

Default: —

Context: http, server, location, limit_except

3. 使用第三方做权限验证

模块:auth_request

默认未编译进nginx:--with-http_auth_request_module

功能:向上游的服务转发请求,若上游服务返回的响应码是2xx,则继续执行,若上游服务器返回的是401或者403,则将响应返回给客户端

原理:收到请求后,生成子请求,通过反向代理技术把请求参数传递给上游服务

Syntax: auth_request uri | off;

Default: auth_request off;

Context: http, server, location

Syntax: auth_request_set $variable value;

Default: —

Context: http, server, location

4. 限制所有access阶段模块的satisfy指令

Syntax: satisfy all | any;

Default: satisfy all;

​    ​    ​    ​Context: http, server, location

​    ​    ​设置为all:所有access模块都允许访问才能访问

​    ​设置为any:有一个access模块允许访问就能访问

六. procontent阶段

1. try_files指令

默认编译进nginx中,并且不能取消

功能:依次试图访问多个url对应的文件(由root或者alias指令指定),当文件存在时直接返回文件内容,如果所有文件都不存在,则按最后一个URL结果或者code返回

Syntax: try_files file ... uri;

try_files file ... =code;

Default: —

Context: server, location

2. mirror模块

实现零拷贝流量,将本次请求拷贝一份发送给指定的uri。比如将请求拷贝一份发送到测试服务器上。

默认编译进nginx中,通过--without-http_mirror_module移除模块

功能:处理请求时,生成子请求访问其他服务,对子请求的返回值不做处理

Syntax: mirror uri | off;

Default: mirror off;

Context: http, server, location

​    ​    ​Syntax: mirror_request_body on | off;

​            Default: mirror_request_body on;

​    ​    ​Context: http, server, location

七. content阶段

static模块,访问静态资源文件

1. root和alias指令

功能:将url映射为文件路径,以返回静态文件内容

差别:root会将完整的location的url映射进文件路径中

alias只会将location后边的url映射到文件路径中

Syntax: alias path;

Default: —

Context: location

Syntax: root path;

Default: root html;

Context: http, server, location,  if in location

2. static模块提供的三个变量

request_name(待访问文件的完整路径)

document_root(由URL和root/alias规则生成的文件夹路径)

realpath_root(将document_root中的软链接等换成真实路径)

3. static模块对url不以斜杠结尾却访问目录的做法

static模块实现了root/alias功能时,发现访问目录是目录,但URL结尾未加/时,会返回301重定向

指令:

absolute_redirect on | off;     是否使用绝对路径,on(会填写域名等),off(不会加域名)

Defalut:absolute_redirect on;

​    ​    ​    ​Context:http,server,location

​    ​    ​    ​server_name_in_redirect   on | off;

​    ​    ​    ​port_in_redirect    on | off;

3. index模块于auto_index模块

index模块

功能:对处理/时的处理,指定/访问时返回index文件内容

默认编译进nginx,不可取消

Syntax: index file ...;

Default: index index.html;

Context: http, server, location

auto_index模块

功能:当url以/结尾时,尝试以html/xml/json/jsonp等格式返回root、alias中指向目录的目录结构

默认编译进nginx,--without-http_autoindex_module取消

Syntax: autoindex on | off;

Default: autoindex off;

Context: http, server, location

Syntax: autoindex_exact_size on | off;

Default: autoindex_exact_size on;

Context: http, server, location

Syntax: autoindex_format html | xml | json | jsonp;

Default: autoindex_format html;

Context: http, server, location

Syntax: autoindex_localtime on | off;

Default: autoindex_localtime off;

Context: http, server, location

4. 提升多个小文件访问的concat模块

功能:当页面需要访问多个小文件时,把它们的内容合并到一次http响应中返回,提升性能

使用:在uri后加上??,后通过多个,逗号隔开文件。如果还有参数,则在最后通过?

concat  :on | off

default :concat off

Context :http, server, location

concat_types :MIME types

Default :concat_types: text/css application/x-javascript

Context :http, server, location

concat_unique :on | off

Default : concat_unique on

Context : http, server, location

concat_max_files :numberp

Default :concat_max_files 10

Context : http, server, location

concat_delimiter :string

Default :NONE

Context : http, server, locatione

concat_ignore_file_error :on | off

Default :off

Context :http, server, location

八. log阶段

记录请求日志的log模块

功能:将Http请求相关信息记录到日志

模块:ngx_http_log_module 无法禁用

命令:

1. 设置access日志格式

Syntax: log_format name [escape=default|json|none] string ...;

Default: log_format combined "...";

Context: http

2. 配置access日志文件路径

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

access_log off;

Default: access_log logs/access.log combined;

Context: http, server, location, if in location, limit_except

3. 优化不用每次写日志都打开关闭日志文件

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

open_log_file_cache off;

Default: open_log_file_cache off;

Context: http, server, location

说明:max  缓存内的最大文件句柄数,超出后使用LRU算法淘汰

inactive  文件访问完后在这段时间内不会被关闭。默认10秒

min_uses  在inactive时间内使用次数超过min_uses才会继续存在内存中。默认是1

vaild  超出vaild时间后,将对缓存的日志文件检查是否存在。默认是60秒

off  关闭缓存功能

九. 过滤模块

1. 替换响应中的字符串:sub模块

功能:将响应中的指定的字符串,替换成新的字符串

模块:ngx_http_sub_filiter_modulem模块

默认未编译进nginx,通过--with-http_sub_module启用

指令:

Syntax: sub_filter string replacement;

Default: —

Context: http, server, location

Syntax: sub_filter_last_modified on | off;

Default: sub_filter_last_modified off;

Context: http, server, location

Syntax: sub_filter_once on | off;

Default: sub_filter_once on;

Context: http, server, location

Syntax: sub_filter_types mime-type ...;

Default: sub_filter_types text/html;

Context: http, server, location

2. 在响应的前后添加内容:addition模块

功能:在响应前后增加内容,而增加内容的方式是通过新增子请求的响应完成

模块:ngx_http_addition_filter_module

默认未编译进nginx,通过--with-http_addtion_filter_module启用

Syntax: add_before_body uri;

Default: —

Context: http, server, location

Syntax: add_after_body uri;

Default: —

Context: http, server, location

Syntax: addition_types mime-type ...;

Default: addition_types text/html;

Context: http, server, location

[Day4] Nginx Http模块二的更多相关文章

  1. [Day4] Nginx Http模块一

    之前介绍了Nginx作为静态资源服务器的用法,​除此之外,Nginx更多的场景是作为反向代理服务器,提高网站的并发和可用性.下面几节着重说一下作为反向代理的http模块,并且了解一些Nginx的架构. ...

  2. NGINX常用模块(二)

    5.Nginx日志配置 Nginx有非常灵活的日志记录模式.每个级别的配置可以有各自独立的访问日志.日志格式 通过log_format命令定义格式 1.log_format指令 # 配置语法:包括:e ...

  3. NGINX模块(二)

    [Nginx标准HTTP模块] 一.HTTP核心模块 指令1:alias 语法:alias file-path|directory-path; 默认值:no 使用字段:location 说明:这个指令 ...

  4. 转载:Centos7 从零编译Nginx+PHP+MySql 二

    序言 这次玩次狠得.除了编译器使用yum安装,其他全部手动编译.哼~ 看似就Nginx.PHP.MySql三个东东,但是它们太尼玛依赖别人了. 没办法,想用它们就得老老实实给它们提供想要的东西. 首先 ...

  5. nginx事件模块分析(一)

    nginx ngx_events_module模块分析 ngx_events_module模块是核心模块之一,它是其它所有事件模块的代理模块.nginx在启动时只与events模块打交道,而由even ...

  6. Nginx学习之二-配置项解析及编程实现

    在开发功能灵活的Nginx模块时,需要从配置文件中获取特定的信息.不过,我们并不需要再编写一套读取配置的系统,Nginx已经为用户提供了强大的配置项解析机制,同时还支持“-s reload”命令,可以 ...

  7. nginx自定义模块编写-根据post参数路由到不同服务器

    nginx可以轻松实现根据不同的url 或者 get参数来转发到不同的服务器,然而当我们需要根据http包体来进行请求路由时,nginx默认的配置规则就捉襟见肘了,但是没关系,nginx提供了强大的自 ...

  8. [转帖]nginx upstream模块--负载均衡

    nginx upstream模块--负载均衡 https://www.cnblogs.com/linjiqin/p/5494783.html Module ngx_http_upstream_modu ...

  9. Nginx自定义模块编写:根据post参数路由到不同服务器

    Nginx自定义模块编写:根据post参数路由到不同服务器 2014-05-05 15:27 blogread IT技术博客 字号:T | T Nginx可以轻松实现根据不同的url 或者 get参数 ...

随机推荐

  1. 分享18道Java基础面试笔试题(面试实拍)

    上图来自Java技术栈微信群里的群友分享,看起来比较基础,但不一定人人都答得上来. 图片比较模糊,小编把题目进行了文字化. 1.你最常上的两个技术站和最常使用的两个app分別进什么?主要解决你什么需求 ...

  2. 半宿了,仿写了个CList模板类,留着以后用吧

    难题还是很多阿.模板类.本身就是个问题 要考虑到各个方面,哎.问题很多 比如,如果模板类型为数值型.指针型数据,倒也可以 但是如果模板类型为聚合型,就麻烦了,判断.比较,什么乱七八糟的,都麻烦了. 哎 ...

  3. Activiti流程图查看

    1.测试用例查看图片 public void viewImage() throws Exception { // 创建仓库服务对对象 RepositoryService repositoryServi ...

  4. ant的build.xml备份

    <?xml version="1.0" encoding="UTF-8" ?> <project default="rerun&qu ...

  5. 人脸识别的LOSS(上)

    超多分类的Softmax 2014年CVPR两篇超多分类的人脸识别论文:DeepFace和DeepID Taigman Y, Yang M, Ranzato M A, et al. Deepface: ...

  6. C++ 系列:static

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用.一.面向过程设计中的sta ...

  7. 查看java资源的占用

    1,使用命令top -p <pid> ,显示你的java进程的内存情况,pid是你的java进程号,比如1232,按H,获取每个线程的内存情况3,找到内存和cpu占用最高的线程pid,比如 ...

  8. UVA - 11327

    UVA - 11327https://vjudge.net/problem/28358/origin求欧拉函数的前缀和,二分查找到那个位置,再从它开始暴力gcd找 #include <iostr ...

  9. Ubuntu Service说明与使用方法

    1 什么是Ubuntu的Service 网上很多资料说, service就是linux中随开机自启动的, 并且在后台运行的程序. 个人认为, 至少对于Ubuntu来说, 这个说法是不太准确的, 这只不 ...

  10. js '' ""的嵌套使用

    1.我需要拼接一个字符串,但是其中 单引号内包含了双引号,双引号内又包含了单引号变量 这时我们想到了可以用到HTML特殊转义字符 2.如下拼接 return '<input type=" ...