[Day4] Nginx Http模块二
一. 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,忽略参数
合并连续的符号:merge_slashes on
前缀字符串:
常规匹配
=:精准匹配
^~:匹配上后则不再进行正则表达式匹配
用于内部跳转的命令:location
正则表达式:
~:大小写敏感的正则匹配
~*:忽略大小写敏感的正则匹配
location匹配顺序
遍历匹配全部前缀字符串location
匹配上=字符串,使用匹配上的=精准匹配location,否则进入下一步
匹配上^~字符串,使用匹配上的^~字符串location,否则进入下一步
记住最长匹配的前缀字符串location,进入正则表达式匹配
按nginx.conf中的顺序依次匹配正则表达式location
匹配上,使用匹配上的正则表达式
未匹配上,使用最长匹配的前缀字符串location
总结优先级:=精准匹配前缀>^~停止正则匹配前缀>按位置顺序正则匹配>最长前缀匹配
注:前缀匹配符号:无符号、=符号、^~符号
正则匹配符号:~大小写敏感正则、~*大小写不敏感正则
四. preaccess阶段
1. 限制客户端的并发连接数
模块:http_limit_conn_moudule
默认编译进nginx,通过--without-http_limit_conn_module禁用
生效范围:全部worker进程(基于共享内存)
进入proaccess阶段前不生效
限制的有效性取决于key的设计:依赖postread阶段的realip模块的真实ip
limit_conn命令:
定义共享内存(包括名字和大小),以及key关键字
limit_conn_zone key zone=name:size;
context:http
限制并发连接数
limit_conn zone number;
context:http,server,location
限制发生时的日志级别
limit_conn_log_level info | notice | warn | error;
default:limit_conn_log_level error;
context:http,server,location
显示发生时向客户端返回的错误码
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命令:
定义共享内存(包括名字和大小),以及key关键字
limit_req_zone key zone=name:size rate=rate;
context:http
限制并发连接数
limit_req zone =name [burst=number] [nodelay];
context:http,server,location
限制发生时的日志级别
limit_req_log_level info | notice | warn | error;
default:limit_req_log_level error;
context:http,server,location
显示发生时向客户端返回的错误码
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模块二的更多相关文章
- [Day4] Nginx Http模块一
之前介绍了Nginx作为静态资源服务器的用法,除此之外,Nginx更多的场景是作为反向代理服务器,提高网站的并发和可用性.下面几节着重说一下作为反向代理的http模块,并且了解一些Nginx的架构. ...
- NGINX常用模块(二)
5.Nginx日志配置 Nginx有非常灵活的日志记录模式.每个级别的配置可以有各自独立的访问日志.日志格式 通过log_format命令定义格式 1.log_format指令 # 配置语法:包括:e ...
- NGINX模块(二)
[Nginx标准HTTP模块] 一.HTTP核心模块 指令1:alias 语法:alias file-path|directory-path; 默认值:no 使用字段:location 说明:这个指令 ...
- 转载:Centos7 从零编译Nginx+PHP+MySql 二
序言 这次玩次狠得.除了编译器使用yum安装,其他全部手动编译.哼~ 看似就Nginx.PHP.MySql三个东东,但是它们太尼玛依赖别人了. 没办法,想用它们就得老老实实给它们提供想要的东西. 首先 ...
- nginx事件模块分析(一)
nginx ngx_events_module模块分析 ngx_events_module模块是核心模块之一,它是其它所有事件模块的代理模块.nginx在启动时只与events模块打交道,而由even ...
- Nginx学习之二-配置项解析及编程实现
在开发功能灵活的Nginx模块时,需要从配置文件中获取特定的信息.不过,我们并不需要再编写一套读取配置的系统,Nginx已经为用户提供了强大的配置项解析机制,同时还支持“-s reload”命令,可以 ...
- nginx自定义模块编写-根据post参数路由到不同服务器
nginx可以轻松实现根据不同的url 或者 get参数来转发到不同的服务器,然而当我们需要根据http包体来进行请求路由时,nginx默认的配置规则就捉襟见肘了,但是没关系,nginx提供了强大的自 ...
- [转帖]nginx upstream模块--负载均衡
nginx upstream模块--负载均衡 https://www.cnblogs.com/linjiqin/p/5494783.html Module ngx_http_upstream_modu ...
- Nginx自定义模块编写:根据post参数路由到不同服务器
Nginx自定义模块编写:根据post参数路由到不同服务器 2014-05-05 15:27 blogread IT技术博客 字号:T | T Nginx可以轻松实现根据不同的url 或者 get参数 ...
随机推荐
- 分享18道Java基础面试笔试题(面试实拍)
上图来自Java技术栈微信群里的群友分享,看起来比较基础,但不一定人人都答得上来. 图片比较模糊,小编把题目进行了文字化. 1.你最常上的两个技术站和最常使用的两个app分別进什么?主要解决你什么需求 ...
- 半宿了,仿写了个CList模板类,留着以后用吧
难题还是很多阿.模板类.本身就是个问题 要考虑到各个方面,哎.问题很多 比如,如果模板类型为数值型.指针型数据,倒也可以 但是如果模板类型为聚合型,就麻烦了,判断.比较,什么乱七八糟的,都麻烦了. 哎 ...
- Activiti流程图查看
1.测试用例查看图片 public void viewImage() throws Exception { // 创建仓库服务对对象 RepositoryService repositoryServi ...
- ant的build.xml备份
<?xml version="1.0" encoding="UTF-8" ?> <project default="rerun&qu ...
- 人脸识别的LOSS(上)
超多分类的Softmax 2014年CVPR两篇超多分类的人脸识别论文:DeepFace和DeepID Taigman Y, Yang M, Ranzato M A, et al. Deepface: ...
- C++ 系列:static
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用.一.面向过程设计中的sta ...
- 查看java资源的占用
1,使用命令top -p <pid> ,显示你的java进程的内存情况,pid是你的java进程号,比如1232,按H,获取每个线程的内存情况3,找到内存和cpu占用最高的线程pid,比如 ...
- UVA - 11327
UVA - 11327https://vjudge.net/problem/28358/origin求欧拉函数的前缀和,二分查找到那个位置,再从它开始暴力gcd找 #include <iostr ...
- Ubuntu Service说明与使用方法
1 什么是Ubuntu的Service 网上很多资料说, service就是linux中随开机自启动的, 并且在后台运行的程序. 个人认为, 至少对于Ubuntu来说, 这个说法是不太准确的, 这只不 ...
- js '' ""的嵌套使用
1.我需要拼接一个字符串,但是其中 单引号内包含了双引号,双引号内又包含了单引号变量 这时我们想到了可以用到HTML特殊转义字符 2.如下拼接 return '<input type=" ...