nginx基础模块

http://www.nginx.cn/doc/

基础模块

http核心模块

http://www.nginx.cn/doc/standard/httpcore.html

http upstream 模块

这个模块提供一个简单方法来实现在轮询和客户端IP之间的后端服务器负荷平衡。

配置范例:

upstream backend  {
  server backend1.example.com weight=5;
  server backend2.example.com:8080;
  server unix:/tmp/backend3;
}
 
server {
  location / {
    proxy_pass  http://backend;
  }
}

配置指导

ip_hash

语法: ip_hash

默认值: none

作用域: upstream

该指令根据客户端的IP地址导致请求在上游之间分配。 哈希的关键是客户端的C类网络地址。 此方法可确保始终将客户端请求传输到同一服务器。 但是,如果认为此服务器不起作用,则此客户端的请求将被转移到另一台服务器。 这使客户端始终连接到同一服务器的概率很高。

范例:

upstream backend {
  ip_hash;
  server   backend1.example.com;
  server   backend2.example.com;
  server   backend3.example.com  down;
  server   backend4.example.com;
}

server

语法: server name [parameters]

默认值: none

作用域: upstream

HttpAccess模块

此模块提供了一个简易的基于主机的访问控制.

ngx_http_access_module 模块使有可能对特定IP客户端进行控制. 规则检查按照第一次匹配的顺序

__配置样例__

location / {
 deny    192.168.1.1;
 allow   192.168.1.0/24;
 allow   10.1.1.0/16;
 deny    all;
}

在上面的例子中,仅允许网段 10.1.1.0/16 和 192.168.1.0/24中除 192.168.1.1之外的ip访问.

当执行很多规则时,最好使用 ngx_http_geo_module 模块.

allow

语法: allow [ address | CIDR | all ]

默认值: no

作用域: http, server, location, limit_except

以上描述的网络地址有权直接访问

deny

语法: deny [ address | CIDR | all ]

默认值: no

作用域: http, server, location, limit_except

以上描述的网络地址拒绝访问

相关阅读:http://nginx.org/ru/docs/http/ngx_http_access_module.html

HttpAuthBasic模块

该模块可以使你使用用户名和密码基于 HTTP 基本认证方法来保护你的站点或其部分内容。

__实例配置__

location  /  {
 auth_basic            "Restricted";
 auth_basic_user_file  conf/htpasswd;
}

auth_basic

语法: auth_basic [ text|off ]

默认值: auth_basic off

作用域: http, server, location, limit_except

该指令包含用于 HTTP 基本认证 的测试名和密码。分配的参数用于认证领域。值 "off" 可以使其覆盖来自上层指令的继承性。

auth_basic_user_file

语法: auth_basic_user_file the_file

默认值: no

作用域: http, server, location, limit_except

该指令为某认证领域指定 htpasswd 文件名。

文件格式类似于下面的内容:

用户名:密码
用户名2:密码2:注释
用户名3:密码3

密码必须使用函数 crypt(3) 加密。 你可以使用来自 Apache 的 htpasswd 工具来创建密码文件。

你也可以使用perl 创建密码文件,pw.pl 的内容:

#!/usr/bin/perl
use strict;

my $pw=$ARGV[0] ;
print crypt($pw,$pw)."
";

然后执行

chmod +x pw.pl
./pw.pl password
papAq5PwY/QQM

papAq5PwY/QQM 就是password 的crypt()密码

HttpAutoindex模块

此模块用于自动生成目录列表.

ngx_http_autoindex_module只在 ngx_http_index_module模块未找到索引文件时发出请求.

__配置实例__

location  /  {
 autoindex  on;
}

autoindex

语法: autoindex [ on|off ]

默认值: autoindex off

作用域: http, server, location

激活/关闭自动索引

autoindex_exact_size

语法: autoindex_exact_size [ on|off ]

默认值: autoindex_exact_size on

作用域: http, server, location

设定索引时文件大小的单位(B,KB, MB 或 GB)

autoindex_localtime

语法: autoindex_localtime [ on|off ]

默认值: autoindex_localtime off

作用域: http, server, location

开启以本地时间来显示文件时间的功能。默认为关(GMT时间)

相关阅读:http://nginx.org/ru/docs/http/ngx_http_autoindex_module.html

Browser模块

摘要

This module creates variables, the values of which depend on the request header "User-agent":

本模块的变量基于请求头(header)中的"User-agent":

  • $modern_browser - is equal to the value, assigned by directive modern_browser_value, if browser is identified as an modern browser;
  • $ancient_browser - 当等于指定给modern_browser_value的浏览器时,这个浏览器被认定为新版的浏览器;
  • $ancient_browser - is equal to the value, assigned by directive ancient_browser_value, if browser is identified as an old browser;
  • $ancient_browser - 当等于指定给ancient_browser_value的浏览器时,这个浏览器被认定为老版的浏览器;
  • $msie - is equal 1, if browser is identified as MSIE with any version;
  • $msie - 当浏览器为MSIE的任何版本时,这个值等于1;

