语法:limit_rate speed
默认值:no
使用字段:http, server, location, location中的if字段
限制将应答传送到客户端的速度,单位为字节/秒,限制仅对一个连接有效,即如果一个客户端打开2个连接,则它的速度是这个值乘以二。
由于一些不同的状况,可能要在server字段来限制部分连接的速度,那么这个参数并不适用,不过你可以选择设置$limit_rate变量的值来达到目的:
server {
if ($slow) {
set $limit_rate 4k;
}
}
同样可以通过设置X-Accel-Limit-Rate头(NginxXSendfile) 来控制proxy_pass返回的应答。并且不借助X-Accel-Redirect头来完成。
limit_rate_after
语法:limit_rate_after time
默认值:limit_rate_after 1m
使用字段:http, server, location, location中的if字段
在应答一部分被传递后限制速度:
limit_rate_after 1m;
limit_rate 100k;
listen
语法(0.7.x):listen address:port [ default [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ssl ] ]
语法(0.8.x):listen address:port [ default_server [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ssl ] ]
默认值:listen 80
使用字段:server
listen指令指定了server{...}字段中可以被访问到的ip地址及端口号,可以只指定一个ip,一个端口,或者一个可解析的服务器名。
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
ipv6地址格式(0.7.36)在一个方括号中指定:
listen [::]:8000;
listen [fe80::1];
当linux(相对于FreeBSD)绑定IPv6[::],那么它同样将绑定相应的IPv4地址,如果在一些非ipv6服务器上仍然这样设置,将会绑定失败,当然可以使用完整的地址来代替[::]以免发生问题,也可以使用"default ipv6only=on" 选项来制定这个listen字段仅绑定ipv6地址,注意这个选项仅对这行listen生效,不会影响server块中其他listen字段指定的ipv4地址。
listen [2a02:750:5::123]:80;
listen [::]:80 default ipv6only=on;
如果只有ip地址指定,则默认端口为80。
如果指令有default参数,那么这个server块将是通过“地址:端口”来进行访问的默认服务器,这对于你想为那些不匹配server_name指令中的主机名指定默认server块的虚拟主机(基于域名)非常有用,如果没有指令带有default参数,那么默认服务器将使用第一个server块。
listen允许一些不同的参数,即系统调用listen(2)和bind(2)中指定的参数,这些参数必须用在default参数之后:
backlog=num -- 指定调用listen(2)时backlog的值,默认为-1。
rcvbuf=size -- 为正在监听的端口指定SO_RCVBUF。
sndbuf=size -- 为正在监听的端口指定SO_SNDBUF。
accept_filter=filter -- 指定accept-filter。
·仅用于FreeBSD,可以有两个过滤器,dataready与httpready,仅在最终版本的FreeBSD(FreeBSD: 6.0, 5.4-STABLE与4.11-STABLE)上,为他们发送-HUP信号可能会改变accept-filter。
deferred -- 在linux系统上延迟accept(2)调用并使用一个辅助的参数: TCP_DEFER_ACCEPT。
bind -- 将bind(2)分开调用。
·主要指这里的“地址:端口”,实际上如果定义了不同的指令监听同一个端口,但是每个不同的地址和某条指令均监听为这个端口的所有地址(*:port),那么nginx只将bind(2)调用于*:port。这种情况下通过系统调用getsockname()确定哪个地址上有连接到达,但是如果使用了parameters backlog, rcvbuf, sndbuf, accept_filter或deferred这些参数,那么将总是将这个“地址:端口”分开调用。
ssl -- 参数(0.7.14)不将listen(2)和bind(2)系统调用关联。
·被指定这个参数的listen将被允许工作在SSL模式,这将允许服务器同时工作在HTTP和HTTPS两种协议下,例如:
listen 80;
listen 443 default ssl;
一个使用这些参数的完整例子:
listen 127.0.0.1 default accept_filter=dataready backlog=1024;
0.8.21版本以后nginx可以监听unix套接口:
listen unix:/tmp/nginx1.sock;
location
语法:location [=|~|~*|^~|@] /uri/ { ... }
默认值:no
使用字段:server
这个参数根据URI的不同需求来进行配置,可以使用字符串与正则表达式匹配,如果要使用正则表达式,你必须指定下列前缀:
1、~* 不区分大小写。
2、~ 区分大小写。
要确定该指令匹配特定的查询,程序将首先对字符串进行匹配,字符串匹配将作为查询的开始,最确切的匹配将被使用。然后,正则表达式的匹配查询开始,匹配查询的第一个正则表达式找到后会停止搜索,如果没有找到正则表达式,将使用字符串的搜索结果。
在一些操作系统,如Mac OS X和Cygwin,字符串将通过不区分大小写的方式完成匹配(0.7.7),但是,比较仅限于单字节的语言环境。
正则表达式可以包含捕获(0.7.40),并用于其它指令中。
可以使用“^~”标记禁止在字符串匹配后检查正则表达式,如果最确切的匹配location有这个标记,那么正则表达式不会被检查。
使用“=”标记可以在URI和location之间定义精确的匹配,在精确匹配完成后并不进行额外的搜索,例如有请求“/”发生,则可以使用“location = /”来加速这个处理。
即使没有“=”和“^~”标记,精确的匹配location在找到后同样会停止查询。
下面是各种查询方式的总结:
1、前缀“=”表示精确匹配查询,如果找到,立即停止查询。
2、指令仍然使用标准字符串,如果匹配使用“^~”前缀,停止查询。
3、正则表达式按照他们在配置文件中定义的顺序。
4、如果第三条产生一个匹配,这个匹配将被使用,否则将使用第二条的匹配。
例:
location = / {
# 只匹配 / 的查询.
[ configuration A ]
}
location / {
# 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何以gif, jpg, or jpeg结尾的文件,但是所有 /images/ 目录的请求将在Configuration C中处理。
[ configuration D ]
}
各请求的处理如下例:
·/ -> configuration A
·/documents/document.html -> configuration B
·/images/1.gif -> configuration C
·/documents/1.jpg -> configuration D
注意你可以以任何顺序定义这4个配置并且匹配结果是相同的,但当使用嵌套的location结构时可能会将配置文件变的复杂并且产生一些比较意外的结果。
标记“@”指定一个命名的location,这种location并不会在正常请求中执行,它们仅使用在内部重定向请求中。(查看error_page 和try_files )
log_not_found
语法:log_not_found [on|off]
默认值:log_not_found on
使用字段:http, server, location
指令指定是否将一些文件没有找到的错误信息写入error_log指定的文件中。
log_subrequest
语法:log_subrequest [on|off]
默认值:log_subrequest off
使用字段:http, server, location
指令指定是否将一些经过rewrite rules和/或SSI requests的子请求日志写入access_log指定的文件中。
msie_padding
语法:msie_padding [on|off]
默认值:msie_padding on
使用字段:http, server, location
指令指定开启或关闭MSIE浏览器和chrome浏览器(0.8.25+)的msie_padding特征,当这个功能开启,nginx将为响应实体分配最小512字节,以便响应大于或等于400的状态代码。
指令预防在MSIE和chrome浏览器中激活“友好的”HTTP错误页面,以便不在服务器端隐藏更多的错误信息。
msie_refresh
语法: msie_refresh [on|off]
默认值:msie_refresh off
使用字段:http, server, location
指令允许或拒绝为MSIE发布一个refresh而不是做一次redirect
open_file_cache
语法:open_file_cache max = N [inactive = time] | off
默认值:open_file_cache off
使用字段:http, server, location
这个指令指定缓存是否启用,如果启用,将记录文件以下信息:
·打开的文件描述符,大小信息和修改时间。
·存在的目录信息。
·在搜索文件过程中的错误信息 -- 没有这个文件、无法正确读取,参考open_file_cache_errors
指令选项:
·max - 指定缓存的最大数目,如果缓存溢出,最长使用过的文件(LRU)将被移除。
·inactive - 指定缓存文件被移除的时间,如果在这段时间内文件没被下载,默认为60秒。
·off - 禁止缓存。
例:
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
open_file_cache_errors
语法:open_file_cache_errors on | off
默认值:open_file_cache_errors off
使用字段:http, server, location
这个指令指定是否在搜索一个文件是记录cache错误。
open_file_cache_min_uses
语法:open_file_cache_min_uses number
默认值:open_file_cache_min_uses 1
使用字段:http, server, location
这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态。
open_file_cache_valid
语法:open_file_cache_valid time
默认值:open_file_cache_valid 60
使用字段:http, server, location
这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息。
optimize_server_names
语法:optimize_server_names [ on|off ]
默认值:optimize_server_names on
使用字段:http, server
这个指令指定是否在基于域名的虚拟主机中开启最优化的主机名检查。
尤其是检查影响到使用主机名的重定向,如果开启最优化,那么所有基于域名的虚拟主机监听的一个“地址:端口对”具有相同的配置,这样在请求执行的时候并不进行再次检查,重定向会使用第一个server name。
如果重定向必须使用主机名并且在客户端检查通过,那么这个参数必须设置为off。
注意:这个参数不建议在nginx 0.7.x版本中使用,请使用server_name_in_redirect。
port_in_redirect
语法:port_in_redirect [ on|off ]
默认值:port_in_redirect on
使用字段:http, server, location
这个指令指定是否在让nginx在重定向操作中对端口进行操作。
如果这个指令设置为off,在重定向的请求中nginx不会在url中添加端口。
recursive_error_pages
语法:recursive_error_pages [on|off]
默认值:recursive_error_pages off
使用字段:http, server, location
recursive_error_pages指定启用除第一条error_page指令以外其他的error_page。
resolver
语法:resolver address
默认值:no
使用字段:http, server, location
指定DNS服务器地址,如:
resolver 127.0.0.1;
resolver_timeout
语法:resolver_timeout time
默认值:30s
使用字段:http, server, location
解析超时时间。如:
resolver_timeout 5s;
root
语法:root path
默认值:root html
使用字段:http, server, location ,location中的if字段
请求到达后的文件根目录。
下例中:
location /i/ {
root /spool/w3;
}
如果请求"/i/top.gif"文件,nginx将转到"/spool/w3/i/top.gif"文件。你可以在参数中使用变量。
注意:在请求中root会添加这个location到它的值后面,即"/i/top.gif"并不会请求"/spool/w3/top.gif"文件,如果要实现上述类似于apache alias的功能,可以使用alias指令。
satisfy_any
语法:satisfy_any [ on|off ]
默认值:satisfy_any off
使用字段:location
指令可以检查至少一个成功的密码效验,它在NginxHttpAccessModule或NginxHttpAuthBasicModule这两个模块中执行。
location / {
satisfy_any on;
allow 192.168.1.0/32;
deny all;
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
}
send_timeout
语法:send_timeout the time
默认值:send_timeout 60
使用字段:http, server, location
指令指定了发送给客户端应答后的超时时间,Timeout是指没有进入完整established状态,只完成了两次握手,如果超过这个时间客户端没有任何响应,nginx将关闭连接。
sendfile
语法:sendfile [ on|off ]
默认值:sendfile off
使用字段:http, server, location
是否启用sendfile()函数。
server
语法:server {...}
默认值:no
使用字段:http
server字段包含虚拟主机的配置。
没有明确的机制来分开基于域名(请求中的主机头)和基于IP的虚拟主机。
可以通过listen指令来指定必须连接到这个server块的所有地址和端口,并且在server_name指令中可以指定所有的域名。
server_name
语法:server_name name [... ]
默认值:server_name hostname
使用字段:server
这个指令有两个作用:
·将HTTP请求的主机头与在nginx配置文件中的server{...}字段中指定的参数进行匹配,并且找出第一个匹配结果。这就是如何定义虚拟主机的方法,域名遵循下述优先级规则:
1、完整匹配的名称。
2、名称开始于一个文件通配符:*.example.com。
3、名称结束于一个文件通配符:www.example.*。
4、使用正则表达式的名称。
如果没有匹配的结果,nginx配置文件将安装以下优先级使用[#server server { ... }]字段:
1、listen指令被标记为default的server字段。
2、第一个出现listen(或者默认的listen 80)的server字段。
·如果server_name_in_redirect被设置,这个指令将用于设置HTTP重定向的服务器名。
例:
server {
server_name example.com www.example.com;
}
第一个名称为服务器的基本名称,默认名称为机器的hostname。
当然,可以使用文件通配符:
server {
server_name example.com *.example.com www.example.*;
}
上述例子中的前两个名称可以合并为一个:
server {
server_name .example.com;
}
同样可以使用正则表达式。名称前面加“~”:
server {
server_name www.example.com ~^www\d+\.example\.com$;
}
如果客户端请求中没有主机头或者没有匹配server_name的主机头,服务器基本名称将被用于一个HTTP重定向,你可以只使用“*”来强制nginx在HTTP重定向中使用Host头(注意*不能用于第一个名称,不过你可以用一个很傻逼的名称代替,如“_”)
server {
server_name example.com *;
}
server {
server_name _ *;
}
在nginx0.6.x中有稍许改变:
server {
server_name _;
}
0.7.12版本以后已经可以支持空服务器名,以处理那些没有主机头的请求:
server {
server_name "";
}
server_name_in_redirect
语法:server_name_in_redirect on|off
默认值:server_name_in_redirect on
使用字段:http, server, location
如果这个指令打开,nginx将使用server_name指定的基本服务器名作为重定向地址,如果关闭,nginx将使用请求中的主机头。
server_names_hash_max_size
语法:server_names_hash_max_size number
默认值:server_names_hash_max_size 512
使用字段:http
服务器名称哈希表的最大值,更多信息请参考nginx Optimizations 。
server_names_hash_bucket_size
语法:server_names_hash_bucket_size number
默认值:server_names_hash_bucket_size 32/64/128
使用字段:http
服务器名称哈希表每个页框的大小,这个指令的默认值依赖于cpu缓存。更多信息请参考nginx Optimizations 。
server_tokens
语法:server_tokens on|off
默认值:server_tokens on
使用字段:http, server, location
是否在错误页面和服务器头中输出nginx版本信息。
tcp_nodelay
语法:tcp_nodelay [on|off]
默认值:tcp_nodelay on
使用字段:http, server, location
这个指令指定是否使用socket的TCP_NODELAY选项,这个选项只对keep-alive连接有效。
点击这里 了解更多关于TCP_NODELAY选项的信息。
tcp_nopush
语法:tcp_nopush [on|off]
默认值:tcp_nopush off
使用字段:http, server, location
这个指令指定是否使用socket的TCP_NOPUSH(FreeBSD)或TCP_CORK(linux)选项,这个选项只在使用sendfile时有效。
设置这个选项的将导致nginx试图将它的HTTP应答头封装到一个包中。
点击这里 查看关于TCP_NOPUSH和TCP_CORK选项的更多信息。
try_files
语法:try_files file1 [file2 ... filen] fallback
默认值:none
使用字段:location
这个指令告诉nginx将测试参数中每个文件的存在,并且URI将使用第一个找到的文件,如果没有找到文件,将请求名为fallback(可以使任何名称)的location字段,fallback是一个必须的参数,它可以是一个命名的location或者可靠的URI。
例:
location / {
try_files index.html index.htm @fallback;
}
location @fallback {
root /var/www/error;
index index.html;
}
types
语法:types {...}
使用字段:http, server, location
这个字段指定一些扩展的文件对应方式与应答的MIME类型,一个MIME类型可以有一些与其类似的扩展。默认使用以下文件对应方式:
types {
text/html html;
image/gif gif;
image/jpeg jpg;
}
完整的对应视图文件为conf/mime.types,并且将被包含。
如果你想让某些特定的location的处理方式使用MIME类型:application/octet-stream,可以使用以下配置:
location /download/ {
types { }
default_type application/octet-stream;
}
·变量
core module 支持一些内置的变量,与apache使用的变量相一致。
首先,一些变量代表了客户端请求头部的一些字段,如:$http_user_agent, $http_cookie等等。注意,由于这些变量会在请求中定义,所以可能无法保证他们是存在的或者说可以定义到一些别的地方(例如遵循一定的规范)。
除此之外,下列是一些其他变量:
$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方法(如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指令进行修改。
·参考文档