Nginx 模块总结

本贴最后更新于 2900 天前,其中的信息可能已经物是人非

以目前最新稳定版(1.10.0)为例,nginx官网地址:http://nginx.org/

nginx的模块化

配置模块

nginx是模块化的,支持很多的模块(目前看是将近70个),如果想要使用某个模块,这个模块必须已经被编译进nginx中。使用源码安装nginx时,有一些默认编译的模块,切换到nginx源码路径,执行:

./configure --help

形如:“--without-xxx_module”的配置项说明xxx模块是默认编译的,如果不需要这个模块,执行./configure时,就需要带着--without-xxx_module选项。同理,形如:“--with-xxx_module”代表需要同时编译xxx模块。

 

查看当前nginx支持哪些模块

如果nginx已经安装好了,想查看nginx支持哪些模块,网上有个非常错误的观点(而且大部分人都错了),就是用nginx -V查看。示例输出如下:

nginx version: nginx/1.8.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/opt/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_spdy_module

 

这个输出代表编译nginx时候的配置项,根本不能代表当前nginx中包含了哪些模块!那么,正确的查看方法你知道了吗?其实就是,进入到当时编译nginx时的源码目录,执行./configure --help,输出中“--without-xxx_module”中的模块去除nginx -V中的“--without-xxx_module”中的模块,然后再加上nginx -V输出中的“--with-xxx_module”的模块。稍微较真了以下( ̄ε  ̄),好人做到底,写个脚本支持。

TODO

 

模块内置变量

每个模块可能回提供一些内置变量(Embedded Variables),可以在模块说明中找到具体含义。这些变量,可以作为参数值在nginx配置文件中引用。也可以根据索引,查询特定变量的含义:

Alphabetical index of variables

 

常用模块简介

只是为了加强记忆,做模块的简单说明。参考http://nginx.org/en/docs/中的Modules reference部分,包含了模块的详细说明和配置方法。
 

ngx_http_core_module

location指令

Syntax:     location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default:     —
Context:     server, location

 

匹配uri,通过前缀正则表达式两种方式均可。以“~”开头表示大小写不敏感的正则,“~*”表示大小写敏感的正则。匹配规则:

1. 先根据“最长前缀”(location /abc和location /abcd,如果有一个请求是/abcdefg,虽然两个location都满足,但是第二个匹配到的字符数更多,所以最终选择location /abcd)匹配,如果匹配到,记住这个前缀。2. 然后按location定义的顺序检测正则表达式是否匹配,遇到第一个匹配停止,将这个匹配作为最终结果。但如果正则表达式都没有匹配到,使用之前记住的最长前缀作为最终匹配结束。

 

附加条件:如果最长前缀前面有“^~”,那么不会进行第2步,直接使用最长前缀。如果用uri前面有“=”,表示精确匹配,uri和“=”后的配置完全相同时,直接使用这个精确的uri。

 

特殊的,如果一个location后的uri以"/"结尾,并且最终又proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, or memcached_pass处理,如:“location /user/ {proxy_pass http://www.example.com;}”,那么如果请求“/user”(末尾不带"/"),会被重定向到“/user/”这个uri,如果这不是你想要的,要用“location = /user”单独配置一下。

文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#location

 

ngx_http_log_module

log_format指令

Syntax: 	log_format name string ...;
Default: 	log_format combined "...";
Context: http

 

含有空白符的或整体较长的字段,用双引号括起来方便观察。

 

可用的变量:

$remote_addr        远程IP地址,是向nginx发起HTTP请求的机器的IP地址。因为一个HTTP请求中间可能经过代理或者CDN,这个不一定是真正的客户端IP地址,可能是代理服务器IP。

$http_x_forwarded_for    请求头的值,如果请求到达nginx之前经过了代理,记录原始客户端IP和途中各个代理的IP地址。维基百科:https://en.wikipedia.org/wiki/X-Forwarded-For

$remote_user         如果添加了用户认证,这个代表了认证的用户名

$request         HTTP请求行,形如:“"GET / HTTP/1.1”

$status         响应状态码
$body_bytes_sent     发送给客户端的字节数,不包括状态行和响应头的大小。
$bytes_sent         发送给客户端的总字节数,状态行+响应头+响应体。
$connection         连接的序列号
$connection_requests     当前通过一个连接获得的请求数量。
$msec             日志写入时间。单位为秒,精度是毫秒。
$pipe             如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer         记录从哪个页面链接访问过来的
$http_user_agent     User-Agent请求头
$request_length     请求的长度(包括请求行,请求头和请求正文)。
$request_time         请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601         ISO8601标准格式下的本地时间。
$time_local         通用日志格式下的本地时间。

 

 

ngx_http_proxy_module

 

 

 

 

 

 

 

 

  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...