后端面试必备:Nginx中的全局变量详解

Nginx面试题 - Nginx中有哪些全局变量?请分别介绍

回答重点

Nginx中的全局变量(又称内置变量)是其配置文件中高度有用的工具,它们能够被你用来获取请求以及服务器相关的各种信息。关键的全局变量包括remote。ddr、remote_user、http,ost、server_name、$request_uri等等,这些变量在配置Nginx 的时候非常常用。

  1. $remote_addr:这是客户端IP地址。无论你是在做日志记录还是在做访问控制,这个变量都是非常有用的。例如,如果你想要限制某些IP地址访问你的服务器,这个变量就派上用场了
  2. $remote_user:这个变量记录了经过身份验证的远程用户的名字。在设置了基础认证的情况下,这个变量会很有帮助。
  3. httphost:这是客户端请求中的主机头信息。很多时候,我们需要根据请求头中提供的信息来进行一些个性化处理,http_host:这是客户端请求中的主机头信息。很多时候,我们需要根据请求头中提供的信息来进行一些个性化处理,httphost:这是客户端请求中的主机头信息。很多时候,我们需要根据请求头中提供的信息来进行一些个性化处理,http_host就是非常好用的工具。
  4. $servername:这个变量包含了处理请求的服务器名称。你可能需要在不同的服务器块中记录日志或者执行不同的操作,这个变量就变得必不可少。
  5. $request_uri:这是完整的请求URI,它不包含主机名,但包括了请求参数。很多情况下,我们需要用到这个变量来做重定向或者日志分析。
  6. $query_string:这个变量包含了请求的查询字符串,即?号后面的部分。在处理GET请求的时候,尤其是分析和记录查询参数,这个变量就非常有用。
  7. argVARIABLE:这是请求URI中的一个具体的查询参数,比如arg_VARIABLE:这是请求URI中的一个具体的查询参数,比如argVARIABLE:这是请求URI中的一个具体的查询参数,比如arg_name表示查询参数name的值。如果你想要单独处理某个查询参数,这个变量会派上用场。
  8. status:这是响应的HTTP状态码,比如200、404等等。在写日志或做分析时,status:这是响应的HTTP状态码,比如200、404等等。在写日志或做分析时,status:这是响应的HTTP状态码,比如200404等等。在写日志或做分析时,status是非常重要的变量。
  9. $body_bytes_sent:这是响应体的字节数。对分析流量和性能优化来说,这个变量非常有帮助。

引言

Nginx提供了丰富的内置全局变量,这些变量在处理HTTP请求时非常有用,可以在配置文件中直接使用。本文将详细介绍Nginx中常用的全局变量及其用途。

常用Nginx全局变量分类

请求相关变量

客户端请求
Nginx接收请求
解析请求行
设置$request_method等变量
解析请求头
设置$http_HEADER等变量
变量名描述示例值
$request_method请求方法GET, POST等
$request_uri完整的原始请求URI(带参数)/index.php?id=1
$uri当前请求的URI(不带参数)/index.php
$args请求中的参数id=1
$query_string$argsid=1
$is_args如果请求有参数则值为"?",否则为空?或空
$remote_addr客户端IP地址192.168.1.100
$remote_port客户端端口号54321
$remote_user基本认证提供的用户名admin

响应相关变量

Nginx处理请求
生成响应
设置响应状态
$status
设置响应头
$sent_http_HEADER
变量名描述示例值
$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_versionNginx版本号1.18.0
$hostname服务器主机名web01

时间相关变量

请求开始
记录$request_time
记录$msec
请求处理完成
变量名描述示例值
$request_time请求处理时间(秒,毫秒精度)0.305
$msec当前时间(秒,毫秒精度)1630000000.123
$time_iso8601ISO8601格式时间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;
}

注意事项

  1. 变量名称区分大小写
  2. 变量值在请求处理过程中可能会变化
  3. 某些变量只在特定阶段可用
  4. 自定义变量可以使用set指令创建

通过合理使用这些全局变量,可以实现复杂的请求处理逻辑、精细的日志记录和灵活的重定向规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值