If you don't need this module add --without-http_browser_module parameter to the ./configure call, at compile time.

如果不需要这个模块时,在编译的时候加上 --without-http_browser_module.

Example configuration 例如配置

Selection of the index file:

选择索引文件:

modern_browser_value "modern.";

modern_browser msie 5.5;
modern_browser gecko 1.0.0;
modern_browser opera 9.0;
modern_browser safari 413;

modern_browser konqueror 3.0;
index index.${modern_browser}html index.html;

Redirect for the old browsers:

定义老的浏览器:

modern_browser msie 5.0;

modern_browser gecko 0.9.1;
modern_browser opera 8.0;
modern_browser safari 413;
modern_browser konqueror 3.0;

modern_browser unlisted;
ancient_browser Links Lynx Netscape4;
 
if ($ancient_browser){
  rewrite  ^  /ancient.html;
}

ancient_browser

语法: ancient_browser line [ line... ]

默认值: no

作用域: http, server, location

指令分配子字符串,在“用户代理”行中,浏览器被认为是旧的。
特殊行“netscape4”对应正则表达式“^ Mozilla / [1-4]”。

ancient_browser_value

语法: ancient_browser_value line

默认值: ancient_browser_value 1

作用域: http, server, location

定义 $ancient_browser的变量值.

modern_browser

语法: modern_browser browser version|unlisted

默认值: no

作用域: http, server, location

Directive指定哪个版本的浏览器被认为是现代的。
作为浏览器,您可以分配值msie,gecko(基于Mozilla的浏览器)opera,safari,konqueror。

在版本中,可以分配大小X,X.X,X.X.X或X.X.X.X. 每个尺寸的最大值分别为 - 4000,4000.99,4000.99.99和4000.99.99.99。

特殊值“不公开”表示考虑现代浏览器,而不是由modern_browser和ancient_browser指令描述。
否则neperechislennyy浏览器将被视为过时。
如果标头不包含“User-agent”,则浏览器被视为neperechislennym。

modern_browser_value

语法: modern_browser_value line

默认值: modern_browser_value 1

作用域: http, server, location

定义$modern_browser的变量值.

http://nginx.org/ru/docs/http/ngx_http_browser_module.html

Charset模块

此模块将文本编码添加到“Content-Type shown”响应标头中。

此外,模块可以将一种编码的数据重新编码为另一种编码。 需要注意的是,重新编码只能在一个方向上完成 - 从服务器到客户端,并且只能重新编码一个字节的编码。

配置示例:

charset         windows-1251;
source_charset  koi8-r;

charset

语法: charset encoding|off

默认值: charset off

作用域: http, server, location, if in location

指令字符集将“Content-Type”行添加到带有指示编码的response-header中。 如果此编码与指令source_charset中指示的编码不同,则执行重新编码。 参数“off”取消激活响应标题中“Content-Type”行的插入。

charset_map

语法: charset_map encoding1 encoding2 {...}

默认值: no

作用域: http, server, location

指令charset_map描述了从一种编码到另一种编码的重新编码表。 使用相同的数据创建用于逆重新编码的表。 符号代码以十六进制形式分配。 如果没有记录的符号在80-FF范围内,则它们将被替换为“?”。

用法示例:

charset_map  koi8-r  windows-1251 {
  C0  FE ; # small yu
  C1  E0 ; # small a

  C2  E1 ; # small b
  C3  F6 ; # small ts
  # ...
}

从koi8-r到Windows-1251的完整转换表与nginx一起分发,位于文件conf / koi-win中。

override_charset

语法: override_charset on|off

默认值: override_charset off

作用域: http, server, location, if in location

如果在响应头中已经有“Content-Type”头,则该指令确定从代理服务器或从FastCGI服务器获得的响应的重新编码。 如果允许重新编码,则使用在获得的答案中指示的编码作为初始编码。

需要注意的是,如果在子查询中获得响应,那么独立于指令override_charset,总是执行从响应的编码重新编码到基本需求的编码。

source_charset

语法: source_charset encoding

默认值: no

作用域: http, server, location, if in location

指令source_charset指定响应的初始编码。 如果此编码与指令字符集中指示的编码不同,则执行重新编码。

http://nginx.org/ru/docs/http/ngx_http_charset_module.html

HttpEmptyGif模块

本模块在内存中常驻了一个 1x1 的透明 GIF 图像,可以被非常快速的调用。

示例:

location = /_.gif {
 empty_gif;
}

