Ngnix常用模块介绍 |
| |||||
|
|
| ||||
对客户端进行限制相关配置-预防CC攻击
一般在下面的需求: 秒杀、抢购并发限制下载带宽限制 防止攻击
| Limit_req_zone用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 Limit_req_conn用来限制同一时间连接数,即并发限制 ngnix限制连接数 ngx_http_limit_conn_module 模块
|
| ||||
关于漏桶算法
| 漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),
然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率
|
| ||||
IP访问控制模块 | 用来对特定IP的进行访问控制
http_access_module模块 deny allow |
| ||||
黑白名单 |
|
| ||||
rewrite模块(ngx_http_rewrite_module) | rewrite 的主要功能是实现URL地址的重定向。 Nginx 的 rewrite 功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译 nginx 就会支持 rewrite 的模块,但是也必须要PCRE的支持。
使用场景: 1、可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。 2、为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。 3、网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的360buy.com会跳转到jd.com 4、根据特殊变量、目录、客户端的信息进行URL调整等
|
| ||||
Return指令 | 该指令用于结束规则的执行并返回状态吗给客户端 |
| ||||
Last标记说明 | 本条规则匹配完成后,继续向下匹配新的location URI规则 结束当前的请求处理,用替换后的URI重新匹配location; |
| ||||
Rewrite语法 | 实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记 |
| ||||
nginx防盗链实现 | Referers模块 |
| ||||
负载均衡的方法 |
默认轮训方式 每一个来自网络中的请求,轮流分配给内部的服务器,从1到N然后重新开始。此种负载均衡算法适合服务器组内部的服务器都具有相同的配置并且平均服务请求相对均衡的情况。
通过 weight 参数控制权重
根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。例如:服务器A的权值被设计成1,B的权值是3,C的权值是6,则服务器A、B、C将分别接受到10%、30%、60%的服务请求。此种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。
在 upstream 当中配置 ip_hash ;
这种方式通过生成请求源IP的哈希值,并通过这个哈希值来找到正确的真实服务器。这意味着对于同一主机来说他对应的服务器总是相同。使用这种方式, 你不需要保存任何源IP。 将客户端会话"沾住"或者"持久化",以便总是能选择特定服务器,那么可以使用 ip-hash 负载均衡机制。
使用 ip-hash 时,客户端IP地址作为 hash key 使用,用来决策选择服务器集群中的哪个服务器来处理这个客户端的请求。这个方法保证从同一个客户端发起的请求总是定向到同一台服务器,除非服务器不可用。
在 upstream 当中配置 least_conn 实现最少连接数
客户端的每一次请求服务在服务器停留的时间可能会有较大的差异,随着工作时间加长,如果采用简单的轮循或随机均衡算法,每一台服务器上的连接进程可能会产生极大的不同,并没有达到真正的负载均衡。最少连接数均衡算法对内部中需负载的每一台服务器都有一个数据记录,记录当前该服务器正在处理的连接数量,当有新的服务连接请求时,将把当前请求分配给连接数最少的服务器,使均衡更加符合实际情况,负载更加均衡。
|
| ||||
失败重试
| 通过配置上游服务器 max_fails 和 fail_timeout ,指定每个上游服务器,当 fail_timeout 时间内失败了 max_fails 次请求,则认为该上游服务器不可用/不存活,然后这段时间将不会访问这台上游服务器, fail_timeout 时间后会再次进行重试。
|
| ||||
Ngnix缓存机制 |
|
| ||||
什么是缓存? | Web缓存是可以自动保存常见文档副本的HTTP 设备。当Web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地设备而不是服务器中提取这个文档。
|
| ||||
为什么使用缓存 | 缓存减少了冗余的数据传输,节约了网络费用 缓存缓解了网络瓶颈的问题,对于带宽的要求 缓存降低了对原始服务器的要求,降低服务器压力 缓存加速了页面的展示
|
| ||||
缓存的分类:
| 缓存分为服务端侧(比如 Nginx,redis,memcached)和客户端侧(比如 web browser)。
服务端缓存又分为 代理服务器缓存 和 反向代理服务器缓存(也叫网关缓存,比如 Nginx反向代理就可以设置缓存) 客户端侧缓存一般指的是浏览器缓存、app缓存等等,目的就是加速各种静态资源的访问,降低服务器压力。 简单看看浏览器的缓存规则
第一次访问某个网站
第二次访问某个网站 |
| ||||
HTTP 缓存控制头介绍 | HTTP 中最基本的缓存机制,涉及到的 HTTP 头字段,包括 Cache-Control, Last-Modified, If-Modified-Since, Etag, If-None-Match 等
Last-Modified :标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。
If-Modified-Since :当资源过期时(使用Cache-Control标识的max-age),发现资源具有 Last-Modified 声明,则再次向web服务器请求时带上头 If-Modified-Since ,表示请求时间。web服务器收到请求后发现有头 If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新, 说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应 HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的 cache 。
如果你想强制从服务器获取最新的内容,不去对比,那么就可以强制刷新 Etag :web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。
浏览器第二次请求
|
| ||||
Nginx web缓存设置 | nginx 提供了 expires、etag、if-modified-since 指令来进行浏览器缓存控制 |
| ||||
|
| |||||
|
| |||||
|
| |||||
|
| |||||
|
| |||||
|
|