VeryNginx详细配置说明
自定义行为 ( Custom Action )
匹配器 (Matcher)
匹配器
VeryNginx 会收到各种各样的Http请求,当我们定义一条规则(Action)的时候,我们可能会需要限定,这条规则只对一部分请求起作用,Matcher 就是匹配器,用来描述哪一部分 Http 请求是规则的目标。
一个 Matcher 可以包含一个或者多个约束条件,当某个请求没有违背 Matcher 中任何一条约束时,就认为这个请求匹配上了这个Matcher。
如果Matcher是空的,即没有包含任何条件,那么这个Matcher会匹配上所有的请求
目前支持以下几种约束:
Client IP
客户端IP,对应Nginx变量 remote_addr
支持的匹配方式:
- 等于某个IP
- 不等于某个IP
Host
客户访问时使用的域名,对应Nginx变量 host
支持的匹配方式:
- 等于某个字符串
- 不等于某个字符串
- 符合某个正则表达式
- 不符合某个正则表达式
UserAgent
用户浏览器的UserAgent字段,对应Nginx变量 http_user_agent
一些通过工具发起的请求可能会有特别的UserAgent,或者没有这个字段,也可能伪造成普通的浏览器
支持的匹配方式:
- 等于某个字符串
- 不等于某个字符串
- 符合某个正则表达式
- 不符合某个正则表达式
- 为空,即Http头中没有这个字段
URI
请求路径,对应Nginx中的变量 uri
,表示访问地址中域名之后的部分
例如访问 http://www.abc.com/test/book.html 时,uri值为 /test/book.html
支持的匹配方式:
- 等于某个字符串
- 不等于某个字符串
- 符合某个正则表达式
- 不符合某个正则表达式
Referer
请求来源网页,对应Nginx中的变量 http_referer
,表示访问者的来源页面。
支持的匹配方式:
- 等于某个字符串
- 不等于某个字符串
- 符合某个正则表达式
- 不符合某个正则表达式
- 为空,即Http头中没有这个字段
Request Args
请求参数匹配
VeryNginx可以智能的从uri字符串后面,以及请求体(body)内提取参数的值
注:目前只支持在请求的content-type为application/x-www-form-urlencoded时,从请求体内提取参数
这个条件可以输入两个字段,name 和 value。name是可选的,如果输入name,则只把符合name条件的参数值和value作匹配;如果不输入name,就会把所有的参数值拿来和value进行匹配
支持的匹配方式:
- 等于某个字符串
- 不等于某个字符串
- 符合某个正则表达式
- 不符合某个正则表达式
行为 (Action)
协议锁定 CustomAction: Scheme Lock
功能介绍
协议锁定功能可以确保用户访问时使用正确的协议 ( Http
/ Https
)
背景知识
配置说明
可以定义多条规则,每条规则包含以下参数
- Enable
- Matcher
- Scheme
执行过程
寻找规则
每收到一个请求,VeryNginx将按照从上到下(序号递增)的顺序,取每一条规则的 Matcher 进行匹配测试,当找到第一个符合的Matcher时,即由这一条规则进行处理,停止后续匹配
应用规则
当Http请求使用的访问协议和规则中的 scheme 项不一致时,将自动返回一个302重定向,将浏览器重定向到正确的协议 + 当前的地址上。如果使用和规则一致的协议来访问,则不会有任何动作
注意事项
- 注意规则的顺序,防止一个严格的 Matcher 被排名更前的宽松 Matcher 覆盖,导致规则不起作用
- 如果服务器有向外提供Api的话,需要特别注意和Api的兼容性,通常来说Api的调用方不是真正的浏览器,很可能不支持302重定向
重定向 CustomAction: Redirect
功能介绍
Redirect可以将一个请求重定向到另外一个地址
背景知识
配置说明
可以定义多条规则,每条规则包含以下参数
- Enable
- Matcher
- RegEx
- Redirect to
执行过程
寻找规则
每收到一个请求,VeryNginx将按照从上到下(序号递增)的顺序,取每一条规则的 Matcher 进行匹配测试,当找到第一个符合的Matcher时,即由这一条规则进行处理,停止后续匹配
应用规则
当 Regex 项为空时, 请求将被重定向到Redirect to 项填写的地址。 当 Regex 项不为空时,新地址由gsub算法生成:
new_address = gsub( uri, re,redirect_to )
其中 re 为规则中定义的Regex,redirect_to 为规则中定义的 Redirect to 项目
注意事项
- Redirect to 项可以是以下两种形式
- 带有协议以及域名 (http/https)😕/www.abc.com/test/aaa/bbb
- 不带有域名 /test/aaa/bbb
- 重定向时url后的查询字符串参数将会被保留
- 注意规则的顺序,防止一个严格的Matcher被排名更前的宽松Matcher覆盖,导致规则不起作用
URI重写 CustomAction: URI Rewrite
功能介绍
URI Rewrite 可以将请求的URI进行内部改写,而用户浏览器地址栏显示的地址并不会发生变化
背景知识
配置说明
可以定义多条规则,每条规则包含以下参数
- Enable
- Matcher
- RegEx
- Redirect to
执行过程
寻找规则
每收到一个请求,VeryNginx将按照从上到下(序号递增)的顺序,取每一条规则的 Matcher 进行匹配测试,当找到第一个符合的Matcher时,即由这一条规则进行处理,停止后续匹配
应用规则
当 Regex 项为空时, 请求将被重定向到Redirect to 项填写的地址。 当 Regex 项不为空时,新地址由gsub算法生成:
new_address = gsub( uri, re,redirect_to )
其中 re 为规则中定义的Regex,redirect_to 为规则中定义的 Redirect to 项目
示例1 :
VeryNginx默认访问路径是 /veryngingx/dashboard/index.html, 我们想缩短到 /vn/index.html, 可以作以下配置:
Matcher: URI ≈ ^/vn
Regex: ^/vn/(.*)
Redirect to: /verynginx/dashboard/$1
添加规则之后,通过 /vn/index.html 即可访问配置面板
注意事项
- Redirect to 项只可以是 / 开头的地址
- 重定向时url后的查询字符串参数将会被保留
- 注意规则的顺序,防止一个严格的Matcher被排名更前的宽松Matcher覆盖,导致规则不起作用
浏览器验证 CustomAction: Browser Verify
功能介绍
Browser Verify可以验证发起请求的客户端是否为浏览器,并拦截来自非浏览器客户端的请求
背景知识
配置说明
可以定义多条规则,每条规则包含以下参数
- Enable
- Matcher
- Verify Type
- Cookie
- JavaScript
执行过程
寻找规则
每收到一个请求,VeryNginx将按照从上到下(序号递增)的顺序,取每一条规则的 Matcher 进行匹配测试,当找到第一个符合的Matcher时,即由这一条规则进行处理,停止后续匹配
应用规则
当收到一个请求时,VeryNginx 会通过算法得到一个Token
- 当配置Verify Type为Cookie时:
用户的Cookie中没有带有这个Token时,将会返回一个302重定向,将用户重定向到当前地址,并在http响应头中设置cookies。如果客户端是浏览器,将自动带上这个Token再继续访问,此时将被放行。如果客户端是其他工具,并且该工具不支持302以及http响应头中的set cookies字段,将无法继续访问
- 当配置Verify Type为JavaScript时:
和 Type 为 Cookie 时原理类似,不同之处在于没有Token时,返回一个网页,并通过内嵌在网页中的JavaScript来设置Cookies并发起重定向。需要浏览器支持JavaScript才可以验证通过
Token生成算法原型
Token = hash( client_ip + UserAgent + key )
其中Key为VeryNginx第一次运行时产生的随机数
这样可以为每个用户和浏览器产生不同的Token,并且无法伪造
注意事项
- 注意规则的顺序,防止一个严格的Matcher被排名更前的宽松Matcher覆盖,导致规则不起作用
- 本功能可能会影响搜索引擎抓取信息,建议只针对部分页面开启,或者仅在被攻击时开启
访问频率限制 CustomAction: Frequency Limit
功能介绍
Frequency Limit 可以限制访问特定时间内请求的次数,超出限制时将截断并返回指定的状态码
背景知识
配置说明
可以定义多条规则,每条规则包含以下参数
- Enable
- Matcher
- Time(s)
- Max Request Times
- Count Alone
- Return Code
执行过程
寻找规则
每收到一个请求,VeryNginx将按照从上到下(序号递增)的顺序,取每一条规则的 Matcher 进行匹配测试,当找到第一个符合的Matcher时,即由这一条规则进行处理,停止后续匹配
应用规则
每条规则会对命中的请求进行计数,单位时间( Time ) 内最多放行指定次数( Max Request Times ) 的请求,单位时间内超过次数的请求将返还指定的状态码。
- 未设置单独统计( Count Alone )的情况下,匹配这条规则的所有请求最多为 Max Request Times 次。
- 通过设置单独统计( Count Alone )选项,可以根据 IP (或 URI)分别进行计数,即命中 Matcher 情况下,相同 IP (或 URI)单位时间内请求不超过指定次数。
注意事项
无
过滤器 CustomAction: Filter
功能介绍
Filter可以阻止访问请求,并返回指定的状态码
背景知识
配置说明
可以定义多条规则,每条规则包含以下参数
- Enable
- Matcher
- Action
- Return Code
执行过程
寻找规则
每收到一个请求,VeryNginx将按照从上到下(序号递增)的顺序,取每一条规则的 Matcher 进行匹配测试,当找到第一个符合的Matcher时,即由这一条规则进行处理,停止后续匹配
应用规则
当 Action 项为 accept 时, 不进行任何动作,继续按照正常流程处理
当 Action 项为 block 时,拦截请求,并返回 Return code 项指定的状态码
注意事项
- 注意规则的顺序,防止一个严格的Matcher被排名更前的宽松Matcher覆盖,导致规则不起作用
自定义动作执行顺序 Action Execute Order
Action 将会按照以下顺序来执行
- Scheme Lock
- Redirect
- URI Rewrite
- Browser Verify
- Frequency Limit
- Filter
统计Summary
统计
功能介绍
统计不同URI的访问情况
背景知识
None
配置说明
当配置为Enable状态时,本功能对每一次访问进行统计。如果Enable不勾选,则不记录任何数据
统计数据有两组:
- All Nginx启动后所有的数据
- Temporary 每分钟清空的统计数据
统计结果如下:
- Count 请求总次数
- Success rate 请求成功率,状态码在400以下都认为是成功
- Time 请求总耗费时间
- Avg time 请求平均耗费时间
- Size 总响应大小
- Avg Size 平均响应大小
执行过程
在Log阶段根据不同的URI进行统计
注意事项
目前使用了10M大小的共享内存来存储访问统计信息,据实际测试大约可存储10000条URI的统计数据。当共享内存存储满之后,最早的数据将会被丢失(LRU算法)
安装
故障排错 Trouble Shooting
在安装和使用 VeryNginx 的过程中可能会遇到一些问题,下面列举了常见的问题及对应的解决方案,供参考。
Q: run "python instal.py install all" failed ?
1, 因为缺少 gcc 所以无法编译
yum install gcc
2, 缺少一些必要的库,如 openssl, PCRE,导致编译不成功
fedora / centos 下可以执行以下命令
yum install pcre pcre-devel
yum install openssl openssl-devel
如果你使用的是 ubuntu,那么需要
apt-get install libssl libssl-dev
apt-get install libpcre3 libpcre3-dev
3, 复制文件失败
使用 sudo 来运行安装脚本
Q: 启动失败 ?
1,nginx.conf 中指定了使用 nginx 用户来执行程序,而系统里缺少 nginx 用户,所以无法运行
adduser nginx
2,如果是使用自己的配置无法启动,那么为了排除配置问题,可以先使用 VeryNginx 自带的 nginx.conf 来运行 nginx。如果可以运行,那么说明是配置的原因。
仔细对比能工作和不能工作的配置,找到出问题的地方进行修正即可。
3,为了排除权限问题,可以使用 root 用户来运行 nginx 试试。方法是在 nginx.conf 中:
将
user nginx;
修改成user root;
Q: 无法访问控制面板 / 控制面板工作不正常?
1, 可以先使用 chrome 或 safari 浏览器,排除浏览器不兼容的可能
2, VeryNginx 控制面板页面中的一些 css 和 js 库是引用了公网上的地址,如果不能访问公网,将不能正常工作。如果遇到页面显示不正常之类的问题,请打开网页调试工具,确认静态文件有没有载入成功
Q: 无法保存配置 ?
VeryNginx 的前端面版是一个单页面应用( SPA ),首先为了确定配置是否被保存,可以刷新页面重新登入控制面版,查看修改配置过的配置是否存在,如果存在,那么表示配置已经被保存了,此时配置应该被已经被保存到了 /opt/verynginx/verynginx/config/config.json
中。如果保存失败,可能有以下原因:
1,未点击保存按钮
修改配置后,页面底部会出现一个浮动条,提示保存,在点击浮动条上的保存按钮之后,配置才会进行写入
2, nginx 进程对 /opt/verynginx/verynginx/configs/ 无写权限
执行 chmod -R 777 /opt/verynginx/verynginx/configs
3, nginx 设置的 client body 太小,导致请求体被缓存到文件,导致 lua 代码没有获取到请求体,保存时会提示请求失败
在 nginx.conf 中 http 部分增加一句,client_body_buffer_size 128k;
4,nginx 以 nobody 方式运行
如果 nginx.conf 中定义了 user nobody; 将可能导致无法保存配置,去掉这项配置,或者指定成正常的用户即可