autoIndex模块

  • autoindex模块它所实现的一个基本功能,是当用户请求以 / 结尾式的URL,它会列出对应的目录结构
  • 比如说, 在实际的生态环境中,内部系统可能经常需要为用户提供一些下载功能。
  • 可能需要列出来某一个磁盘上的一个文件, 比如,磁盘上是一个视频目录文件
  • 在访问某一个特定的目录的URL的时候,会给用户列出来所有视频文件
  • 这个时候,通常就会使用到autoindex这样一个功能

1 )指令集

1.1 autoindex

  • 语法:autoindex on | off;
  • 默认值:autoindex off
  • 上下文:http、server、location
  • 默认情况下是不打开这样一个功能的
  • 因为这样一个功能对我们的用户来说,会有很多隐藏信息
  • 在对一些特定的内网环境,可能是有用的
  • 比如说,我们的公司内部可能经常需要下载一些文件,分享一些文档
  • 使用这样一个功能,就可以很好的去搭建这样一个下载平台

1.2 autodindex_exact_size

  • 语法:autodindex_exact_size on | off;
  • 默认值:autodindex_exact_size off
  • 上下文:http、server、location
  • 默认情况下,它是一个on的一个指令,文件的大小,它会精确到字节,以字节为单位的
  • 把这个功能给关闭掉,字节很大的话,比如说50M,它小的话, 比如显示150Byte,或者更大的话,能显示来GB
  • 关闭后,使我们这个文件大小更直观,更友好

1.3 autoindex_format

  • 语法:autoindex_format html | xml | json | jsonp;
  • 默认值:autoindex_format html;
  • 上下文:http、server、location
  • 就是返回目录结构的时候,以哪种形式返回
  • 经常会用的是html 还有 xml/json/jsonp等
  • 这样一些格式我们都是可选的

1.4 autoindex_localtime

  • 语法:autoindex_localtime on | off;
  • 默认值:autoindex_localtime off;
  • 上下文:http、server、location
  • 这个决定文件的一个时间格式,默认情况下开off,它就显示GMT的格式

2 )具体配置

server {
	listen 		80;
	server 		name       www.baidu.com
	location /download/  {
		root /opt/source;
		index b.html;
		
		autoindex on;
		autoindex exact size on;
		autoindex format html;
		autoindex localtime off;
}
  • 注意,download/b.html 不存在, 如果存在,则下面配置会失效

  • 注意,如果 autoindex exact size off; 关闭,就会显示的更人性化

  • 注意,除了 html, 其他格式均不支持下载

变量分类

  • 变量分类有

    • TCP连接变量
    • HTTP请求变量
    • Nginx处理HTTP请求产生的变量
    • Nginx返回响应变量
    • Nginx内部变量
  • 我们的业务部门可能经常需要对运行的Nginx的一些数据,对用户一些行为进行分析

  • 通过Nginx变量,有助于去定制我们的log文件,可以对各种用户行为,甚至是Nginx的运行的一些性能参数,进行一个更好的一个分析

  • 从而有助于提升整个Nginx 性能,也有助于更好的去掌握Nginx去服务于业务部门

  • 从一个用户的一个请求处理流程来看,被Nginx处理完成之后,返回给我们的用户

  • 整个流程,大致经历了几个阶段

1 )TCP连接阶段

  • 我们远端有一个用户,现在有一个Nginx服务器部署了业务系统
  • 假如说用户首先需要去发起一个TCP请求跟Nginx建立连接
  • 三次握手后,建立一个TCP连接,在TCP连接后的一个阶段,产生一些变量:比如,四元组信息,用户原ip地址和原端口,nginx 的目的ip地址和目的端口
  • 建立了这样一个TCP连接之后,用户就会发送一些Http的请求

2 )Request 阶段

  • 这个时候要请求某一个页面,也通常会发送一个Http请求到 Nginx
  • 在这个request阶段,用户在请求中会发送一些详细的信息
  • 比如说, 请求的URL是什么样的?使用了何种协议? 请求的方法是什么?这些信息都会产生很多与之有关的变量
  • 这个是在用户发起这样一个HTTP请求的过程中所产生的一些变量

3 )处理HTTP请求产生的变量

  • 请求到达Nginx之后,肯定要对这样一个请求进行处理
  • 比如需要去拆开请求数据报文,根据URL去找Nginx对应的一个servername
  • 也就是需要有哪一台与之对应的虚拟主机来进行处理,可能有多个,也可能有一个,需要找到对应虚拟主机
  • 所以说,在处理过程中,可能也会产生一些相关的变量
  • 还有,再比如,限速模块,我们可以对返回给用户的一个请求进行限速,可能需要产生,具体的限速值这样一些相关的变量信息
  • 这个阶段是在 Nginx 处理请求的过程中所产生的一些变量

4 )Response 阶段

  • 当这些变量在Nginx处理完了之后,肯定需要去封装一些报文,然后将这些报文再响应给用户,以便用户进行一个展示
  • 在Nginx返回响应的过程中,会产生哪些变量?比如,状态码是什么?响应包体的大小,包括整个包体发送了多少个字节?

5 )其他

  • 除去上述四个阶段之外,Nginx自身的运行过程中,它也会产生一些相关的变量

  • 比如说,Nginx的版本号, 以及Nginx 启动了多个worker子进程的时候,请求被哪个worker子进程处理

  • 这个时候 Nginx 内部也会产生一些相关的变量,这部分变量,叫做Nginx 的内部变量

  • 因此,变量分类就是从一个用户请求到整个响应返回,大致可以分为以上5个阶段

TCP连接相关变量

