概述
connection和request
connection就是我们常说的tcp连接
而request即请求,例如我们web开发常用的http协议,该应用层协议必须建立在connection的tcp协议之上。
limit_conn模块(对connection做处限制)
简介
该模块nginx会默认编译进去的,用于限制单位时间段内单客户连接并发数。使用的是共享内存,对所有worker子进程都生效。
指令
limit_conn_zone
语法格式:limit_conn_zonn key值 zone=自定义名称.共享空间大小
默认值:无
上下文:http
示例:limit_conn_zonn $binary_remote_addr zone=addr.10m
注意我们使用的key为binary_remote_addr
,原因很简单,binary_remote_addr
默认只用4字节的空间,而remote_addr
却需要7-15个字节的空间。
上面的配置我们共享空间使用了10m,我们都知道1m可以维护3w2个连接,所以10m的共享空间足够了。
limit_conn_status
语法格式:limit_conn_status code
;
默认值: limit_conn_status 503
;
上下文:http、server、location
limit_conn_log_level
语法:limit_conn_log_level info | notice | warn | error;
默认值:limit_conn_log_level error;
上下文:http、server、location
limit_conn
语法:limit_conn_log_level info | notice | warn | error;
默认值:limit_conn_log_level error;
上下文:http、server、location
演示每个用户同一个时间段只能请求两次
在http模块增加下面这段配置,意味建立一个共享内存为10m的limit_conn模块。
limit_conn_zone $binary_remote_addr zone=limit_addr:10m;
server模块配置如下
server {
listen 8081;
server_name localhost;
location / {
root /etc/nginx/html;
index index.html;
# 并发数超过2返回503
limit_conn_status 503;
# 打印的日志等级为warn
limit_conn_log_level warn;
#
limit_conn limit_addr 2;
# 为了演示并发请求不超过2这里nginx向客户端传送响应的速率修改为150字节每秒
limit_rate 150;
}
配置后可以检查一下,在让nginx进行一次重载
/usr/sbin/nginx -t
1004 /usr/sbin/nginx -s reload
可以看到若单位时间内连续刷新页面就会出现503错误页面
limit_req模块(对request处理速率做出限制)
简介
用于限制客户端请求的连接速率,nginx默认会编译该模块,使用共享内存,对所有worker子进程都有效。而限流算法用的是leaky_bucket算法。
如下图,上方表格0-2
有12Mbps
,而7-9
有2Mbps
,计算一下10s内Mbps为12*2+2*3=30
,所以平均一下10s的速率我们可以设定为3Mbps,这样将突发的流量削平,确保应用稳定,当请求超过的负载后就会被拒绝。
语法
limit_req_zone
语法: limit_req_zone key zone=自定义名称:共享空间大小 rate=速率值
默认值:无
上下文:http
示例:limit_req_zone $binary_remote_addr zone =one:10m rate=2r/m
limit_req_status
语法: limit_req_status code
默认值:limit_req_status 503
上下文:http、server、location
limit_req_log_level
语法: limit_req_log_level info | notice |warn |error
默认值:limit_req_log_level 503
上下文:http、server、location
limit_req
语法:limit_req zone =name [burst=number] [nodelay | delay =number];
默认值: 无
上下文:http、server、location
示例:limit_req=one;
示例
http模块添加以下配置,即创建一个限流模块,一分钟只能请求两次即30s内只能请求一次
limit_req_zone $binary_remote_addr zone=limit_req:15m rate=2r/m;
server模块添加如下配置
location / {
root /etc/nginx/html;
index index.html;
# 连接数超过数量返回504
limit_req_status 504;
# 打印的日志级别为notice
limit_req_log_level notice;
# 使用上面配置的limit_req模块
limit_req zone=limit_req;
# 下面这条配置会在2+7次连接后报504
# limit_req zone=limit_req burst=7 nodelay;
}
从access.log中可以看到请求超过2之后就会在日志出现notice日志
access模块(限制特定ip或网段)
简介
用于限制特定网段、ip地址的访问
语法
allow
语法:allow address | cidr | unix |all;
默认值:无
上下文:http、server、location、limit_except
示例: allow 192.168.1.110;
deny
语法:deny address | cidr | unix |all;
默认值:无
上下文:http、server、location、limit_except
示例: deny 192.168.1.0/24;
组合示例
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
示例
location / {
root /etc/nginx/html;
allow 192.168.0.0/24
deny all;
index index.html;
limit_req_status 504;
limit_req_log_level notice;
limit_req zone=limit_req burst=7 nodelay;
# limit_req zone=limit_req burst=7 nodelay;
}
auth_basic模块(限制特定用户访问)
简介
基于http authentication协议进行用户密码认证,默认已编译进nginx。
语法
字符串
语法: auth_basis string | off ;
默认值: auth_basic off;
上下文: http、server、location、limit_except;
文件
语法: auth_basic_user_file file;
默认值: -
上下文:http、server、location、limit_except;
示例
首先需要安装这两个依赖
yum -y install apr apr-util
然后再安装http-tool
rpm -ivh httpd-tools-2.4.6-90.el7.centos.x86_64.rpm
然后进入nginx目录执行下方命令
# 创建一个auth文件夹
mkdir auth
# 进入该文件夹
cd auth/
# 创建一个encry_pass 文件,添加一个jack用户,密码为123456
htpasswd -b -c encry_pass jack 123456
# 追加一个mike用户
htpasswd -b encry_pass mike 123456
此时使用cat指令就可以看到下方内容
jack:$apr1$.H1TiTiN$Sid9MY8sU9wirj5X56u3Q1
mike:$apr1$L8gMN2Lp$ZT7rrOuza0ELPrVc.o3uu1
location / {
root /etc/nginx/html;
index index.html;
auth_basic "test user pass";
auth_basic_user_file /etc/nginx/auth/encry_pass;
}
这时候我们键入网站就会弹出这个页面,输入上文的账号密码即可进入页面
auth_request模块(基于HTTP响应码做权限控制)
简介
基于http响应码部署一个鉴权服务器,做到访问控制,该模块默认未编译进nginx。
语法
基于uri
语法:auth_request uri |off;
默认值: auth_request off;
上下文:http、server、location
基于变量
语法: auth_request|_set $variable value;
默认值:-
上下文:http、server、location
示例
rewrite模块
return指令
简介
该指令会直接返回http响应码或者重定向到指定的url,return指令之后的语句都不会被执行。
语法
return code [text](text为可选项文本);
return code URL;
return URL;
默认值 :-
上下文:server、location、if
示例
server {
listen 8081;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /etc/nginx/html;
return 404;
index index.html;
}
我们也可以返回404,并响应一个页面
server {
listen 8081;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /etc/nginx/html;
# 响应302 并跳转到notFound这个映射
return 302 /notFound;
index index.html;
}
location /notFound {
root /etc/nginx/html;
# 注意 我们必须在nginx的html文件夹下创建一个notFound文件夹,然后创建一个notFound.html
index notFound.html;
}
}
可以看到被重定向到notFound了
还有一个是地址重定向的,不多赘述,即通过/ 302跳转到notFound这个地址
server {
listen 8081;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /etc/nginx/html;
return http://192.168.0.104:8081/notFound/;
index index.html;
}
location /notFound {
root /etc/nginx/html;
index notFound.html;
}
}
rewrite指令
简介
指定请求重定向到对应映射
语法
语法:rewire regex replacement [flag];
默认值:无
上下文:server、location、if
示例:rewrite/images/(.*.jpg)$ /pic/$1
rewrite中的flag
last:重写后的URL会再次进入server段匹配location
break:匹配到下一个url后不再匹配其他location
redirect:302临时重定向
permanent:301永久重定向
示例
永久重定向到notFound
server {
listen 8081;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# root /etc/nginx/html;
rewrite ^/(.*) http://192.168.0.104:8081/notFound permanent;
# index index.html;
}
location /notFound {
root /etc/nginx/html;
index notFound.html;
}
}
示例2 ,如下所示rewrite,下面这段命令就会一直跳到photos 这个location上
server {
listen 8081;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /images {
# 跳转/images 注意这里我们需要在html创建一个images文件夹,并在下面创建一个test.html
rewrite /images/(.*) /pics/$1 ;
}
location /pics {
# 跳转/photos 注意这里我们需要在html创建一个pics文件夹,并在下面创建一个test.html
rewrite /pics/(.*) /photos/$1 ;
}
location /photos {
return 200 "return 200 in /photos";
}
可以看到跳转到photo这个映射
示例3 在rewrite后面增加break,执行images时会直接获取/pics
映射资源,不会重新遍历location
server {
listen 8081;
server_name localhost;
root html;
location /images {
rewrite /images/(.*) /pics/$1 break;
}
location /pics {
rewrite /pics/(.*) /photos/$1 ;
}
location /photos {
return 200 "return 200 in /photos";
}
执行结果,可以看到获取的结果就是html的page文件夹下的资源
curl 10.168.104.32:8081/images/test.html
this is pics page
return和rewrite执行顺序
如下所示,遇到last会重新遍历查找location,若没加last或者break则顺序执行,遇到return就返回结果不再执行后续动作。
server {
listen 8081;
server_name localhost;
root html;
location /search {
rewrite /(.*) http://www.cctv.com permanent;
}
location /images {
rewrite /images/(.*) /pics/$1 last;
return 200 "return 200 in /images";
}
location /pics {
rewrite /pics/(.*) /photos/$1 ;
return 200 "return 200 in /pics";
}
location /photos {
return 200 "return 200 in /photos";
}
所以最终结果如下
curl 10.168.104.32:8081/images/test.html
return 200 in /pics
rewrite的if指令
语法: if(condition){};
默认值:无
上下文:server、location
示例:
if($http_user_agent ~ Chrome){
rewirte /(.*) /browser/$1 break;
}
condition:
- $variable:仅为变量时,值为空或以0开头字符串都会被当作false处理
=或者!=
: 等于或者不等于~或!~
:匹配或者不匹配~*
: 正则匹配,不区分大小写-f或!-f
:检查文件存在或者不存在-d 或者!-d
:检查目录存在或不存在-e 或!-e
:检查文件、目录、符号连接等存在或不存在-x或!-x
:检查文件可执行或不可执行
示例1:若远程连接的ip地址为指定ip返回200
配置
server{
listen 8081;
server_name localhost;
root html;
# 注意,这里我们需要为search专门在html中配置一个search的文件夹并创建index.html文件,否则会报404
location /search/ {
if ( $remote_addr = "103.0.0.0") {
return 200 "test if ok ";
}
}
}
假如我们不用指定ip访问,就会报如下问题
[root@localhost ~]# curl 10.168.104.32:8081/search
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.10.2</center>
</body>
</html>
若使用指定ip访问
示例2 若location匹配到images,我们就将其重写到pics目录下
server{
listen 8081;
server_name localhost;
root html;
location / {
# 如果匹配到的uri为images,则重写到pics目录下
if ( $uri = "/images/") {
rewrite (.*) /pics/ break;
}
}
}
测试
curl http://10.168.104.32:8081/images/
# 可以看到输出结果跳转到了index html了
this is pics index html
autoindex
作用:当请求的location以/结尾时,会以文件格式显示,常用于提供于对外文件下载
指令集:
1. autoindex
语法:autoindex on |off
默认值:autoindex off;
上下文:http、server、location
2. autoindex_exact_size
语法: autoindex_exact_size on | off;
默认值:autoindex_exact_size on;
上下文: http、server、location
3. autoindex_format(重点 决定文件目录的格式)
语法:autoindex_format html | xml | json | jsonp
默认值:autoindex_format html;
上下文:http、server、location
4. autoindex_localtime
语法:autoindex_localtime on |off;
默认值:autoindex_localtime off;
上下文:http、server、location
示例
server{
listen 8081;
server_name localhost;
location /download/ {
# 这里选定目录为tmp目录,所以我们需要在tmp目录下新建一个download文件夹,否则会报404
root /tmp;
# 注意若该目录下有a.html页面就不会显示下载文件而是显示a.html的内容
index a.html;
# 开启autoindex
autoindex on;
# 配置为off就不会精确计算大小,更好看一些
autoindex_exact_size on;
autoindex_format html;
# on的话会按照24消失进行计算
autoindex_localtime off;
}
}
显示结果
TCP连接相关变量
分类
- TCP连接变量
- HTTP请求变量
- nginx处理HTTP请求变量
- nginx返回响应变量
- nginx内部变量
TCP连接相关变量
remote_addr 客户端地址,例如192.168.1.1
remote_port 客户端端口,例如58473
binary_remote_addr 客户端地址的整型格式
connection 已处理连接,是一个递增的序号
connection_request 当前连接上执行的请求数,对于keepalive连接有意义
proxy_protocol_addr 如果使用proxy_protocol协议,则返回原始用户的地址,否则为空
proxy_protocol_port 如果使用proxy_protocol协议,则返回原始用户的端口,否则为空
server_addr 服务器地址,例如192.168.184.240
server_port 服务器端口,例如80
server_protocol 服务端协议,例如HTTP/1.1
配置
server{
listen 8081;
server_name localhost;
location / {
return 200 "remote_addr: $remote_addr
remote_port: $remote_port
server_addr: $server_addr
server_port: $server_port
server_protocol: $server_protocol
connection: $connection
proxy_protocol_addr: $proxy_protocol_addr
";
}
演示
# 可以看到connection不断+1
[root@localhost download]# curl 10.168.104.32:8081
remote_addr: 10.168.104.32
remote_port: 54868
server_addr: 10.168.104.32
server_port: 8081
server_protocol: HTTP/1.1
connection: 20
proxy_protocol_addr:
[root@localhost download]# curl 10.168.104.32:8081
remote_addr: 10.168.104.32
remote_port: 54870
server_addr: 10.168.104.32
server_port: 8081
server_protocol: HTTP/1.1
connection: 21
proxy_protocol_addr:
HTTP请求相关变量
conten_length 请求包体头部长度
content_type 请求包体类型
arg_参数名 URL中某个参数
args 所有URL参数
is_args URL中有参数,则返回?;否则返回空
query_string 与args完全相同
uri 请求的URL,不包含参数
request_uri 请求的URL,包含参数
scheme 协议名,http或者https
request_method 请求的方法,GET、HEAD、POST等
request_length 所有请求内容的大小,包含请求行,头部,请求体
remote_user 由HTTP Basic Authentication协议传入的用户名
request_body_file 暂缺
request_body 暂缺
request 暂缺
配置
location / {
auth_basic "Test Auth";
auth_basic_user_file auth/encrypt_pass;
return 200 "uri: $uri
request_uri: $request_uri
scheme: $scheme
request_method: $request_method
request_length: $request_length
args: $args
is_args: $is_args
arg_pid: $arg_pid
query_string: $query_string
remote_user: $remote_user
host: $host
";
}
测试
[root@localhost download]# curl 10.168.104.32:8081?par=1
uri: /
request_uri: /?par=1
scheme: http
request_method: GET
request_length: 88
args: par=1
is_args: ?
arg_pid:
query_string: par=1
remote_user:
host: 10.168.104.32
[root@localhost download]# curl "10.168.104.32:8081?par=1&par2=2"
uri: /
request_uri: /?par=1&par2=2
scheme: http
request_method: GET
request_length: 95
args: par=1&par2=2
is_args: ?
arg_pid:
query_string: par=1&par2=2
remote_user:
host: 10.168.104.32
Nginx处理请求时相关变量(也可以作为配置变量,如limit_rate)
request_time 请求处理到现在所耗费的时间,单位为秒,例如0.03代表30毫秒
request_completion 请求处理完成,则返回OK,否则为空
request_id 16进制显示的请求id,随机生成的
server_name 匹配上请求的server_name值
https 若开启https,则值为on,否则为空
request_filename 待访问文件的完整路径
document_root 由URI和root/alias规则生成的文件夹路径
realpath_root 将document_root中的软链接换成真实路径
limit_rate 返回响应时的速度上限值
Nginx返回响应时相关变量
body_bytes_sent 响应体中真实内容的大小
body_sent 全部响应体大小
status HTTP返回状态码
最后
以上就是粗犷鸡翅为你收集整理的Nginx应用进阶(HTTP核心模块)connection和requestlimit_conn模块(对connection做处限制)limit_req模块(对request处理速率做出限制)access模块(限制特定ip或网段)auth_basic模块(限制特定用户访问)auth_request模块(基于HTTP响应码做权限控制)rewrite模块autoindexTCP连接相关变量的全部内容,希望文章能够帮你解决Nginx应用进阶(HTTP核心模块)connection和requestlimit_conn模块(对connection做处限制)limit_req模块(对request处理速率做出限制)access模块(限制特定ip或网段)auth_basic模块(限制特定用户访问)auth_request模块(基于HTTP响应码做权限控制)rewrite模块autoindexTCP连接相关变量所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复