Nginx: 配置项之autoIndex模块与Nginx变量
通过Nginx变量,有助于去定制我们的log文件,可以对各种用户行为,甚至是Nginx的运行的一些性能参数,进行一个更好的一个分析。比如说,Nginx的版本号, 以及Nginx 启动了多个worker子进程的时候,请求被哪个worker子进程处理。这个时候 Nginx 内部也会产生一些相关的变量,这部分变量,叫做Nginx 的内部变量。从一个用户的一个请求处理流程来看,被Nginx处理完成之后,返
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地址 |
connection | TCP连接的序号,递增 |
connection_request | TCP连接当前的请求数量 |
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_args | URL中有参数,则返回 ?;否则返回空 |
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
请求这个urluri: /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
请求这个urluri: /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"
请求这个urluri: /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"
请求这个urluri: /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
请求这个urluri: /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
请求这个urluri: /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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)