Skip to content

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 优先级

  1. 如果同时出现return和rewrite,如果return在前,则直接返回;
  2. 如果rewrite在前,且flag为break,则直接跳转重写,也就是直接寻找资源目录;如果是last则跳过,重新循环server;如果flag为空,则继续向下执行,直到return语句;
  3. 如果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地址
$connectionTCP连接的序号,递增
$connection_requestTCP连接的当前的请求数量
$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_argsURL中有参数,则返回?;否则返回空
$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