empty_gif

语法: empty_gif

默认值: n/a

作用域: location

http://nginx.org/ru/docs/http/ngx_http_empty_gif_module.html

HttpFcgi模块

这个模块允许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。

配置实例:

location / {
  fastcgi_pass   localhost:9000;
  fastcgi_index  index.php;

  fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;
  fastcgi_param  QUERY_STRING     $query_string;
  fastcgi_param  REQUEST_METHOD   $request_method;
  fastcgi_param  CONTENT_TYPE     $content_type;
  fastcgi_param  CONTENT_LENGTH   $content_length;
}

fastcgi_buffers

语法: fastcgi_buffers the_number is_size;

默认值: fastcgi_buffers 8 4k/8k;

作用域: http, server, location

该指令集设置缓冲区的数量和大小,用于缓存从 FastCGI Server 接收到的数据。默认情况下,一个缓冲区的大小相当于一个页面的大小。根据平台的不同设置为4K/8K

fastcgi_buffer_size

语法: fastcgi_buffer_size the_size

默认值: fastcgi_buffer_size 4k/8k

作用域: http, server, location

该指令设置buffersize,从fastcgi服务器获取响应的第一部分。

在这部分响应中,通常会定位小响应标头。

默认情况下,buffersize等于指令fastcgi_buffers中一个缓冲区的大小; 但是,可以将其设置为更小。

fastcgi_cache

语法: fastcgi_cache zone;

默认值: none

作用域: http, server, location

设置缓存在共享内存中的名称. 一块区域可以被用于不用的地方.

fastcgi_cache_key

语法: fastcgi_cache_key line ;

默认值: none

作用域: http, server, location

设置缓存的key, 例:

fastcgi_cache_key localhost:9000 $request_uri;

fastcgi_cache_methods

语法: fastcgi_cache_methods [GET HEAD POST];

默认值: fastcgi_cache_methods GET HEAD;

作用域: main,http,location

GET / HEAD是语法糖,即使你刚刚设置,你也无法禁用GET / HEAD

fastcgi_cache_methods  POST;

fastcgi_cache_min_uses

语法: fastcgi_cache_min_uses n

默认值: fastcgi_cache_min_uses 1

作用域: http, server, location

fastcgi_cache_path

语法: fastcgi_cache_path /path/to/cache [levels=m:n keys_zone=name:time inactive=time clean_time=time]

默认值: none

作用域: http, server, location

fastcgi_cache_use_stale

语法: fastcgi_cache_use_stale [updating|error|timeout|invalid_header|http_500]

默认值: fastcgi_cache_use_stale off;

作用域: http, server, location

fastcgi_cache_valid

语法: fastcgi_cache_valid [http_error_code|time]

默认值: none

作用域: http, server, location

fastcgi_index

语法: fastcgi_index file

默认值: none

作用域: http, server, location

如果URI以斜杠结尾,则将附加到URI并存储在变量$ fastcgi_script_name中的文件的名称。

fastcgi_hide_header

语法: fastcgi_hide_header name

作用域: http, server, location

默认情况下Nginx 不会从FastCGI 进程里给客户端发送"Status" 和"X-Accel-..." 消息头。这个指令可以用来掩饰别的headers 。

如果需要"Status" 和"X-Accel-..." 消息头,那就需要使用这个指令让FastCGI 强制发送消息头给客户端。

fastcgi_ignore_client_abort

语法: fastcgi_ignore_client_abort on|off

默认值: fastcgi_ignore_client_abort off

作用域: http, server, location

这个指令用来决定忽略用户取消的请求。

fastcgi_intercept_errors

语法: fastcgi_intercept_errors on|off

默认值: fastcgi_intercept_errors off

作用域: http, server, location

这个指令用来决定是否要把客户端转向4xx和5xx错误页,或允许Nginx自动指定错误页页。

注意:你需要在此明确错误页,它才是有用的。Igor 曾说:“如果没有定制的处理机制,Nginx不会拦截一个没有缺省页的错误。Nginx 只会拦截一些小的错误,放过其他一些。

fastcgi_param

语法: fastcgi_param parameter value

默认值: none

作用域: http, server, location

该指令指定的参数,将被传递给FastCGI-server。

它可能使用字符串、变量及其它们的组合来作为参数值。如果不在此制定参数,它就会继承外层设置;如果在此设置了参数,将清除外层相关设置,仅启用本层设置。

下面是一个例子,对于PHP来说的最精简的必要参数:

  fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;
  fastcgi_param  QUERY_STRING     $query_string;

参数SCRIPT_FILENAME 是PHP 用来确定执行脚本的名字,而参数QUERY_STRING 是它的一个子参数。

