`

在Nginx中记录自定义Header

 
阅读更多
原文地址:http://gunner.me/archives/363



从Apache切到Nginx需要保持日志格式统一,以便兼容之前的数据统计脚本

现在Apache的日志格式为:


1
LogFormat "%h %t %m %U %q %>s %{HEAD}i %D"
说明:

%h:客户端IP地址

%t:时间(标准英语格式)

%m:请求的方法(GET,POST)

%U:请求的URL路径,不包含查询字符串

%q:查询字符串

%>s:请求的最终状态

%{HEAD}i:请求头信息

%D:服务器处理请求所用时间,微秒为单位

对应的Nginx日志格式为:


1
2
3
log_format  main  '$remote_addr [$time_local] $request_method $uri '
                  '$query_string $status '
                  '$http_head $request_time ';
其中Apache里的%{HEAD}i这个参数里的HEAD是在程序里自定义了一个header,在Nginx里面取这个HEAD用到的是$http_head参数,head就是自定义的header名称HEAD, Nginx里面需要小写,在这里走了不少弯路。

用firebug获取http header,如下图

Snip20140828_3

有两部分内容,一个是响应头,一个是请求头,请求头是客户端发送给服务器的,包括Requst Line及HTTP Header,响应头是服务器返回给客户端的,包括Status Line及HTTP Header。关于http header的说明,这里有一篇很好的文章可以参考。

在Nginx里面可以用$upstream_http_’header名称’来获取响应头信息,比如$upstream_http_content_type将会获取到类似text/html; charset=utf-8的内容,说明返回的文件类型及编码格式。在我的需求中是要获取自定义的请求头的内容,需要使用$sent_http_’自定义header名称’来获取,但我测试过程中没有取到,用$http_’自定义header名称’才取到,也许和Nginx版本有关,我的版本是1.4.2。

另外,测试过程中用的是firefox的poster插件,可以自定义请求头,截图如下:

Snip20140828_4

自定义一个header,然后输入URL,点GET即可发送带有自定义header的请求,在服务器端查看日志可以看到取到了‘AAAAAAAAAAAAAAAAAAAAAA’.

附nginx.org里关于log_format参数的说明,英文不好,看着费劲。

The ngx_http_core_module module supports embedded variables with names matching the Apache Server variables. First of all, these are variables representing client request header fields, such as $http_user_agent, $http_cookie, and so on. Also there are other variables:

$arg_name
argument name in the request line

$args
arguments in the request line

$binary_remote_addr
client address in a binary form, value’s length is always 4 bytes

$body_bytes_sent
number of bytes sent to a client, not counting the response header; this variable is compatible with the “%B” parameter of the mod_log_config Apache module

$bytes_sent
number of bytes sent to a client (1.3.8, 1.2.5)

$connection
connection serial number (1.3.8, 1.2.5)

$connection_requests
current number of requests made through a connection (1.3.8, 1.2.5)

$content_length
“Content-Length” request header field

$content_type
“Content-Type” request header field

$cookie_name
the name cookie

$document_root
root or alias directive’s value for the current request

$document_uri
same as $uri

$host
in this order of precedence: host name from the request line, or host name from the “Host” request header field, or the server name matching a request

$hostname
host name

$http_name
arbitrary request header field; the last part of a variable name is the field name converted to lower case with dashes replaced by underscores

$https
“on” if connection operates in SSL mode, or an empty string otherwise

$is_args
“?” if a request line has arguments, or an empty string otherwise

$limit_rate
setting this variable enables response rate limiting; see limit_rate

$msec
current time in seconds with the milliseconds resolution (1.3.9, 1.2.6)

$nginx_version
nginx version

$pid
PID of the worker process

$pipe
“p” if request was pipelined, “.” otherwise (1.3.12, 1.2.7)

$proxy_protocol_addr
client address from the PROXY protocol header, or an empty string otherwise (1.5.12)
The PROXY protocol must be previously enabled by setting the proxy_protocol parameter in the listen directive.

$query_string
same as $args

$realpath_root
an absolute pathname corresponding to the root or alias directive’s value for the current request, with all symbolic links resolved to real paths

$remote_addr
client address

$remote_port
client port

$remote_user
user name supplied with the Basic authentication

$request
full original request line

$request_body
request body
The variable’s value is made available in locations processed by the proxy_pass, fastcgi_pass, uwsgi_pass, and scgi_pass directives.

$request_body_file
name of a temporary file with the request body
At the end of processing, the file needs to be removed. To always write the request body to a file, client_body_in_file_only needs to be enabled. When the name of a temporary file is passed in a proxied request or in a request to a FastCGI/uwsgi/SCGI server, passing the request body should be disabled by the proxy_pass_request_body off, fastcgi_pass_request_body off, uwsgi_pass_request_body off, or scgi_pass_request_body off directives, respectively.

$request_completion
“OK” if a request has completed, or an empty string otherwise

$request_filename
file path for the current request, based on the root or alias directives, and the request URI

$request_length
request length (including request line, header, and request body) (1.3.12, 1.2.7)

$request_method
request method, usually “GET” or “POST”

$request_time
request processing time in seconds with a milliseconds resolution (1.3.9, 1.2.6); time elapsed since the first bytes were read from the client

$request_uri
full original request URI (with arguments)

$scheme
request scheme, “http” or “https”

$sent_http_name
arbitrary response header field; the last part of a variable name is the field name converted to lower case with dashes replaced by underscores

$server_addr
an address of the server which accepted a request
Computing a value of this variable usually requires one system call. To avoid a system call, the listen directives must specify addresses and use the bind parameter.

$server_name
name of the server which accepted a request

$server_port
port of the server which accepted a request

$server_protocol
request protocol, usually “HTTP/1.0” or “HTTP/1.1”

$status
response status (1.3.2, 1.2.2)

$tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space
information about the client TCP connection; available on systems that support the TCP_INFO socket option

$time_iso8601local
time in the ISO 8601 standard format (1.3.12, 1.2.7)

$time_local

local time in the Common Log Format (1.3.12, 1.2.7)

$uri
current URI in request, normalized
The value of $uri may change during request processing, e.g. when doing internal redirects, or when using index files.

参考:http://blog.51yip.com/apachenginx/1277.html
分享到:
评论

相关推荐

    详解nginx请求头数据读取流程

    4. 头部处理:在解析请求头时,Nginx会查找匹配的内部处理函数,这些函数定义在`ngx_http_header_t`结构体数组中。例如,对于"Host"头,Nginx会调用相应的处理函数来处理主机名信息。 5. 遍历循环:`ngx_...

    lua-nginx-module-0.10.13

    Lua-Nginx-Module,简称lua-nginx-module,是Nginx服务器的一个重要扩展模块,它将强大的Lua脚本语言集成到Nginx中,允许用户在Nginx配置文件中直接编写Lua代码,极大地增强了Nginx的功能性和灵活性。版本0.10.13是...

    nginx于resin集成(nginx安装)

    在IT行业中,Nginx和Resin是两种广泛使用的服务器软件。Nginx以其高性能、低内存占用和反向代理能力而闻名,而Resin则是一款基于Java的Servlet容器,适用于处理Java Web应用程序。将Nginx与Resin集成可以充分利用...

    nginx安装使用教程

    在配置中指定静态文件目录,Nginx会直接返回文件,而无需经过后端应用服务器。 ### 九、安全注意事项 确保在生产环境中配置HTTPS以加密传输,使用`listen 443 ssl;`并添加SSL证书配置。同时,限制对敏感目录的访问...

    nginx.config_nginx_

    以上仅是Nginx配置的冰山一角,实际应用中还可以结合正则表达式、if条件语句、自定义模块等实现更多高级功能。理解并熟练掌握这些基本配置,能够帮助运维人员更好地管理和优化Nginx服务器,提升网站性能和稳定性。

    nginx的各项详细配置-超多注释

    - **access_log**: 记录访问日志,格式可自定义。 - **error_log**: 记录错误日志,级别包括debug、info、notice、warn、error。 - **location**: 配置URL匹配规则,如`location / { ... }`匹配所有请求。 - **proxy...

    nginx-若依-定值配置.zip

    解压"nginx-若依-定值配置.zip"文件后,你会得到一个预先配置好的Nginx配置,只需适当修改以适应你的环境,然后在Nginx中加载或替换当前配置即可。记住,正确配置和管理Nginx对于提供稳定、高效的Web服务至关重要。

    nginx window

    - Nginx的核心配置文件是`nginx.conf`,在解压后的目录中可以找到。这个文件定义了Nginx的行为,包括监听的端口、服务器块(server blocks)等。 - 在Windows上,你可能需要修改默认的监听端口,因为某些系统服务...

    nginx配置多域名访问以及完整配置

    Nginx的日志记录可以自定义,包括添加或修改请求头信息。例如,如果你想记录用户的User-Agent,可以这样做: ```nginx log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $...

    nginx-1.9.0 文档

    Nginx的日志记录功能强大且灵活,可以自定义日志格式,通过`access_log`和`error_log`指令控制日志输出。 **十、健康检查** 通过`proxy_next_upstream`和`proxy_set_header`等指令,Nginx可以对后端服务器进行健康...

    nginx 笔记和资料

    在Linux系统中,Nginx的安装通常通过包管理器进行,例如在Ubuntu或Debian上使用`apt-get`,在CentOS或Fedora上使用`yum`或`dnf`。首先,更新包列表,然后安装Nginx: ```bash sudo apt-get update sudo apt-get ...

    实战Nginx取代Apache的高性能Web服务器_文字版

    在很多场景下,Nginx被用作替代Apache服务器的选择,尤其是在高流量网站和需要负载均衡的环境中。本实战指南旨在探讨如何通过Nginx实现高性能的Web服务,以提升网站的响应速度和稳定性。 一、Nginx与Apache的性能...

    nginx安装工具及配置

    在Ubuntu或Debian系统中,可以使用apt-get命令来安装Nginx: ``` sudo apt-get update sudo apt-get install nginx ``` 2. **CentOS/RHEL系统安装** 对于基于RPM的系统,如CentOS或RHEL,使用yum命令: ``` ...

    nginx常用内部错误.docx

    Nginx 作为一个流行的 Web 服务器软件,在实际应用中经常会遇到各种错误。这些错误可能来自于配置不当、资源限制、网络连接问题等多方面。为了帮助开发者和运维人员更好地解决这些问题,本文将总结常见的 Nginx 错误...

    nginx模块开发指南

    模块定义和模块注册则是在模块开发中,将模块功能加入到nginx中的过程,这部分涵盖了如何使模块运行以及与nginx核心通信的方法。 处理模块、过滤模块和负载均衡模块的分析部分,详细地阐述了各个模块类型的具体实现...

    Nginx入门与使用.rar

    在上述示例中,`balancer:$upstream_addr`会记录请求被转发到哪个上游服务器。 文档中的"如何设置nginx日志格式来查看负载分担结果.docx"应该包含了更详细的信息,教你如何通过调整日志格式来追踪和分析负载均衡...

    lua-nginx-module完全指南.docx

    `log_by_lua`可在日志记录阶段执行,允许自定义日志格式和内容。 此外,`init_by_lua*`系列指令在Nginx工作进程启动时执行,常用于全局变量的初始化和配置。`init_worker_by_lua*`则在每个工作进程启动时运行,适合...

    nginx自己_nginx_

    Nginx默认记录访问日志,可以在`http`或`server`块中自定义日志格式: ```nginx access_log /var/log/nginx/access.log custom; log_format custom '$remote_addr - $remote_user [$time_local] "$request" ' '$...

    nginx高性能web服务器详解

    它的设计目标是高并发、低内存占用,使得Nginx在处理静态内容和作为反向代理时表现出色。本文将深入探讨Nginx的核心特性、配置、优化策略以及与Java应用程序的集成。 1. **Nginx核心特性** - **事件驱动模型**:...

    Flume采集Nginx日志到新版Hive.rar

    在这个场景中,我们利用Flume来从Nginx服务器收集日志,并将这些日志数据导入到新版的Hive数据仓库中。下面将详细阐述这个过程涉及的技术要点。 首先,Nginx是一款高性能的HTTP和反向代理服务器,它的日志记录了...

Global site tag (gtag.js) - Google Analytics