Nginx提供了很多内置的变量

本文详细介绍了Nginx提供的多种内置变量,如客户端IP地址、请求方法等,这些变量对于配置Nginx服务器至关重要。
Nginx提供了很多内置的变量,如:
$arg_PARAMETER 这个变量包含在查询字符串时GET请求PARAMETER的值。

$args 这个变量等于请求行中的参数。

$binary_remote_addr 二进制码形式的客户端地址。

$body_bytes_sent 传送页面的字节数

$content_length 请求头中的Content-length字段。

$content_type 请求头中的Content-Type字段。

$cookie_COOKIE cookie COOKIE的值。

$document_root 当前请求在root指令中指定的值。

$document_uri 与$uri相同。

$host 请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称。

$is_args 如果$args设置,值为"?",否则为""。

$limit_rate 这个变量可以限制连接速率。

$nginx_version 当前运行的nginx版本号。

$query_string 与$args相同。

$remote_addr 客户端的IP地址。

$remote_port 客户端的端口。

$remote_user 已经经过Auth Basic Module验证的用户名。

$request_filename 当前连接请求的文件路径,由root或alias指令与URI请求生成。

$request_body 这个变量(0.7.58+)包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义。

$request_body_file 客户端请求主体信息的临时文件名。

$request_completion 未知。

$request_method 这个变量是客户端请求的动作,通常为GET或POST。
包括0.8.20及之前的版本中,这个变量总为main request中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作。

$request_uri 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI。

$scheme 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;

$server_addr 服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。

$server_name 服务器名称。

$server_port 请求到达服务器的端口号。

$server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$uri 请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。


