nginx文档
https://tengine.taobao.org/nginx_docs/cn/docs/
模块
ngx_http_access_module
用来对特定IP的进行访问控制
默认是允许所有ip访问,若部分允许需定义deny all
allow
语法: allow address | CIDR | unix: | all;
默认值: —
区块: http, server, location, limit_except
允许某个ip或者一个ip段访问
deny
语法: deny address | CIDR | unix: | all;
默认值: —
区块: http, server, location, limit_except
allow、deny实例
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 47.98.147.49;
deny all;
}
比如可以限制某些目录下的某些文件的访问,具体可以自己组合
禁止访问所有目录下的sql|log|txt|jar|sh|py后缀的文件,
location ~.*.(sql|log|txt|jar|war|sh|py|php){
deny all;
}
ngx_http_access_module
用来对特定IP的进行访问控制
默认是允许所有ip访问,若部分允许需定义deny all
allow
语法: allow address | CIDR | unix: | all;
默认值: —
区块: http, server, location, limit_except
允许某个ip或者一个ip段访问
deny
语法: deny address | CIDR | unix: | all;
默认值: —
区块: http, server, location, limit_except
allow、deny实例
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 47.98.147.49;
deny all;
}
比如可以限制某些目录下的某些文件的访问,具体可以自己组合
禁止访问所有目录下的sql|log|txt|jar|sh|py后缀的文件,
location ~.*.(sql|log|txt|jar|war|sh|py|php){
deny all;
}
ngx_http_log_module
请求在处理结束时,会按请求路径的配置上下文记访问日志,通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息;通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。
语法:access_log path [format [buffer=size]];
access_log off;
默认值:
access_log logs/access.log combined;
上下文:http, server, location, if in location, limit_except
日志备份
备份日志文件的shell脚本
# vim log.sh
#!/bin/bash
LOGPATH=/user/local/nginx/logs/ngins.23673.com
BACKPATH=/usr/src/log
mkdir -p $BACKPATH
mv $LOGPATH $BACKPATH/$(date -d yesterday +%d%H%M).nginx.23673.com .access.log
#
kill -USR1 'cat /var/lobal/nginx/logs/nginx.pid'
# chmod +x log.sh
编辑crond
# crontab -e
01 00 * * * root /bin/bash /usr/local/nginx/log.sh
# systemctl start crond.service
对客户端进行限制相关配置
一般在下面的需求:
秒杀、抢购并发限制
下载带宽限制
防止攻击
limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法
limit_req_conn 用来限制同一时间连接数,即并发限制
nginx限制连接ngx_http_limit_conn_module模块
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)错误。
2、设置允许一个IP同时的连接数。
limit_conn
语法: limit_conn zone number;
默认值: none
配置段:http, server, location
例子:
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /video/ {
limit_conn addr 1;
}
}
nginx限制请求数limit_req_zone
语法: limit_req_zone $variable zone=name:size rate=rate;
默认值: none
配置段: http
例子:limit_req_zone binaryremoteaddrzone=one:10mrate=1r/s;Zone=one表示设置了名为“one”,大小为10兆字节rate=10r/s的意思是允许1秒钟不超过10个请求使用binary_remote_addr zone=one:10m rate=1r/s;
Zone=one 表示设置了名为“one”,大小为10兆字节
rate=10r/s 的意思是允许1秒钟不超过10个请求
使用binaryremoteaddrzone=one:10mrate=1r/s;Zone=one表示设置了名为“one”,大小为10兆字节rate=10r/s的意思是允许1秒钟不超过10个请求使用binary_remote_addr变量,可以将每条状态记录的大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录。
如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。
速度可以设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,所以如果你需要指定每秒处理少于1个的请求,2秒处理一个请求,可以使用 “30r/m”。
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
请求中的完整参数。例如,在请求/index.php?width=400&height=200 中,$args表示字符串width=400&height=200.
$binary_remote_addr
二进制格式的客户端地址。例如:\x0A\xE0B\x0E
$body_bytes_sent
表示在向客户端发送的http响应中,包体部分的字节数
$content_length
表示客户端请求头部中的Content-Length 字段
$content_type
表示客户端请求头部中的Content-Type 字段
$cookie_COOKIE
表示在客户端请求头部中的cookie 字段
$document_root
表示当前请求所使用的root 配置项的值
$uri
表示当前请求的URI,不带任何参数
$document_uri
与$uri 含义相同
$request_uri
表示客户端发来的原始请求URI,带完整的参数。$uri和$document_uri未必是用户的原始请求,在内部重定向后可能是重定向后的URI,而$request_uri 永远不会改变,始终是客户端的原始URI.
$host
表示客户端请求头部中的Host字段。如果Host字段不存在,则以实际处理的server(虚拟主机)名称代替。如果Host字段中带有端口,如IP:PORT,那么$host是去掉端口的,它的值为IP。$host 是全小写的。这些特性与http_HEADER中的http_host不同,http_host只取出Host头部对应的值。
$hostname
表示 Nginx所在机器的名称,与 gethostbyname调用返回的值相同
$http_HEADER
表示当前 HTTP请求中相应头部的值。HEADER名称全小写。例如,示请求中 Host头部对应的值 用
$http_host
$sent_http_HEADER
表示返回客户端的 HTTP响应中相应头部的值。HEADER名称全小写。例如,用 $sent_ http_content_type表示响应中 Content-Type头部对应的值
$is_args
表示请求中的 URI是否带参数,如果带参数,$is_args值为 ?,如果不带参数,则是空字符串
$limit_rate
表示当前连接的限速是多少,0表示无限速
$nginx_version
表示当前 Nginx的版本号
$query_string
请求 URI中的参数,与 $args相同,然而 $query_string是只读的不会改变
$remote_addr
表示客户端的地址
$remote_port
表示客户端连接使用的端口
$remote_user
表示使用 Auth Basic Module时定义的用户名
$request_filename
表示用户请求中的 URI经过 root或 alias转换后的文件路径
$request_body
表示 HTTP请求中的包体,该参数只在 proxy_pass或 fastcgi_pass中有意义
$request_body_file
表示 HTTP请求中的包体存储的临时文件名
$request_completion
当请求已经全部完成时,其值为 “ok”。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用 HTTP range访问的并不是文件的最后一块,那么其值也是空字符串。
$request_method
表示 HTTP请求的方法名,如 GET、PUT、POST等
$scheme
表示 HTTP scheme,如在请求 https://nginx.com/中表示 https
$server_addr
表示服务器地址
$server_name
表示服务器名称
$server_port
表示服务器端口
$server_protocol
表示服务器向客户端发送响应的协议,如 HTTP/1.1或 HTTP/1.0
配置文件中优先级的问题
server_name
虚拟主机名可以使用确切的名字,通配符,或者是正则表达式来定义,在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由哪一个server块来处理这个请求。有可能一个Host与多个server块中的server_name都匹配,这时就会根据匹配优先级来选择实际处理的server块。
注意:优先级问题,所导致的配置不生效
server_name与Host的匹配优先级如下:
1)首先选择所有字符串完全匹配的server_name,如 nginx.2367.com 。
2)其次选择通配符在前面的server_name,如 .2367.com。
3)再次选择通配符在后面的server_name,如nginx.2367. 。
4)最后选择使用正则表达式才匹配的server_name,如 ~^.testweb.com$
如果都不匹配
1、优先选择listen配置项后有default或default_server的
2、找到匹配listen端口的第一个server块
配置块: location
location
语法: location[=||*|^~|@]/uri/{…}
配置块: server
location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择
location{}块中的配置来处理用户请求。当然,匹配方式是多样的,下面介绍location的匹配
规则。
location
-
location表达式类型
- 表示执行一个正则匹配,区分大小写;
~* 表示执行一个正则匹配,不区分大小写;
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location;
= 进行普通字符精确匹配。也就是完全匹配;
@ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
优先级:
等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项
前缀普通匹配(^~)优先级次之。不支持正则表达式。使用前缀匹配,如果有多个location匹配的话,则使用表达式最长的那个
正则表达式类型(~ ~)的优先级次之。一旦匹配成功,则不再查找其他匹配项
常规字符串匹配,如果有多个location匹配的话,则使用表达式最长的那个
(location =) > (location 完整路径) > (location ^~ 路径) > (location , 正则顺序) > (location 部分起始路径)
文件路径的定义:
以root方式设置资源路径
语法: root path;
配置块: http、server、location、if
以alias方式设置资源路径
语法: alias path;
配置块: location
alias也是用来设置文件资源路径的,它与root的不同点主要在于如何解读紧跟location后面的uri参数
注意: location中使用root指令和alias指令的意义不同
(a) root,相当于追加在root目录后面 。比如访问的是 xxx/test=>/www/test
(b) alias,相当于对location中的url进行替换,比如访问的是 xxx/test,想要访问到/www/test就必须设置 alias /www/test