1、Nginx指令和配置
Nginx的各种指令以及配置繁多,有些配置可以在如下的链接 https://tengine.taobao.org/nginx_docs/cn/docs/ 或者在官方文档上查看https://www.nginx.com/。
2、常用的一些模块
Nginx http 功能模块 | 模块说明 |
---|---|
nginx_http_core_module | 包括一些核心的http参数配置,对应nginx的配置为HTTP区块部分 |
nginx_http_access_module | 访问控制模块,用来控制网络用户对Nginx的访问 |
nginx_http_gzip_module | 压缩模块,对Nginx返回的数据进行压缩,属于性能优化模块 |
nginx_http_fastcgi_module | FastCGI模块,和动态应用相关的模块,例如PHP |
nginx_http_proxy_module | proxy代理模块 |
nginx_http_upstream_module | 负载均衡模块,可以实现网站的负载均衡功能和节点的健康检查 |
nginx_http_rewrite_module | URL地址重写模块 |
nginx_http_limit_conn_module | 限制用户并发连接数和请求数模块 |
nginx_http_limit_req_module | 根据定义的key限制Nginx请求过程的速率 |
nginx_http_log_module | 访问日志模块,以指定的格式记录Nginx客户访问日志等信息 |
nginx_http_auth_basic_module | Web认证模块,设置Web用户通过账号、密码方位Nginx |
nginx_http_ssl_module | ssl模块,用于加密的http连接,如https |
nginx_http_stub_status_module | 记录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 限制请求频率
https://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_limit_req_module.html
示例:
http{
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
.......
server {
.....
location /search/{
limit_req zone=one burst=5
语法: limit_req zone=name [burst=number] [nodelay];
语法: limit_req_zone $variable zone=name:size rate=rate;
$variable:变量
zone:代表当前限制的名称与存放大小
name:名称
size:存放客户端信息的大小
rate:表示速率
默认值: none
上下文: http
例子: limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
Zone=one 表示设置了名为“one”,大小为10兆字节,也可以理解为设置的限流名为one
rate=10r/s 的意思是允许1秒钟不超过10个请求
使用$binary_remote_addr【这是一个二进制的信息记录 $remote_addr(非二进制的)】(nginx本身存在的,保存客户端的ip地址)变量,可以将每条状态记录的大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录。如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。
速度可以设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,所以如果你需要指定每秒处理少于1个的请求,2秒处理一个请求,可以使用 “30r/m”。
3.2 ngx_http_limit_conn_module限制请求连接数
https://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_limit_conn_module.html
示例:
http{
limit_conn_zone $binary_remote_addr zone=one:10m;
.......
server {
.....
location /download/{
limit_conn addr 1;
用于限制每个已定义键的连接数特别是来自单个IP地址的连接数。并不是所有的连接都被计算在内。只有当服务器处理了一个请求,并且整个请求头已经被读取时,才会计算连接。
语法: limit_conn_zone $binary_remote_addr zone=addr:10m;
默认值: none
配置段: http
例子:limit_conn_zone $binary_remote_addr zone=addr:10m;
说明:区域名称为addr,大小为10m,键值是客户端IP。
如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。
关于很多下文件均会有点一个操作就是会下载限速
操作实例:
http {
# ....
limit_conn_zone $binary_remote_addr zone=addr:10m;
# ....
server {
location / {
autoindex on;
# 是限制每个IP只能发起1个连接 (addr 要跟 limit_conn_zone 的变量对应)
limit_conn addr 1;
limit_rate 10k; #限速为 10KB/秒
root /redis_2004;
}
}
}
3.3 限制算法
3.3.1 限流算法
令牌桶
算法思想是:
-
令牌以固定速率产生,并缓存到令牌桶中;
-
令牌桶放满时,多余的令牌被丢弃;
-
请求要消耗等比例的令牌才能被处理;
-
令牌不够时,请求被缓存。
漏桶
算法思想是:
- 水(请求)从上方倒入水桶,从水桶下方流出(被处理);
- 来不及流出的水存在水桶中(缓冲),以固定速率流出;
- 水桶满后水溢出(丢弃)。
- 这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃。
- 相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的
总结
相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的。
从作用上来说,漏桶和令牌桶算法最明显的区别就是是否允许突发流量(burst)的处理,漏桶算法能够强行限制数据的实时传输(处理)速率,对突发流量不做额外处理;而令牌桶算法能够在限制数据的平均传输速率的同时允许某种程度的突发传输。
3.4 IP访问控制模块
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_access_module.html
我们可以把一些ip或一些网段进行限制
默认是允许所有ip访问,若部分允许需定义 deny all
示例:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
规则按照顺序依次检测,直到匹配到第一条规则。 在这个例子里,IPv4的网络中只有 10.1.1.0/16 和 192.168.1.0/24允许访问,但 192.168.1.1除外, 对于IPv6的网络,只有2001:0db8::/32允许访问。 在规则很多的情况下,使用 ngx_http_geo_module 模块变量更合适。
allow 允许指定的网络地址访问
语法: allow address | CIDR | unix: | all;
默认值: —
区块: http, server, location, limit_except
允许某个ip或者一个ip段访问
deny 拒绝指定的网络地址访问
语法: deny address | CIDR | unix: | all; 默认值: — 区块: http, server,
location, limit_except
3.5 异常页面
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html#error_page