如果要处理POST,那么这三个附加参数是必要的:

  fastcgi_param  REQUEST_METHOD   $request_method;
  fastcgi_param  CONTENT_TYPE     $content_type;
  fastcgi_param  CONTENT_LENGTH   $content_length;

如果PHP 在编译时使用了--enable-force-cgi-redirect选项,设置参数REDIRECT_STATUS 的值为200就是必须的了。

  fastcgi_param  REDIRECT_STATUS  200;

Geo模块

摘要

此模块创建变量,其值取决于客户端的IP地址。

配置示例:

geo  $geo  {

  default          0;
  127.0.0.1/32     2;
  192.168.1.0/24   1;
  10.1.0.0/16      1;

}

geo

语法: geo [$ip_variable] $variable { ... }

默认值: none

作用域: http

该指令描述了变量值对客户端IP地址的依赖性。 默认情况下,用于查找的IP地址是$ remote_addr,但是从版本0.7.27开始,可以指定应该使用哪个变量。

geo  $arg_remote_addr $geo {
   ...;
 }

地址以CIDR的形式分配。 此外,还有四个特殊参数:

描述示例:

delete - 删除指定的网络(0.7.23)。
default - 如果客户端地址与任何分配的地址不对应,则为变量的值。 可以编写而不是默认值0.0.0.0/0。
include - 包含地址和值信息的文本文件。 可以像这样包含几个文件。
proxy - 指定代理服务器的地址(0.8.7+)。 需要更多说明......
ranges - 指定指定的地址采用范围(0.7.23)的形式。 该指令必须是第一个。

geo  $country  {
   default          no;
   include          conf/geo.conf;
   127.0.0.0/24     us;
   127.0.0.1/32     ru;
   10.1.0.0/16      ru;
   192.168.1.0/24   uk;
 }

在文件conf / geo.conf中:

10.2.0.0/16      ru;
 192.168.2.0/24   ru;

该值将是具有最大一致性的值。 例如,IP地址127.0.0.1将获得值“ru”,但不是“us”。

范围示例:

 geo  $country  {
   ranges;
   default                    no; 
   127.0.0.0-127.0.0.0        us;
   127.0.0.1-127.0.0.1        ru;
   127.0.0.1-127.0.0.255      us;
   10.1.0.0-10.1.255.255      ru;
   192.168.1.0-192.168.1.255  uk; 
 }

HttpGzip模块

这个模块支持在线实时压缩输出数据流

__使用范例__

 gzip             on;
 gzip_min_length  1000;
 gzip_proxied     expired no-cache no-store private auth;
 gzip_types       text/plain application/xml;

内置变量 $gzip_ratio 可以获取到gzip的压缩比率

gzip

语法: gzip on|off

默认值: gzip off

作用域: http, server, location, if (x) location

开启或者关闭gzip模块

gzip_buffers

语法: gzip_buffers number size

默认值: gzip_buffers 4 4k/8k

作用域: http, server, location

设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。

如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。

gzip_comp_level

语法: gzip_comp_level 1..9

默认值: gzip_comp_level 1

作用域: http, server, location

gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)。

gzip_min_length

语法: gzip_min_length length

默认值: gzip_min_length 0

作用域: http, server, location

设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。

默认值是0,不管页面多大都压缩。

建议设置成大于1k的字节数,小于1k可能会越压越大。 即: gzip_min_length 1024

gzip_http_version

语法: gzip_http_version 1.0|1.1

默认值: gzip_http_version 1.1

作用域: http, server, location

识别http的协议版本。由于早期的一些浏览器或者http客户端,可能不支持gzip自解压,用户就会看到乱码,所以做一些判断还是有必要的。 注:21世纪都来了,现在除了类似于百度的蜘蛛之类的东西不支持自解压,99.99%的浏览器基本上都支持gzip解压了,所以可以不用设这个值,保持系统默认即可。

gzip_proxied

语法: gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] ...

默认值: gzip_proxied off

作用域: http, server, location

Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的 header头。

off - 关闭所有的代理结果数据的压缩
expired - 启用压缩,如果header头中包含 "Expires" 头信息
no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息
no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息
private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息
no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息
no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息
auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息
any - 无条件启用压缩

gzip_types

语法: gzip_types mime-type [mime-type ...]

默认值: gzip_types text/html

作用域: http, server, location

匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。

注意:如果作为http server来使用,主配置文件中要包含文件类型配置文件

http
{
    include       conf/mime.types;
    ......
}

如果你希望压缩常规的文件类型,可以写成这个样子

http 
{
 include       conf/mime.types;

 gzip on;
 gzip_min_length  1000;
 gzip_buffers     4 8k;   
 gzip_http_version 1.1; 
 gzip_types       text/plain application/x-javascript text/css text/html application/xml;

 ......    
}

