nginx限流

1.nginx与apache的对比

1.1nginx

  1. 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源
  2. 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能 保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
  3. nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
  4. nginx 的设计高度模块化,编写模块相对简单
  5. nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
  6. nginx 作为负载均衡服务器,支持 7 层负载均衡
  7. nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
  8. 启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级
  9. 社区活跃,各种高性能模块出品迅速

1.2 apache

  1. apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
  2. apache 发展到现在,模块超多,基本想到的都可以找到
  3. apache 更为成熟,少 bug ,nginx 的 bug 相对较多
  4. apache 超稳定
  5. apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
  6. apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。
  7. apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区

1.2 总结

两者最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程,而 nginx 是异步的,多个连接(万级别)可以对应一个进程
一般来说,需要性能的 web 服务,用 nginx 。如果不需要性能只求稳定,更考虑 apache ,后者的各种功能模块实现得比前者,例如 ssl 的模块就比前者好,可配 置项多。epoll(freebsd 上是 kqueue ) 网络 IO 模型是 nginx 处理性能高的根本理由,但并不是所有的情况下都是 epoll 大获全胜的,如果本身提供静态服务的就只 有寥寥几个文件,apache 的 select 模型或许比 epoll 更高性能。当然,这只是根据网络 IO 模型的原理作的一个假设,真正的应用还是需要实测了再说的。

2.nginx常用模块了解及使用

Nginx的各种指令以及配置繁多,有些配置可以在如下的链接 https://tengine.taobao.org/nginx_docs/cn/docs/ 或者在官方文档上查看 nginx常用模块介绍 对于nginx的其余模块可以通过在nginx安装的时候通过./configure指定 可以通过 ./configure --help 命令查看,当然有很多模块默认安装的

3.限流模块

比如:抢购的场景,下载限速下就会有涉及运用 限流:主要是当访问量达到一个限制量的时候可以选择以服务器为主要,而选择对用户访问请求的量做限制,对于超出限制的用户请求会采取丢弃或者延迟处理等 方式处理,来保证更多用户来访问处理。

比如:某一服务器正常在高峰期上能支持的访问量是1w,但是突然某一时刻在访问量上突然暴增一下子超过3w,5w则可能会导致服务器宕机,这个时候我们 就可以通过设置最大的访问如1分钟访问8000次;

也可以防止攻击(对同一个ip每秒访问多少次)如:30min/次 对应模块:

ngx_http_limit_conn_module限制连接数
ngx_http_limit_reg_module限制请求频率

3.1 ngx_http_limit_reg_module限制请求频率

4. nginx内置变量说明

Nginx 同 Apache 和 Lighttpd 等其他 Web 服务器的配置记法不太相同, Nginx 的配置文件使用语法的就是一门微型的编程语言。可以类似写程序一般编写 配置文件,可操作性很大。既然是编程语言,一般也就少不了“变量”这种东西。 所有的 Nginx 变量在 Nginx 配置文件中引用时都须带上 $ 前缀在 Nginx 配置中,变量只能存放一种类型的值,有且也只存在一种类型,那就是字符串类型 使用 set 配置指令对变量 $a 进行了赋值操作 set $hello “hello world” ; Nginx 变量一旦创建,其变量名的可见范围就是整个 Nginx 配置,甚至可以跨越不同虚拟主机的 server 配置块 Nginx 变量名的可见范围虽然是整个配置,但每个请求都有所有变量的独立副本,或者说都有各变量用来存放值的容器的独立副本,彼此互不干扰 Nginx 内置变量 内置变量存放在 ngx_http_core_module 模块中

参参数数名名称称注释释
$arg_PARAMETER HTTP请求中某个参数的值,如/index.php?site=www.ttlsa.com,可以用$arg_site取得www.ttlsa.com这个值.
$args HTTP$12
$binary_remote_addr$1
$binary_remote_addr$1
$binary_remote_addr$1
$binary_remote_addr$1
$binary_remote_addr$1
$binary_remote_addr$1
$binary_remote_addr$1
$binary_remote_addr$1
$binary_remote_addr$1
$binary_remote_addr$1
$binary_remote_addr$1
$binary_remote_addr$1
$binary_remote_addr$1

5. ip黑白名单

连接限制跟请求限制,会对所有的ip进行限制,我们不希望自己的测试的ip,或者搜索引擎蜘蛛受到限制 根据上面的速率限制的问题:

limit_req_zone $binary_remote_addr zone=testz:10m rate=1r/s; limit_conn_zone $binary_remote_addr zone=addr:10m;

目前的情况是针对于所有的请求均会有做限制,而在业务中可能会存在这对于某一些ip是不做限制的需求;在nginx的配置中并不能直接对于变量编辑相应的逻辑 计算因此我们不得不需要换一个方式

5.1 ngx_http_geo_module

ngx_http_geo_module模块创建变量,并根据客户端IP地址对变量赋值

语法: geo [$address] $variable { … }
默认值: —

http {// .. geo $whiteIpList { default 1; 192.168.169.139 0; 192.168.169.160 0; include ip/whiteIp.conf; }server { // .. location /geo { return 200 '$whiteIpList'; } } }

5.2 ngx_http_map_module

ngx_http_map_module可以根据我们传递的参数

语法: map string $variable { … }
默认值: — 上下文: http

使用方面和geo的方式类似
需要值得注意的是

limit_req_zone $binary_remote_addr zone=testz:10m rate=1r/s; limit_conn_zone $binary_remote_addr zone=addr:10m;

5.3 jmter使用

6 rewrite模块(ngx_http_rewrite_module)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值