Nginx面试题 - Nginx中有哪些全局变量?请分别介绍
回答重点
Nginx中的全局变量(又称内置变量)是其配置文件中高度有用的工具,它们能够被你用来获取请求以及服务器相关的各种信息。关键的全局变量包括remote。ddr、remote_user、http,ost、server_name、$request_uri等等,这些变量在配置Nginx 的时候非常常用。
- $remote_addr:这是客户端IP地址。无论你是在做日志记录还是在做访问控制,这个变量都是非常有用的。例如,如果你想要限制某些IP地址访问你的服务器,这个变量就派上用场了
- $remote_user:这个变量记录了经过身份验证的远程用户的名字。在设置了基础认证的情况下,这个变量会很有帮助。
- httphost:这是客户端请求中的主机头信息。很多时候,我们需要根据请求头中提供的信息来进行一些个性化处理,http_host:这是客户端请求中的主机头信息。很多时候,我们需要根据请求头中提供的信息来进行一些个性化处理,httphost:这是客户端请求中的主机头信息。很多时候,我们需要根据请求头中提供的信息来进行一些个性化处理,http_host就是非常好用的工具。
- $servername:这个变量包含了处理请求的服务器名称。你可能需要在不同的服务器块中记录日志或者执行不同的操作,这个变量就变得必不可少。
- $request_uri:这是完整的请求URI,它不包含主机名,但包括了请求参数。很多情况下,我们需要用到这个变量来做重定向或者日志分析。
- $query_string:这个变量包含了请求的查询字符串,即?号后面的部分。在处理GET请求的时候,尤其是分析和记录查询参数,这个变量就非常有用。
- argVARIABLE:这是请求URI中的一个具体的查询参数,比如arg_VARIABLE:这是请求URI中的一个具体的查询参数,比如argVARIABLE:这是请求URI中的一个具体的查询参数,比如arg_name表示查询参数name的值。如果你想要单独处理某个查询参数,这个变量会派上用场。
- status:这是响应的HTTP状态码,比如200、404等等。在写日志或做分析时,status:这是响应的HTTP状态码,比如200、404等等。在写日志或做分析时,status:这是响应的HTTP状态码,比如200、404等等。在写日志或做分析时,status是非常重要的变量。
- $body_bytes_sent:这是响应体的字节数。对分析流量和性能优化来说,这个变量非常有帮助。
引言
Nginx提供了丰富的内置全局变量,这些变量在处理HTTP请求时非常有用,可以在配置文件中直接使用。本文将详细介绍Nginx中常用的全局变量及其用途。
常用Nginx全局变量分类
请求相关变量
变量名 | 描述 | 示例值 |
---|
$request_method | 请求方法 | GET, POST等 |
$request_uri | 完整的原始请求URI(带参数) | /index.php?id=1 |
$uri | 当前请求的URI(不带参数) | /index.php |
$args | 请求中的参数 | id=1 |
$query_string | 同$args | id=1 |
$is_args | 如果请求有参数则值为"?",否则为空 | ? 或空 |
$remote_addr | 客户端IP地址 | 192.168.1.100 |
$remote_port | 客户端端口号 | 54321 |
$remote_user | 基本认证提供的用户名 | admin |
响应相关变量
变量名 | 描述 | 示例值 |
---|
$status | 响应状态码 | 200, 404等 |
$body_bytes_sent | 发送给客户端的字节数 | 1024 |
$bytes_sent | 发送给客户端的字节总数 | 1024 |
$sent_http_HEADER | 任意响应头字段 | $sent_http_content_type = “text/html” |
连接相关变量
变量名 | 描述 | 示例值 |
---|
$connection | 连接序列号 | 1, 2, … |
$connection_requests | 当前连接上的请求数 | 1, 2, … |
$nginx_version | Nginx版本号 | 1.18.0 |
$hostname | 服务器主机名 | web01 |
时间相关变量
变量名 | 描述 | 示例值 |
---|
$request_time | 请求处理时间(秒,毫秒精度) | 0.305 |
$msec | 当前时间(秒,毫秒精度) | 1630000000.123 |
$time_iso8601 | ISO8601格式时间 | 2023-08-25T14:30:00+08:00 |
$time_local | 本地时间(Common Log格式) | 25/Aug/2023:14:30:00 +0800 |
HTTP头相关变量
变量名 | 描述 | 示例值 |
---|
$http_HEADER | 任意请求头字段 | $http_user_agent = “Mozilla/5.0” |
$content_type | 请求的Content-Type头 | application/json |
$content_length | 请求的Content-Length头 | 1024 |
$host | 请求的主机名 | example.com |
其他实用变量
变量名 | 描述 | 示例值 |
---|
$server_protocol | 请求协议版本 | HTTP/1.1 |
$scheme | 请求协议 | http , https |
$server_addr | 服务器地址 | 192.168.1.1 |
$server_port | 服务器端口 | 80 , 443 |
$request_filename | 当前请求的文件路径 | /var/www/index.html |
$document_root | 当前请求的root指令值 | /var/www |
$realpath_root | 当前请求的root指令的真实路径 | /var/www |
变量使用示例
日志格式配置
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
access_log /var/log/nginx/access.log main;
条件判断
if ($http_user_agent ~* "mobile") {
set $mobile_request 1;
}
if ($request_method = POST) {
return 403;
}
重定向
location /old {
return 301 $scheme://$host/new$request_uri;
}
注意事项
- 变量名称区分大小写
- 变量值在请求处理过程中可能会变化
- 某些变量只在特定阶段可用
- 自定义变量可以使用
set
指令创建
通过合理使用这些全局变量,可以实现复杂的请求处理逻辑、精细的日志记录和灵活的重定向规则。