http://nginx.org/ru/docs/http/ngx_http_gzip_module.html

HttpHeaders模块

本模板可以设置HTTP报文的头标。

__示例__

 expires     24h;
 expires     0;
 expires     -1;
 expires     epoch;
 add_header  Cache-Control  private;

add_header

语法: add_header name value

默认值: none

作用域: http, server, location

当HTTP应答状态码为 200、204、301、302 或 304 的时候,增加指定的HTTP头标。

其中头标的值可以使用变量。

expires

语法: expires [time|epoch|max|off]

默认值: expires off

作用域: http, server, location

使用本指令可以控制HTTP应答中的“Expires”和“Cache-Control”的头标,(起到控制页面缓存的作用)。

可以在time值中使用正数或负数。“Expires”头标的值将通过当前系统时间加上您设定的 time 值来获得。

epoch

指定“Expires”的值为 1 January, 1970, 00:00:01 GMT。

max

指定“Expires”的值为 31 December 2037 23:59:59 GMT,“Cache-Control”的值为10年。

-1

指定“Expires”的值为 服务器当前时间 -1s,即永远过期

“Cache-Control”头标的值由您指定的时间来决定:

负数:

Cache-Control: no-cache

正数或零:

Cache-Control: max-age = #

, # 为您指定时间的秒数。

"off" 表示不修改“Expires”和“Cache-Control”的值

http://nginx.org/ru/docs/http/ngx_http_headers_module.html

HttpIndex模块

index

语法: index file [file...]

默认值: index index.html

作用域: http, server, location

该指令用来指定用来做默认文档的文件名,可以在文件名处使用变量。 如果您指定了多个文件,那么将按照您指定的顺序逐个查找。 可以在列表末尾加上一个绝对路径名的文件。

index  index.$geo.html  index.0.html  /index.html;

http://nginx.org/ru/docs/http/ngx_http_index_module.html

HttpReferer模块

摘要

此模块可以使用请求标头中“Referer”行的错误值来阻止对站点的访问。

请记住,很容易欺骗这个标题; 因此,使用此模块的目的不在于100%阻止这些请求,而在于阻止从典型浏览器发出的大量请求。 此外,考虑到典型的浏览器并不总是提供“Referer”标头,即使对于正确的请求也是如此。

location /photos/ {
  valid_referers none blocked www.mydomain.com mydomain.com;
 
  if ($invalid_referer) {
    return   403;
  }

}

valid_referers

语法: valid_referers [none|blocked|server_names] ...

默认值: none

作用域: server, location

该指令为变量赋值0或1

$invalid_referer

基于的内容referer头。

您可以使用它来帮助减少来自外部站点的深层链接。 如果referer头在列表valid_referers中没有计入, 然后$invalid_referer将设置为1(参见上面的示例)。

参数可以如下:

none

表示没有“Referer”标题。

blocked

意味着受阻

Referer

header by firewall,例如“Referer:XXXXXXX”。server_names是一个或多个服务器的列表。 从版本0.5.33开始,可以在服务器名称中使用*通配符。

http://nginx.org/ru/docs/http/ngx_http_referer_module.html

HttpLimit zone

本模块可以针对条件,进行会话的并发连接数控制。(例如:限制每个IP的并发连接数。)

__配置示例__

