HTTP核心模块
limit_conn
用于限制客户端并发连接数,默认是编译进Nginx
sh
# 上下文:ttp server location
# 语法
limit_conn zone number;
# 示例 在http中添加
limit_conn_zone $binary_remote_addr zone=addr:10m
#在location中添加
limit_conn_status 503
limit_conn_log_level warn
limit_conn addr 2;
limit_rate 50; # 50字节
limit_conn_zone
sh
# 上下文:http
# 语法
limit_conn_zone key zone=name.size
# 示例
limit_conn_zone $binary_remote_addr zone=addr:10m
limit_conn_status
sh
# 上下文:http server location
# 语法
limit_conn_zone code
# 默认值
limit_conn_zone 503
limit_conn_log_level
sh
# 上下文:http server location
# 语法
limit_conn_log_level info|notice|warn|error;
# 默认值
limit_conn_log_level error
limit_req
限制客户端处理请求的平均速率,限流算法leaky_bucket
sh
# 上下文:ttp server location
# 语法
limit_req zone=name [burst=number] [nodelay|delay=number];
# 示例 在http中添加
limit_req zone=name burst=5 nodelay;
#在location中添加
limit_req_zone $binary_remote_addr zone=addr:10m;
limit_req_status 504;
limit_req_log_level notice;
limit_req zone=addr 7 nodelay;
limit_req_zone
sh
# 上下文:http
# 语法
limit_req_zone key zone=name.size rate=rate
# 示例
limit_req_zone $binary_remote_addr zone=addr:10m rate=2r/m
limit_req_status
sh
# 上下文:http server location
# 语法
limit_req_status code
# 默认值
limit_req_status 503
limit_req_log_level
sh
# 上下文:http server location
# 语法
limit_req_log_level info|notice|warn|error;
# 默认值
limit_req_log_level error
access
限制特定IP或者网段访问
allow
sh
# 上下文:http server location limit_except
# 语法
allow address|CIDR|UNIX|all;
# 示例
allow 192.168.0.10
deny
sh
# 上下文:http server location limit_except
# 语法
deny address|CIDR|UNIX|all allow|deny;
# 示例
deny 192.168.0.10
组合使用
sh
location / {
deny 192.168.1.1
allow 192.168.1.0/24
allow 10.1.1.0/16
allow 2001:0db8::/32
deny all;
}
auth_basic
限制特定用户访问的模块
auth_basic
sh
# 上下文:http server location limit_except
# 语法
auth_basic string(显示提示信息) | off
# 默认值
auth_basic off;
auth_basic_user_file
sh
# 上下文:http server location limit_except
# 语法
auth_basic_user_file file;
生成密码文件工具
可执行程序:htpasswd
所属软件包:httpsd-tools
sh
# 生成新的密码文件, 第一次加参数c
htpasswd -bc encrypt_pass jack 123456
# 添加新用户密码,如果再加参数c会把第一次用户密码覆盖
htpasswd -b encrypt_pass mike 123456
request
基于子请求收到的http响应码做访问限制,需要通过--with-http_auth_request_module
编译到Nginx中。
auth_request
sh
# 上下文:http server location
# 语法
auth_request uri | off
# 默认值
auth_request off;
auth_request_set
sh
# 上下文:http server location
# 语法
auth_request_set $variable value
示例
sh
location /private/ {
auth_request /auth; # 请求重定向
}
# 鉴权,鉴权服务器返回2XX的响应码才可以继续访问原请求
location /auth {
proxy_pass http://jianquan.com/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
return
停止处理请求,直接返回响应码或重定向到其它URL,执行return指令后,location中后续指令将不会被执行。
sh
# 上下文:http server location
# 语法
return code [text];
return code URL;
return URL;
# 示例
location / {
...
return 302 /bbs;
}
rewrite
根据指定正则表达式匹配规则,重写URL。
sh
# 上下文:server location if
# 语法
# flag
# last 重写后的URL发起新请求,再次进入server段,重试location中的匹配
# break 直接使用重写后的URL,不再匹配其它location中的语句,而是直接通过路径找资源
# redirect 返回302临时重定向
# permanent 返回301永久重定向
rewite regex replacement [flag];
# 示例
location / {
rewrite /images/(.*\.jpg)$ /pic/$1;
}
return & rewrite 优先级
- 如果同时出现return和rewrite,如果return在前,则直接返回;
- 如果rewrite在前,且flag为break,则直接跳转重写,也就是直接寻找资源目录;如果是last则跳过,重新循环server;如果flag为空,则继续向下执行,直到return语句;
- 如果location中有return指令则先执行return,没有再去找文件资源。
if
sh
# 上下文:server location
# 语法
if (condition) {...}
# 示例
if ($http_user_agent ~ Chrome) {
...
return 302 /bbs;
}
IMPORTANT
sh
location / {
if ( $uri = "/images/" ) {
rewrite (.*) /pics/ break;
}
return 200 "return in images";
}
这种if包裹的rewrite语句和return同时存在,测试顺序执行。
condition
$variable
仅为变量时,值为空或者以0开头字符串都会被当做false处理= or !=
相等或者不等~ or !~
正则匹配或者非正则匹配~*
正则匹配不区分大小写-f or !-f
检查文件存在或者不存在-d or ! ~d
检查目录存在或者不存在-e or ! ~e
检查符号、目录、符号链接等存在或者不存在-x or ! ~x
检查文件可执行或者不可执行
variable
TCP连接相关变量
variable | 描述 |
---|---|
$remote_addr | 客户端IP地址 |
$remote_port | 客户端端口 |
$server_addr | 服务端IP地址 |
$server_port | 服务端端口 |
$server_protocol | 服务端协议 |
$binary_remote_addr | 二进制格式的客户端IP地址 |
$connection | TCP连接的序号,递增 |
$connection_request | TCP连接的当前的请求数量 |
$proxy_protocol_addr | 若使用了proxy_protocol协议,则返回协议中地址,否则返回空 |
$proxy_protocol_port | 若使用了proxy_protocol协议,则返回协议中端口,否则返回空 |
HTTP请求过程中相关变量
variable | 描述 |
---|---|
$uri | 请求的URL,不包括参数 |
$request_uri | 请求的URL,包含参数 |
$scheme | 协议名,http或者https |
$request_method | 请求方法 |
$request_length | 全部请求的长度,包括请求行,请求头,请求体 |
$args | 全部参数字符串 |
$arg_参数名 | 特定参数值 |
$is_args | URL中有参数,则返回? ;否则返回空 |
$query_string | 与args相同 |
$remote_user | 由HTTP Basic Authentication协议传入的用户名 |
特殊变量
variable | 描述 |
---|---|
$host | 先看请求行,再看请求头-H 设置,最后找server_name |
$http_user_agent | 用户浏览器 |
$http_referer | 从哪些链接过来的请求 |
$http_via | 经过一层代理服务器,添加对应代理服务器的信息 |
$http_x_forwarded_for | 获取用户真实IP |
$http_cookie | 用户cookie |
处理HTTP请求相关变量
variable | 描述 |
---|---|
$request_time | 处理请求已耗费的时间 |
$request_id | 请求ID,随机字符串 |
$request_completion | 请求处理完成返回OK,否则返回空 |
$server_name | 匹配上的请求的server_name值 |
$https | 若开启https,则返回on,否则返回空 |
$request_filename | 磁盘文件系统待访问文件的完整路径 |
$document_root | 由URI和root/alias规则生成的文件夹路径 |
$realpath_root | 将document_root中的软链接换成真实路径 |
$limit_rate | 返回响应时的速度上限值 |
autoindex
用户请求以/
结尾时,列出目录结构。
sh
# 上下文:http server location
# 语法
autoindex on | off
# 默认
autoindex off
autoindex_exact_size
显示文件大小,on以字节显示,off以相应的数据大小单位显示。
sh
# 上下文:http server location
# 语法
autoindex_exact_size on | off
# 默认
autoindex_exact_size on
autoindex_format
以什么形式显示目录结构。
sh
# 上下文:http server location
# 语法
autoindex_format html | xml | json | jsonp;
# 默认
autoindex_format html
autoindex_localtime
文件显示的时间格式。
sh
# 上下文:http server location
# 语法
autoindex_localtime on | off
# 默认
autoindex_localtime off