变量名含义
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协议 则返回协议中端口 否则返回空
server {
	listen                   80;
	server_name              var.tcp.baidu.com;
	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
proxy_protocol_port:                      $proxy_protocol_port
";
	}
}
  • 这个 var.tcp.baidu.com 已经映射到本地hosts
  • $ curl var.tcp.baidu.com
    remote_addr:                              192.168.184.240
    remote_port:                              49428
    server_addr:                              192.168.184.240
    server_port:                              80
    server_protocol:                          HTTP/1.1
    connection:                               28
    proxy_protocol_addr:
    proxy_protocol_port:
    
    • remote_addr 客户端地址
    • remote_port 客户端端口
      • 可见,curl 命令是从 nginx本身访问的,所以,这里nginx服务器也是一个客户端
      • 也会启用一个 socket 端口: 49428
    • 这个connection 是 28,如果再次执行一次 curl 命令就会变成 29 …
    • 没有启用 proxy_protocol 协议,所以拿不到这两个地址

发送 HTTP 请求过程中产生的变量


1 )一般变量

变量名含义
uri请求的URL, 不包含参数
request_uri请求的URL, 包含参数
scheme协议名,http 或 https
request_method请求方法
request_length全部请求的长度,包括请求行、请求头、请求体
args全部参数字符串
arg_参数名特定参数值
is_argsURL中有参数,则返回 ?;否则返回空
query_string与args相同
remote_user由HTTP Basic Authentication协议传入的用户名
  • 在header中如何传递,在Nginx也同样如何处理

2 )特殊变量

变量名含义
host先看请求行,再看请求头,最后找server_name
http_user_agent用户浏览器
http_referer从哪些链接过来的请求
http_via经过一层代理服务器,添加对应代理服务器的信息,若有多个,则进行追加
http_x_forwarded_for获取用户真实IP
http_cookie用户cookie
  • 这些变量都经过 Nginx 特殊的处理, 也就是请求头上的变量和到Nginx时变量名称可能不匹配

3 )配置示例

示例1

server {
	listen 					80;
	server_name 		    var.request.baidu.com;
	location / {
		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
";
	}
}
  • 注意,var.request.baidu.com 在本机host已经配置好
  • $ curl var.request.baidu.com/images/index.html请求这个url
    uri:				/images/index.html
    request_uri:		/images/index.html
    scheme:				http
    request_method:     GET
    request_length:     103
    args:
    is args:
    arg_pid:
    query_string:
    remote user:
    
  • $ curl var.request.baidu.com/images/index.html?pid=3900001请求这个url
    uri:				/images/index.html
    request_uri:		/images/index.html?pid=3900001
    scheme:				http
    request_method:     GET
    request_length:     115
    args:               pid=3900001
    is args:            ?
    arg_pid:            3900001
    query_string:       pid=3900001
    remote user:
    
  • $ curl "var.request.baidu.com/images/index.html?pid=3900001&psid=333333"请求这个url
    uri:				/images/index.html
    request_uri:		/images/index.html?pid=3900001&psid=333333
    scheme:				http
    request_method:     GET
    request_length:     127
    args:               pid=3900001&psid=333333
    is args:            ?
    arg_pid:            3900001
    query_string:       pid=3900001&psid=333333
    remote user:
    
    • 注意上面多参数的 curl 后的url 要加上引号
  • $ curl -u admin:1234 "var.request.baidu.com/images/index.html?pid=3900001&psid=333333"请求这个url
    uri:				/images/index.html
    request_uri:		/images/index.html?pid=3900001&psid=333333
    scheme:				http
    request_method:     GET
    request_length:     166
    args:               pid=3900001&psid=333333
    is args:            ?
    arg_pid:            3900001
    query_string:       pid=3900001&psid=333333
    remote user:        admin
    

示例2

server {
	listen 					8088;
	server_name 		    var.request.baidu.com;
	location / {
		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
";
	}
}
  • $ curl var.request.baidu.com/images/index.html 请求这个url

    uri:				/images/index.html
    request_uri:		/images/index.html
    scheme:				http
    request_method:     GET
    request_length:     108
    args:               
    is args:           
    arg_pid:            
    query_string:       
    remote user:        
    host:               var.request.baidu.com
    
  • $ curl -H "Host: 'test.nginx.org'" var.request.baidu.com/images/index.html 请求这个url

    uri:				/images/index.html
    request_uri:		/images/index.html
    scheme:				http
    request_method:     GET
    request_length:     97
    args:               
    is args:           
    arg_pid:            
    query_string:       
    remote user:        
    host:               test.nginx.org
    
    • 注意,这里主要测试 特殊变量 host, 请求头上有 host,则采取请求头上的

处理HTTP请求相关变量


变量名含义
host先看请求行,再看请求头,最后找server_name
request_time处理请求已耗费的时间, 以s为单位,精确到毫秒
request_completion请求处理完成返回OK, 否则返回空
server_name匹配上请求的server_name值
https若开启https, 则返回on, 否则返回空
request filename磁盘文件系统待访问文件的完整路径
document root由URI和root/alias规则生成的文件夹路径
realpath_root将document_root中的软链接换成真实路径
limit_rate返回响应时的速度上限值

配置示例

{
	server {
		listen 80;
		server name var.process.baidu.com;
		location / {
			set $limit_rate   50;  # 设置50个字节的速率
			return 200 '$request_time
$request_id
$server name
$request filename
$document root
$realpath root
$request_completion # 这个不好模拟,整个请求处理都完成后,返回 OK, 这里的 return 没有处理完
$limit rate
';
		}
}
  • $ curl var.process.baidu.com/images/a.html
    0.000
    lbb5efabedd434a24158ac13d0d95789
    var.process.baidu.com
    /opt/nginx/html/images/a.html
    /opt/nginx/html
    /opt/nginx/html
    
    50
    
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