nginx限流
1.nginx与apache的对比
1.1nginx
- 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源
- 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能 保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
- nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
- nginx 的设计高度模块化,编写模块相对简单
- nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
- nginx 作为负载均衡服务器,支持 7 层负载均衡
- nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
- 启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级
- 社区活跃,各种高性能模块出品迅速
1.2 apache
- apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
- apache 发展到现在,模块超多,基本想到的都可以找到
- apache 更为成熟,少 bug ,nginx 的 bug 相对较多
- apache 超稳定
- apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
- apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。
- 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;