http {
 limit_zone   one  $binary_remote_addr  10m;

 ...

 server {

 ...

 location /download/ {
 limit_conn   one  1;
 }

limit_zone

语法: limit_zone zone_name $variable the_size

默认值: no

作用域: http

本指令定义了一个数据区,里面记录会话状态信息。
$variable 定义判断会话的变量;the_size 定义记录区的总容量。

例子:

limit_zone   one  $binary_remote_addr  10m;

定义一个叫“one”的记录区,总容量为 10M,以变量 $binary_remote_addr 作为会话的判断基准(即一个地址一个会话)。


您可以注意到了,在这里使用的是 $binary_remote_addr 而不是 $remote_addr。

$remote_addr 的长度为 7 至 15 bytes,会话信息的长度为 32 或 64 bytes。 而 $binary_remote_addr 的长度为 4 bytes,会话信息的长度为 32 bytes。

当区的大小为 1M 的时候,大约可以记录 32000 个会话信息(一个会话占用 32 bytes)。

limit_conn

语法: limit_conn zone_name the_size

默认值: no

作用域: http, server, location

指定一个会话最大的并发连接数。 当超过指定的最发并发连接数时,服务器将返回 "Service unavailable" (503)。

例子:

limit_zone   one  $binary_remote_addr  10m;

 server {
 location /download/ {
 limit_conn   one  1;
 }

定义一个叫“one”的记录区,总容量为 10M,以变量 $binary_remote_addr 作为会话的判断基准(即一个地址一个会话)。 限制 /download/ 目录下,一个会话只能进行一个连接。 简单点,就是限制 /download/ 目录下,一个IP只能发起一个连接,多过一个,一律503。

http://nginx.org/ru/docs/http/ngx_http_limit_zone_module.html

HttpLimitReqest模块

此模块允许您使用一个地址限制给定会话的请求数,或作为特殊情况。

使用漏桶进行限制。

 示例配置
http {
    limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;

 
    ...
 
    server {
 
        ...
 
        location /search/ {

            limit_req   zone=one  burst=5;
        }

limit_req_zone

语法: limit_req_zone $session_variable zone=name_of_zone:size rate=rate

默认值: none

作用域: http

该指令描述了存储会话状态的区域。 会话的值由给定变量确定。 用法示例:

limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;

在这种情况下,会话状态被分配10MB作为称为“一”的区域,并且该区域的查询的平均速度限制为每秒1个请求。

在这种情况下,每个用户都会跟踪会话,但请注意,我们使用变量$ binary_remote_addr而不是变量$ binary_remote_addr,将状态大小减小到64个字节。 1 MB区域可容纳大约16000个此大小的状态。

速度设置为每秒请求数或每分钟请求数。 速率必须是整数,因此如果您需要每秒指定少于一个请求(例如,每两秒一个请求),则将其指定为“30r / m”。

语法: limit_req zone=zone burst=burst [nodelay]

默认值: none

作用域: http, server, location

该指令指定区域(区域)和请求的最大可能突发(突发)。 如果速率超过区域中列出的要求,则会延迟请求,以便以给定的速度处理查询。 超出的请求会延迟,直到其数量不超过指定的突发数量。 在这种情况下,请求完成代码“服务不可用”(503)。 默认情况下,突发为零。

例如,指令

limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;

 
    server {
        location /search/ {
            limit_req   zone=one  burst=5;
        }

允许用户平均每秒不超过1个请求,突发不超过5个查询。 如果不需要限制突发延迟内的超额请求,则应使用nodelay:

limit_req   zone=one  burst=5  nodelay;

HttpLog模块

ngx_http_log_module实例

log_format  gzip  '$remote_addr - $remote_user [$time_local]  '
 '"$request" $status $bytes_sent '
 '"$http_referer" "$http_user_agent" "$gzip_ratio"';
access_log  /spool/logs/nginx-access.log  gzip  buffer=32k;

access_log

语法: access_log path [format [buffer=size | off ] 默认值: access_log log/access.log combined

作用域: http, server, location

指令 access_log 指派路径、格式和缓存大小。参数 "off" 将清除当前级别的所有 access_log 指令。如果未指定格式,则使用预置的 "combined" 格式。缓存不能大于能写入磁盘的文件的最大大小。在 FreeBSD 3.0-6.0 ,缓存大小无此限制。

log_format

语法: log_format name format [format ...]

默认值: log_format combined "..."

作用域: http server

指令log_format描述了日志条目的格式。 除了格式中的一般变量之外,还可以使用仅在记录到日志时存在的变量:

$ body_bytes_sent,发送到客户端的字节数减去响应头,变量与模块Apache的mod_log_config的参数%B兼容(在版本0.3.10之前称为$ apache_bytes_sent)
$ bytes_sent,传输到客户端的字节数
$ connection,连接数
$ msec,日志条目时精度为微秒的时间
$ pipe,如果请求是流水线操作则为“p”
$ request_length,请求正文的长度
$ request_time,在几秒钟内处理请求的时间
$ status,回答状态
$ time_local,将本地时间转换为通用日志格式。
传输到客户端的标头从前缀“sent_http_”开始,例如$ sent_http_content_range。

在配置中总是有一个预定的格式“组合”:

log_format  combined  '$remote_addr - $remote_user [$time_local]  '
 '"$request" $status $apache_bytes_sent '
 '"$http_referer" "$http_user_agent"';

http://sysoev.ru/nginx/docs/http/ngx_http_log_module.html

map

此模块允许您将一组值分类或映射到一组不同的值,并将结果存储在变量中。

例:

map  $http_host  $name  {
  hostnames;
 

  default          0;
 
  example.com      1;
  *.example.com    1;
  test.com         2;
  *.test.com       2;
  .site.com        3;

}

一个用途是使用映射代替编写大量服务器/位置指令或重定向:

map $uri $new {
  default        http://www.domain.com/home/;
 
  /aa            http://aa.domain.com/;
  /bb            http://bb.domain.com/;
  /john          http://my.domain.com/users/john/;

}
 
server {
  server_name   www.domain.com;
  rewrite  ^    $new   redirect;
}

map

语法: map $var1 $var2 { ... }

默认值: none

作用域: http

map定义将用于设置变量的映射表。 有三个特殊参数:

default - 定义在未找到匹配项时使用的值。
主机名 - 它允许更容易地匹配主机名等值,具有起始点的名称可以匹配确切的主机名和以该值结尾的主机名,例如:

*.example.com  1; 

而不是两个条目

example.com    1;
*.example.com  1;

我们只能使用一个

.example.com   1;

include - 包含文件中的值。 可以使用多个包括。

map_hash_max_size

语法: map_hash_max_size number

默认值: map_hash_max_size 2048

作用域: http

该指令设置哈希表的最大大小以容纳变量映射。 有关更多详细信息,请参阅哈希设置优化部分的说明。

map_hash_bucket_size

语法: map_hash_bucket_size n

默认值: map_hash_bucket_size 32/64/128

作用域: http

该指令设置哈希表中的最大大小以映射变量。 默认值取决于缓存行处理器的大小。 有关详细信息,请参阅优化部分中的哈希设置说明。

http://nginx.org/ru/docs/http/ngx_http_map_module.html

Memcached

你可以利用本模块来进行简单的缓存以提高系统效率。本模块计划在未来进行扩展。

__配置示例__

server {
 location / {
 set  $memcached_key  $uri;
 memcached_pass   name:11211;
 default_type     text/html;
 error_page       404 = /fallback;
 }

 location = /fallback {
 proxy_pass       backend;
 }
}

memcached_pass

语法: memcached_pass [ name:port ]

默认值: none

作用域: http, server, location

后端应该在memcached中设置数据。 memcached键是“/ uri?args”。

从0.5.9开始,memcached密钥就在了$memcached_key

memcached_connect_timeout

语法: memcached_connect_timeout [ time ]

默认值: 60000

作用域: http, server, location

连接到memcached的超时时间,以毫秒为单位。

memcached_read_timeout

语法: memcached_read_timeout [ time ]

默认值: 60000

作用域: http, server, location

从memcached读取的超时,以毫秒为单位。

memcached_send_timeout

语法: memcached_send_timeout [ time ]

默认值: 60000

作用域: http, server, location

发送到memcached的超时时间,以毫秒为单位。

memcached_buffer_size

语法: memcached_buffer_size [ size ]

默认值: see getpagesize(2)

作用域: http, server, location

recv / send缓冲区大小,以字节为单位。

memcached_next_upstream

语法: memcached_next_upstream [ error | timeout | invalid_response | not_found | off ]

默认值: error timeout

作用域: http, server, location

哪些故障条件会导致请求转发到另一个上游服务器? 仅当memcached_pass中的值是具有两个或更多服务器的上游时才适用。

HttpProxy模块

http://www.nginx.cn/doc/standard/httpproxy.html

HttpRewrite模块

该模块允许使用正则表达式改变URI,并且根据变量来转向以及选择配置。

如果在server级别设置该选项,那么他们将在location之前生效。如果在location还有更进一步的重写规则,location部分的规则依然会被执行。如果这个URI重写是因为location部分的规则造成的,那么location部分会再次被执行作为新的URI。

这个循环会执行10次,然后Nginx会返回一个500错误。

break

语法: break

默认值: none

作用域: server, location, if

作用是完成当前的规则列

if ($slow) {
 limit_rate  10k;
 break;
}

if

语法: if (condition) { ... }

默认值: none

作用域: server, location

检查条件。 如果条件的计算结果为true,则执行花括号中指示的代码,并根据下一个块中的配置处理请求。 如果从上一级继承,则指令内部的配置。

它们可以被指定为条件:

变量的名称; false值为:空字符串“”或任何以“0”开头的字符串;
使用=和!=运算符将变量与行进行比较;

使用符号〜*和〜:〜与正则表达式匹配的模式是区分大小写的匹配;

  • '~'符合,但是大小写敏感
  • ~*大小写不敏感的符合(firefox符合FireFox)
  • !~和!~*代表相反,“不符合”
  • 使用-f以及!-f检测一个文件是否存在
  • 使用-d以及!-d检测一个目录是否存在
  • 使用-e以及!-e检测是否存在一个文件,一个目录或者一个符号链接。
  • 使用-x以及!-x检测一个文件是否可执行

正则表达式的部分可以在括号中,之后可以在$ 1到> $ 9变量中访问其值。

使用示例:

if ($http_user_agent ~ MSIE) {
 rewrite  ^(.*)$  /msie/$1  break;
}
if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
 set  $id  $1;
}
if ($request_method = POST ) {
 return 405;
}
if (!-f $request_filename) {
 break;
 proxy_pass  http://127.0.0.1;
}
if ($slow) {
 limit_rate  10k;
}
if ($invalid_referer) {
 return   403;
}

内置变量$ invalid_referer的值由指令valid_referers给出。

return

语法: return code

默认值: none

作用域: server, location, if

这个指令根据规则的执行情况,返回一个状态值给客户端。可使用值包括:204,400,402-406,408,410,411,413,416以及500-504。也可以发送非标准的444代码-未发送任何头信息下结束连接。

rewrite

语法: rewrite regex replacement flag

默认值: none

作用域: server, location, if

这个指令根据表达式来更改URI,或者修改字符串。指令根据配置文件中的顺序来执行。

注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句,如下:

if ($host ~* www.(.*)) {
 set $host_without_www $1;
 rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo'
}

标志使得可以结束重写指令的执行。

如果替换字符串以http://开头,则客户端将被重定向,并且任何进一步的重写指令都将终止。

标志可以是以下任何一种:

last - 完成重写指令的处理,之后搜索相应的URI和位置
break - 完成重写指令的处理
redirect - 返回代码为302的临时重定向; 如果替换行以http:// permanent开头,则使用它 - 返回代码为301的永久重定向

请注意,如果重定向是相对的(没有主机部分),那么当重定向Nginx时,如果标头匹配server_name指令的名称或server_name指令的名字,则重定向使用“主机”标头,如果标头不匹配或不存在。 如果未设置server_name,则使用本地主机名。 如果您希望Nginx始终使用“主机”标头,则可以使用通配符“*”server_name(但请参阅此限制)。示例:

rewrite  ^(/download/.*)/media/(.*)..*$  $1/mp3/$2.mp3  last;
rewrite  ^(/download/.*)/audio/(.*)..*$  $1/mp3/$2.ra   last;
return   403;

但是如果我们将这些指令放在location / download /中,那么有必要用“break”替换标志“last”,否则nginx将达到10个循环限制并返回错误500:

location /download/ {
 rewrite  ^(/download/.*)/media/(.*)..*$  $1/mp3/$2.mp3  break;
 rewrite  ^(/download/.*)/audio/(.*)..*$  $1/mp3/$2.ra   break;
 return   403;
}

如果指示了替换参数行,则将其余的请求参数附加到它们。 为避免附加它们,请将问号作为最后一个字符:

rewrite  ^/users/(.*)$  /show?user=$1?  last;

注: 对花括号( { 和 } )来说, 他们既能用在重定向的正则表达式里,也是用在配置文件里分割代码块, 为了避免冲突, 正则表达式里带花括号的话,应该用双引号(或者单引号)包围。比如,要将类似以下的url

/photos/123456 

重定向到:

/path/to/photos/12/1234/123456.png 

可以用以下方法 (注意双引号):

rewrite  "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png; 

set

语法: set variable value

默认值: none

作用域: server, location, if

指令为指示的变量建立值。 作为值,可以使用文本,变量及其组合。

uninitialized_variable_warn

语法: uninitialized_variable_warn on|off

默认值: uninitialized_variable_warn on

作用域: http, server, location, if

启用或禁用记录有关非初始化变量的警告。

在内部,重写指令在配置文件加载到内部代码时编译,在解释器请求期间可用。

这个解释器是一个简单的堆栈虚拟机。 例如,指令:

location /download/ {
 if ($forbidden) {
 return   403;
 }
 if ($slow) {
 limit_rate  10k;
 }
 rewrite  ^/(download/.*)/media/(.*)..*$  /$1/mp3/$2.mp3  break;
}

将被编译成这个序列:

 variable $forbidden
 checking to zero
 recovery 403
 completion of entire code
 variable $slow
 checking to zero
 checkings of regular expression
 copying "/"
 copying $1
 copying "/mp3/"
 copying $2
 copying "..mpe"

 completion of regular expression
 completion of entire sequence

请注意,没有指令limit_rate的代码,因为它没有引用模块ngx_http_rewrite_module。 “if”块与“location”指令存在于配置的相同部分。

如果$ slow为真,则评估“if”块内部的内容,并且在此配置中limit_rate等于10k。

指示:

rewrite  ^/(download/.*)/media/(.*)..*$  /$1/mp3/$2.mp3  break;

如果在正则表达式中我们在括号内包含第一个斜杠,则可以减少序列:

rewrite  ^(/download/.*)/media/(.*)..*$  $1/mp3/$2.mp3  break;

然后序列将如下所示:

 checking regular expression
 copying $1
 copying "/mp3/"
 copying $2
 copying "..mpe"
 completion of regular expression
 completion of entire code

HttpSSI模块

http://www.nginx.cn/doc/standard/httpssi.html

HttpUserId

http://www.nginx.cn/doc/standard/userid.html

原文地址:https://www.cnblogs.com/jiangxiaobo/p/11109415.html