另外:
HTTP_X_FORWARDED_FOR是透过代理服务器取得客户端的真实IP地址,有些用此方法读取到的仍然是代理服务器的IP。还有一点需要注意的是:如果客户端没有通过代理服务器来访问,那么用 HTTP_X_FORWARDED_FOR 取到的值将是空的。
<think>好的,用户问的是如何在Nginx的日志格式中增加host变量输出。首先,我需要确认用户对Nginx配置的基本了解程度。他们可能已经知道如何修改nginx.conf,但可能对具体的日志变量不太熟悉。 接下来,我应该回忆Nginx的日志模块相关文档。记得log_format指令可以定义日志格式,而内置变量中有$host,这个变量代表请求的主机名。用户的需求很明确,就是在现有的日志格式里加上主机名,可能是为了区分不同域名的访问情况,或者进行流量分析。 然后,考虑用户可能的当前配置。默认的日志格式可能没有包含$host,所以需要指导他们在http块中定义一个新的log_format,包含$host变量。比如,在nginx.conf里添加类似log_format combined_host '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $host';这样的配置,并在server或location块中应用这个新格式。 还需要提醒用户检查语法是否正确,使用nginx -t测试,然后重载配置。可能用户会遇到问题,比如变量没显示出来,这时候需要检查是否正确应用了log_format,或者是否有拼写错误。 另外,考虑到用户可能想保留原有的日志格式,但新增一个包含host的格式,或者替换现有的。这时候需要说明如何命名不同的日志格式,并如何在不同的server块中选择使用。例如,可以创建多个log_format,然后在access_log指令中指定使用哪个格式。 最后,用户可能需要知道如何验证修改是否生效,可以建议他们发送测试请求,然后检查日志文件是否有host字段出现。如果有多个虚拟主机,确保每个server块都正确引用了新的日志格式,这样不同域名的访问日志就能正确记录对应的host值。 还要注意权限问题,确保Nginx进程有权限写入日志文件,避免因为权限问题导致日志无法生成。另外,日志文件的大小和轮转策略也需要考虑,尤其是在高流量环境下,日志可能会快速增长,需要配置logrotate来管理日志文件。 总结下来,步骤应该是:编辑配置文件,定义新的日志格式,应用新格式到访问日志,测试并重载配置,验证结果。同时提供示例和常见问题解决方法,确保用户能够顺利实现需求。</think>在 Nginx 中配置日志格式并添加 `$host` 变量(用于记录客户端请求的域名),可以通过修改 **`nginx.conf`** 文件实现。以下是详细步骤: --- ### **一、修改日志格式** 1. **打开 Nginx 配置文件** 通常位于 `/etc/nginx/nginx.conf` 或 `/usr/local/nginx/conf/nginx.conf`。 2. **在 `http` 块内定义日志格式** 找到 `http { ... }` 块,添加或修改 `log_format` 指令,例如: ```nginx http { # 默认日志格式(可自定义名称,如 combined_host) log_format combined_host '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" $host'; # 其他配置... } ``` - **关键变量说明**: - `$host`:客户端请求的域名(优先级:HTTP 请求头中的 `Host` 字段 > 请求行中的域名 > 匹配的 `server_name`)。 - 其他常用变量:`$remote_addr`(客户端IP)、`$request`(请求方法+URI+协议)、`$status`(响应状态码)。 3. **应用新日志格式到访问日志** 在 `server` 或 `location` 块中指定 `access_log` 使用新格式: ```nginx server { listen 80; server_name example.com; # 使用自定义日志格式 combined_host access_log /var/log/nginx/access.log combined_host; # 其他配置... } ``` --- ### **二、验证与重载配置** 1. **检查语法是否正确** 运行命令: ```bash nginx -t ``` 若输出 `syntax is ok` 表示配置正确。 2. **重载 Nginx 使配置生效** ```bash nginx -s reload ``` 3. **验证日志输出** 发送请求后,查看日志文件(如 `/var/log/nginx/access.log`),确认 `$host` 已输出: ```log 192.168.1.100 - - [01/Jul/2024:10:20:30 +0800] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0..." example.com ``` --- ### **三、高级用法** #### **1. 区分不同虚拟主机的日志** 为每个 `server` 块分配独立日志文件: ```nginx server { listen 80; server_name a.com; access_log /var/log/nginx/a.com.log combined_host; } server { listen 80; server_name b.com; access_log /var/log/nginx/b.com.log combined_host; } ``` #### **2. 动态日志文件名** 按日期分割日志(需配合定时任务清理旧日志): ```nginx access_log /var/log/nginx/access-$(date +%Y-%m-%d).log combined_host; ``` #### **3. 完整日志变量参考** | 变量名 | 说明 | 示例值 | |-------------------|-----------------------------|---------------------------| | `$host` | 请求的域名 | `example.com` | | `$http_host` | 原始 `Host` 请求头(含端口) | `example.com:8080` | | `$server_name` | 当前 `server` 块的名称 | `default_server` | | `$request_time` | 请求处理时间(秒) | `0.005` | | `$upstream_addr` | 后端服务器地址 | `127.0.0.1:8080` | --- ### **四、常见问题** #### **1. 日志中 `$host` 显示为空** - **原因**:客户端未发送 `Host` 请求头(如 HTTP/1.0 请求)。 - **解决方案**:使用 `$http_host` 或设置默认值: ```nginx log_format combined_host ... "$http_host"; # 显式依赖 Host 头 ``` #### **2. 日志文件权限问题** - **现象**:Nginx 无法写入日志文件。 - **解决**:检查日志目录权限: ```bash chown -R nginx:nginx /var/log/nginx/ chmod -R 755 /var/log/nginx/ ``` --- ### **五、总结** | 操作 | 指令/变量 | 作用 | |--------------------|----------------------|----------------------------------| | 定义日志格式 | `log_format` | 自定义日志内容与变量 | | 指定日志路径与格式 | `access_log` | 应用格式并设置日志文件存储位置 | | 关键变量 | `$host`、`$http_host` | 记录客户端请求的域名信息 | 通过添加 `$host` 变量,可以清晰区分不同域名的访问记录,便于分析流量来源和排查问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值