# HG changeset patch # User Ruslan Ermilov # Date 1356417277 0 # Node ID ceb8a4e374b7ea04d117bdfba06bb143c0d1d7dd # Parent 15f2bab0740de7fa912a41dfef16b027b006ef8f Updated the Chinese documentation. diff --git a/xml/cn/GNUmakefile b/xml/cn/GNUmakefile --- a/xml/cn/GNUmakefile +++ b/xml/cn/GNUmakefile @@ -19,6 +19,18 @@ REFS = \ http/ngx_http_auth_basic_module \ http/ngx_http_autoindex_module \ http/ngx_http_browser_module \ + http/ngx_http_core_module \ + http/ngx_http_empty_gif_module \ + http/ngx_http_geo_module \ + http/ngx_http_geoip_module \ http/ngx_http_gzip_static_module \ + http/ngx_http_image_filter_module \ http/ngx_http_index_module \ http/ngx_http_limit_conn_module \ + http/ngx_http_limit_req_module \ + http/ngx_http_log_module \ + http/ngx_http_map_module \ + http/ngx_http_proxy_module \ + http/ngx_http_referer_module \ + http/ngx_http_rewrite_module \ + http/ngx_http_upstream_module \ diff --git a/xml/cn/docs/http/ngx_http_addition_module.xml b/xml/cn/docs/http/ngx_http_addition_module.xml --- a/xml/cn/docs/http/ngx_http_addition_module.xml +++ b/xml/cn/docs/http/ngx_http_addition_module.xml @@ -23,7 +23,7 @@ -
+
@@ -37,7 +37,7 @@ location / {
-
+
uri diff --git a/xml/cn/docs/http/ngx_http_autoindex_module.xml b/xml/cn/docs/http/ngx_http_autoindex_module.xml --- a/xml/cn/docs/http/ngx_http_autoindex_module.xml +++ b/xml/cn/docs/http/ngx_http_autoindex_module.xml @@ -7,7 +7,7 @@ - -
+
@@ -36,7 +36,7 @@ location / {
-
+
on | off diff --git a/xml/cn/docs/http/ngx_http_core_module.xml b/xml/cn/docs/http/ngx_http_core_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_core_module.xml @@ -0,0 +1,2543 @@ + + + + + + + + +
+ + + + on | + off | + sendfile +off +http +server +location +0.8.11 + + +在FreeBSD和Linux操作系统上启用或者禁用异步文件I/O(AIO)。 + + + +从FreeBSD 4.3版本开始,可以使用AIO。AIO既可以静态链接到内核中: + +options VFS_AIO + +又可以作为内核模块动态加载: + +kldload aio + + + + +在FreeBSD第5版和第6版,静态启动AIO,或者在系统启动时动态加载AIO,都会触发网络子系统使用一把大锁,进而对整个系统的性能造成负面影响。 +这个限制在2009年发布的FreeBSD 6.4稳定版和FreeBSD 7中被消除。 +虽然如此,仍有方法在5.3及以上版本的FreeBSD中开启AIO而不触发网络子系统的大锁,那就是在内核启动以后加载AIO模块。 +使用这种时,/var/log/messages中会出现下面信息, + +WARNING: Network stack Giant-free, but aio requires Giant. +Consider adding 'options NET_WITH_GIANT' or setting debug.mpsafenet=0 + +但可以安全的忽略它。 + +使用AIO大锁的是FreeBSD套接字上的aio_readaio_write异步操作。但是nginx仅仅在磁盘I/O使用AIO,所以不会出现问题。 + + + + +为了让AIO工作,需要关闭: + +location /video/ { + sendfile off; + aio on; + output_buffers 1 64k; +} + + + + +不过,从FreeBSD 5.2.1版和nginx 0.8.12版开始,AIO也可以为sendfile预读数据: + +location /video/ { + sendfile on; + tcp_nopush on; + aio sendfile; +} + + +这个配置使nginx在调用sendfile时带SF_NODISKIO参数, +那么sendfile在数据没有读入内存的时候,就不会阻塞在磁盘I/O上,而是直接返回报告;接着nginx就读这个一字节报告,然后初始化异步数据。 +FreeBSD内核接着会读取文件的开始128K字节到内存,而后续的读取只会以16K的单位来进行。 +这个性质可以使用指令来调节。 + + + +从Linux内核2.6.22版开始,也可以使用AIO。但必须同时开启,否则读取将是阻塞的: + +location /video/ { + aio on; + directio 512; + output_buffers 1 128k; +} + + + + +在Linux上,只在读取的块的边界对齐512字节(在XFS上是4K字节)时才有用。在读取文件尾部时, +如果没有对齐,AIO读取还是阻塞的。同样的情况(如果数据的开始或者结尾未对齐时,读取也是阻塞的) +也发生在含有
byte range
头的请求中,或者发生在不是从头开始的FLV请求中。 +没有必要手动关闭,因为如果使用了,它就会自动关闭。 +
+ +
+ + + +path + +location + + +定义指定路径的替换路径。比如下面配置 + +location /i/ { + alias /data/w3/images/; +} + +“/i/top.gif”将由/data/w3/images/top.gif文件来响应。 + + + +path的值可以包含变量,但不能使用$document_root$realpath_root这两个变量。 + + + +如果在定义了正则表达式的路径中使用了alias,那么正则表达式中应该含有匹配组, +并且alias应该引用这些匹配组(0.7.40版)来组成一个完整的文件路径,比如: + +location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ { + alias /data/w3/images/$1; +} + + + + +如果路径对应指令path值的最后一部分: + +location /images/ { + alias /data/w3/images/; +} + +最好换用指令: + +location /images/ { + root /data/w3; +} + + + + + + + +on | off +on +http +server +location + + +允许关闭HTTP/1.1中的分块传输编码。在客户端软件不支持分块传输编码的时候,这条指令才有用。 + + + + + + + +size +8k|16k +http +server +location + + +设置读取客户端请求正文的缓冲容量。如果请求正文大于缓冲容量,整个正文或者正文的一部分将写入临时文件。 +缓冲大小默认等于两块内存页的大小,在x86平台、其他32位平台和x86-64平台,这个值是8K。在其他64位平台,这个值一般是16K。 + + + + + + + + on | + clean | + off +off +http +server +location + + +决定nginx是否将客户端请求正文整个写入文件。这条指令在调试时,或者使用$request_body_file变量时, +或者使用ngx_http_perl_module模块的 +$r->request_body_file方法时都可以使用。 + + + +当指令值设置为on时,请求处理结束后不会删除临时文件。 + + + +当指令值设置为clean时,请求处理结束后会删除临时文件。 + + + + + + +on | off +off +http +server +location + + +决定nginx将整个客户端请求正文保存在一块缓冲中。 +这条指令推荐在使用$request_body变量时使用,可以节省引入的拷贝操作。 + + + + + + + + path + [level1 + [level2 + [level3]]] +client_body_temp +http +server +location + + +定义存储客户端请求正文的临时文件的目录。 +支持在指定目录下多达3层的子目录结构。比如下面配置 + +client_body_temp_path /spool/nginx/client_temp 1 2; + +存储临时文件的路径是 + +/spool/nginx/client_temp/7/45/00000123457 + + + + + + + +time +60s +http +server +location + + +定义读取客户端请求正文的超时。超时是指相邻两次读操作之间的最大时间间隔,而不是整个请求正文完成传输的最大时间。 +如果客户端在这段时间内没有传输任何数据,nginx将返回错误到客户端。 + + + + + + +size +1k +http +server + + +设置读取客户端请求头部的缓冲容量。 +对于大多数请求,1K的缓冲足矣。 +但如果请求中含有的cookie很长,或者请求来自WAP的客户端,可能请求头不能放在1K的缓冲中。 +如果从请求行,或者某个请求头开始不能完整的放在这块空间中,那么nginx将按照 +指令的配置分配更多更大的缓冲来存放。 +directive. + + + + + + +time +60s +http +server + + +定义读取客户端请求头部的超时。如果客户端在这段时间内没有传送完整的头部到nginx, +nginx将返回错误到客户端。 + + + + + + +size +1m +http +server +location + + +设置允许客户端请求正文的最大长度。请求的长度由
Content-Length
请求头指定。 +如果请求的长度超过设定值,nginx将返回错误到客户端。 +请注意浏览器不能正确显示这个错误。 +将size设置成0可以使nginx不检查客户端请求正文的长度。 +
+ +
+ + + +size +256 +http +server + + +允许微调为每个连接分配的内存。这条指令对nginx的性能影响非常小,一般不应该使用。 + + + + + + +mime-type +text/plain +http +server +location + + +定义响应的默认MIME类型。设置文件扩展名和响应的MIME类型的映射表则使用指令。 + + + + + + +size | off +off +http +server +location +0.7.7 + + +当读入长度大于等于指定size的文件时,开启DirectIO功能。 +具体的做法是, +在FreeBSD或Linux系统开启使用O_DIRECT标志, +在Mac OS X系统开启使用F_NOCACHE标志, +在Solaris系统开启使用directio功能。 +这条指令自动关闭(0.7.15版)。 +它在处理大文件时 + +directio 4m; + +或者在Linux系统使用时比较有用。 + + + + + + +size +512 +http +server +location +0.8.11 + + +为设置文件偏移量对齐。大多数情况下,按512字节对齐足矣, +但在Linux系统下使用XFS,需要将值扩大到4K。 + + + + + + +off + + on | + if_not_owner + [from=part] +off +http +server +location +1.1.15 + + +决定nginx打开文件时如何处理符号链接: + + +off + +默认行为,允许路径中出现符号链接,不做检查。 + + +on + +如果文件路径中任何组成部分中含有符号链接,拒绝访问该文件。 + + +if_not_owner + +如果文件路径中任何组成部分中含有符号链接,且符号链接和链接目标的所有者不同,拒绝访问该文件。 + + +from=part + +当nginx进行符号链接检查时(参数on和参数if_not_owner),路径中所有部分默认都会被检查。 +而使用from=part参数可以避免对路径开始部分进行符号链接检查,而只检查后面的部分路径。 +如果某路径不是以指定值开始,整个路径将被检查,就如同没有指定这个参数一样。 +如果某路径与指定值完全匹配,将不做检查。 +这个参数的值可以包含变量。 + + + + + + +比如: + +disable_symlinks on from=$document_root; + + + + +这条指令只在有openatfstatat接口的系统上可用。 +当然,现在的FreeBSD、Linux和Solaris都支持这些接口。 + + + +参数onif_not_owner会带来处理开销。 + +只在那些不支持打开目录查找文件的系统中,使用这些参数需要工作进程有这些被检查目录的读权限。 + + + + + +ngx_http_autoindex_module模块, +ngx_http_random_index_module模块 +和ngx_http_dav_module模块目前忽略这条指令。 + + + + + + + + + code ... + [=[response]] + uri + +http +server +location +if in location + + +为指令错误定义显示的URI。当前配置级别没有error_page指令时,将从上层配置继承。 +uri可以包含变量。 + + + +比如: + +error_page 404 /404.html; +error_page 500 502 503 504 /50x.html; + + + + +而且,可以使用“=response语法改变响应状态码。比如: + +error_page 404 =200 /empty.gif; + + + + +如果URI将被发送到一个被代理的服务器处理,或者发送到一个FastCGI服务器处理, +这些后端服务器又返回了不同的响应状态码(比如200、302、401或404),那么这些返回的状态码也可以由本指令处理: + +error_page 404 = /404.php; + + + + +当然,也可以使用本指令对错误处理进行重定向: + +error_page 403 http://example.com/forbidden.html; +error_page 404 =301 http://example.com/notfound.html; + +对于例子中的第一行,nginx将向客户端发送302响应状态码。这种用法能使用的状态码只有301、302、303和307。 + + + +如果内部跳转时无需改变URI,可以将错误处理转到一个命名路径: + +location / { + error_page 404 = @fallback; +} + +location @fallback { + proxy_pass http://backend; +} + + + + + +如果处理uri产生了错误,那么nginx将最后一次出错的HTTP响应状态码返回给客户端。 + + + + + + + +on | off +on +http +server +location +1.3.3 + + +开启或关闭为静态文件自动计算
ETag
响应头。 +
+ +
+ + + + + +main + +为HTTP服务器提供配置上下文。 + + + + + + + off | + exact | + before +exact +http +server +location +0.7.24 + + +指定响应的修改时间和
If-Modified-Since
请求头的比较方法: + + + +off + +忽略
If-Modified-Since
请求头(0.7.34); +
+ +exact + +精确匹配; + + +before + +响应的修改时间小于等于
If-Modified-Since
请求头指定的时间。 +
+ +
+
+ +
+ + + +on | off +on +http +server + + +控制是否忽略非法的请求头字段名。 +合法的名字是由英文字母、数字和连字符组成,当然也可以包含下划线(由指令控制)。 + + + +本指令可以在默认虚拟主机的配置层级中定义一次,那么这个值在监听在相同地址和端口的所有虚拟主机上都生效。 + + + + + + + + +location + + +指定一个路径是否只能用于内部访问。如果是外部访问,客户端将收到错误。 +下列请求是内部请求: + + + + +由指令、指令、 +指令 +和指令引起的重定向请求; + + + +由后端服务器返回的
X-Accel-Redirect
响应头引起的重定向请求; +
+ + +由ngx_http_ssi_module模块 +和ngx_http_addition_module模块 +的“include virtual”指令产生的子请求; + + + +用指令对请求进行修改。 + + +
+
+ + +举例: + +error_page 404 /404.html; + +location /404.html { + internal; +} + + +nginx限制每个请求只能最多进行10次内部重定向,以防配置错误引起请求处理出现问题。 +如果内部重定向次数已达到10次,nginx将返回错误。 +同时,错误日志中将有“rewrite or internal redirection cycle”的信息。 + + + +
+ + + +none | browser ... +msie6 +http +server +location + + +针对行为异常的浏览器关闭长连接功能。 +browser参数指定那些浏览器会受到影响。 +值为msie6表示在遇到POST请求时,关闭与老版MSIE浏览器建立长连接。 +值为safari表示在遇到Mac OS X和类Mac OS X操作系统下的Safari浏览器和类Safari浏览器时,不与浏览器建立长连接。 +值为none表示为所有浏览器开启长连接功能。 + +在nginx 1.1.18版本及以前,safari将匹配所有操作系统上的Safari和类Safari浏览器,并默认不与这些浏览器建立长连接。 + + + + + + + +number +100 +http +server +location +0.8.0 + + +设置通过一个长连接可以处理的最大请求数。 +请求数超过此值,长连接将关闭。 + + + + + + + + timeout + [header_timeout] +75s +http +server +location + + +第一个参数设置客户端的长连接在服务器端保持的最长时间(在此时间客户端未发起新请求,则长连接关闭)。 +第二个参数为可选项,设置
Keep-Alive: timeout=time
响应头的值。 +可以为这两个参数设置不同的值。 +
+ + +
Keep-Alive: timeout=time
响应头可以被Mozilla和Konqueror浏览器识别和处理。 +MSIE浏览器在大约60秒后会关闭长连接。 +
+ +
+ + + +number size +4 8k +http +server + + +设置读取客户端请求超大请求的缓冲最大number(数量)和每块缓冲的size(容量)。 +HTTP请求行的长度不能超过一块缓冲的容量,否则nginx返回错误到客户端。 +每个请求头的长度也不能超过一块缓冲的容量,否则nginx返回错误到客户端。 +缓冲仅在必需是才分配,默认每块的容量是8K字节。 +即使nginx处理完请求后与客户端保持入长连接,nginx也会释放这些缓冲。 + + + + + + +method ... + +location + + +允许按请求的HTTP方法限制对某路径的请求。method用于指定不由这些限制条件进行过滤的HTTP方法,可选值有 +GET、 +HEAD、 +POST、 +PUT、 +DELETE、 +MKCOL、 +COPY、 +MOVE、 +OPTIONS、 +PROPFIND、 +PROPPATCH、 +LOCK、 +UNLOCK +或者 +PATCH。 +指定methodGET方法的同时,nginx会自动添加HEAD方法。 +那么其他HTTP方法的请求就会由指令引导的配置块中的ngx_http_access_module +模块和ngx_http_auth_basic_module模块的指令来限制访问。如: + +limit_except GET { + allow 192.168.1.0/32; + deny all; +} + +请留意上面的例子将对GET和HEAD方法以外的所有HTTP方法的请求进行访问限制。 + + + + + + +rate +0 +http +server +location +if in location + + +限制向客户端传送响应的速率限制。参数rate的单位是字节/秒,设置为0将关闭限速。 + +nginx按连接限速,所以如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的2倍。 + + + +也可以利用$limit_rate变量设置流量限制。如果想在特定条件下限制响应传输速率,可以使用这个功能: + +server { + + if ($slow) { + set $limit_rate 4k; + } + + ... +} + + + + +此外,也可以通过
X-Accel-Limit-Rate
响应头来完成速率限制。 +这种机制可以用指令和 +指令关闭。 +
+ +
+ + + +size +0 +http +server +location +if in location +0.8.0 + + +设置不限速传输的响应大小。当传输量大于此值时,超出部分将限速传送。 + + + +比如: + +location /flv/ { + flv; + limit_rate_after 500k; + limit_rate 50k; +} + + + + + + + + + off | + on | + always +on +http +server +location +1.1.0 +1.0.6 + + +控制nginx如何关闭客户端连接。 + + + +默认值“on”指示nginx在完成关闭连接前等待和 +处理客户端发来的额外数据。但只有在预测客户端可能发送更多数据的情况才会做此处理。 + + + +“always”指示nginx无条件等待和处理客户端的额外数据。 + + + +“off”指示nginx立即关闭连接,而绝不等待客户端传送额外数据。 +这样做破坏了协议,所以正常条件下不应使用。 + + + + + + +time +30s +http +server +location + + +生效时,这条指令定义nginx处理(读取但忽略)客户端额外数据的最长时间。 +超过这段时间后,nginx将关闭连接,不论是否还有更多数据待处理。 + + + + + + +time +5s +http +server +location + + +生效时,这条指令定义nginx等待客户端更多数据到来的最长时间。 +如果在这段时间内,nginx没有接收到数据,nginx将关闭连接。否则,nginx将接收数据,忽略它,然后再等待更多数据。 +这个“等待——接收——忽略”的循环一直重复,但总时间不会超过指令定义的时间。 + + + + + + + + address[:port] + [default_server] + [setfib=number] + [backlog=number] + [rcvbuf=size] + [sndbuf=size] + [accept_filter=filter] + [deferred] + [bind] + [ipv6only=on|off] + [ssl] + [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]] + + port + [default_server] + [setfib=number] + [backlog=number] + [rcvbuf=size] + [sndbuf=size] + [accept_filter=filter] + [deferred] + [bind] + [ipv6only=on|off] + [ssl] + [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]] + + unix:path + [default_server] + [backlog=number] + [rcvbuf=size] + [sndbuf=size] + [accept_filter=filter] + [deferred] + [bind] + [ssl] + [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]] +*:80 | *:8000 +server + + +设置nginx监听地址,nginx从这里接受请求。对于IP协议,这个地址就是addressport;对于UNIX域套接字协议,这个地址就是path。 +一条listen指令只能指定一个address或者port。 +address也可以是主机名。 +比如: + +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]; + +UNIX域套接字(0.8.21版)则使用“unix:”前缀: + +listen unix:/var/run/nginx.sock; + + + + +如果只定义了address,nginx将使用80端口。 + + + +在没有定义listen指令的情况下,如果以超级用户权限运行nginx,它将监听*:80,否则他将监听*:8000。 + + + +如果listen指令携带default_server参数,当前虚拟主机将成为指定address:port的默认虚拟主机。 +如果任何listen指令都没有携带default_server参数,那么第一个监听address:port的虚拟主机将被作为这个地址的默认虚拟主机。 + +0.8.21版以前,这个参数的名称是default。 + + + + +可以为listen指令定义若干额外的参数,这些参数用于套接字相关的系统调用。 +这些参数可以在任何listen指令中指定,但是对于每个address:port,只能定义一次。 + +0.8.21版以前,只有为listen指令定义了default参数,才能定义这些额外的参数。 + + + + +setfib=number + + +这个参数(0.8.44)为监听套接字设置关联路由表FIB(SO_SETFIB选项)。 +当前这个参数仅工作在FreeBSD上。 + + + +backlog=number + + +为系统调用listen设置backlog参数,用以限制未接受(Accept)连接的队列的最大长度。 +FreeBSD和Mac OS X下,backlog的默认值是-1,在其他系统中,默认值是511。 + + + + +rcvbuf=size + + +为监听套接字设置接收缓冲区大小(SO_RCVBUF参数)。 + + + +sndbuf=size + + +为监听套接字设置发送缓冲区大小(SO_SNDBUF参数)。 + + + +accept_filter=filter + + +为监听套接字设置接受过滤器的名称(SO_ACCEPTFILTER选项)。 +对每个到来的连接,接受过滤器先进行过滤,然后才将它们呈现给accept。 +本特性仅工作在FreeBSD系统和NetBSD 5.0+系统下。 +可接受的值是 +dataready +和 +httpready。 + + + +deferred + + +指示在Linux系统使用延迟的accept(TCP_DEFER_ACCEPT选项)。 + + + +bind + + +指示nginx为设置的address:port单独调用一次bind。 +这是因为当有多条listen指令监听不同地址下的相同端口, +而其中一条listen指令监听了这个端口的所有地址(*:port)时, +nginx只会为*:port调用一次bind绑定套接字。 +需要留意的是,这种情况下,nginx会调用getsockname系统调用来确定接受请求的套接字地址。 +如果为某个address:port定义了参数backlogrcvbuf、 +sndbufaccept_filterdeferred或者so_keepalive, +nginx总会为这个地址单独调用一次bind绑定套接字。 + + + +ipv6only=on|off + + +这个参数(0.7.42)(通过IPV6_V6ONLY选项)决定监听在通配地址[::]上的IPv6套接字是只支持IPv6连接,还是同时支持IPv6和IPv4连接。 +这个参数默认打开,并且只能在nginx启动时设置。 + +在1.3.4版以前,如果省略此参数,那么操作系统的套接字设置将生效。 + + + + +ssl + + +本参数(0.7.14)与套接字相关的系统调用无关,但是它可以指定从这个端口接受的连接应该以SSL模式工作。 +本参数在某服务器同时处理HTTP和HTTPS请求时,可以使配置更为紧凑。 + +listen 80; +listen 443 ssl; + + + + +so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt] + + +这个参数(1.1.11)为监听套接字配置“TCP keepalive”行为。 +如果省略此参数,操作系统默认的设置将对此端口生效。 +如果参数值设置为“on”,监听套接字的SO_KEEPALIVE属性将被开启。 +如果参数值设置为“off”,监听套接字的SO_KEEPALIVE属性将被关闭。 +有些操作系统支持为每个连接调整TCP长连接的参数。调整参数可以使用套接字选项TCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT。 +在这些操作系统上(当前就是Linux 2.4+,嬀NetBSD 5+FreeBSD 9.0-STABLE),可以使用keepidlekeepintvlkeepcnt参数来配置。 +省略一到两个参数的话,对应套接字属性的系统默认设置将生效。 +比如, +so_keepalive=30m::10将 +设置空闲超时(TCP_KEEPIDLE)为30分钟, +设置探测次数(TCP_KEEPCNT)为10次, +保留探测时间间隔(TCP_KEEPINTVL)为系统默认值。 + + + + + + +举例: + +listen 127.0.0.1 default_server accept_filter=dataready backlog=1024; + + + + + + + +[ + = | + ~ | + ~* | + ^~ + ] uri +@name + +server +location + + +为某个请求URI(路径)建立配置。 + + + +路径匹配在URI规范化以后进行。所谓规范化,就是先将URI中形如“%XX”的编码字符进行解码, +再解析URI中的相对路径“.”和“..”部分, +另外还可能会压缩相邻的两个或多个斜线成为一个斜线。 + + + +可以使用前缀字符串或者正则表达式定义路径。使用正则表达式需要在路径开始添加“~*”前缀 +(不区分大小写),或者“~”前缀(区分大小写)。为了根据请求URI查找路径,nginx先检查前缀字符串定义的路径 +(前缀路径),在这些路径中找到能最精确匹配请求URI的路径。然后nginx按在配置文件中的出现顺序检查正则表达式路径, +匹配上某个路径后即停止匹配并使用该路径的配置,否则使用最大前缀匹配的路径的配置。 + + + +路径可以嵌套,但有例外,后面将提到。 + + + +在不区分大小写的操作系统(诸如Mac OS X和Cygwin)上,前缀匹配忽略大小写(0.7.7)。但是,比较仅限于单字节的编码区域(one-byte locale)。 + + + +正则表达式中可以包含匹配组(0.7.40),结果可以被后面的其他指令使用。 + + + +如果最大前缀匹配的路径以“^~”开始,那么nginx不再检查正则表达式。 + + + +而且,使用“=”前缀可以定义URI和路径的精确匹配。如果发现匹配,则终止路径查找。 +比如,如果请求“/”出现频繁,定义“location = /”可以提高这些请求的处理速度, +因为查找过程在第一次比较以后即结束。这样的路径明显不可能包含嵌套路径。 + + + + +在0.7.1到0.8.41的所有nginx中,如果请求匹配的前缀字符串路径并没有“=”或“^~”前缀, +路径查找过程仍然会停止,而不进行正则表达式匹配。 + + + + +让我们用一个例子解释上面的说法: + +location = / { + [ configuration A ] +} + +location / { + [ configuration B ] +} + +location /documents/ { + [ configuration C ] +} + +location ^~ /images/ { + [ configuration D ] +} + +location ~* \.(gif|jpg|jpeg)$ { + [ configuration E ] +} + +请求“/”匹配配置A, +请求“/index.html”匹配配置B, +请求“/documents/document.html”匹配配置C, +请求“/images/1.gif”匹配配置D, +请求“/documents/1.jpg”匹配配置E。 + + + +前缀“@”定义了命名路径。这种路径不在一般的请求处理中使用, +而是用在请求重定向中。这些路径不能嵌套,也不能包含嵌套路径。 + + + + + + + + +on | off +on +http +server +location + + +开启或者关闭在中记录文件不存在的错误。 + + + + + + +on | off +off +http +server +location + + +开启或者关闭在中记录子请求的访问日志。 + + + + + + +number + +http +server +location +1.1.2 + + +如果请求中含有字节范围的请求头,这条指令可以限制此范围允许的最大值。如果请求头的值超过此限制,将按请求未携带此请求头的情况处理。 +默认nginx对此不做限制。设置为0将使nginx完全不支持HTTP字节范围特性。 + + + + + + +on | off +on +http +server + + +开启或者关闭将请求URI中相邻两个或更多斜线合并成一个的功能。 + + + +注意压缩URI对于前缀匹配和正则匹配的正确性是很重要的。没有开启这个功能时,请求“//scripts/one.php”将不能匹配 + +location /scripts/ { + ... +} + +而被按静态文件的流程处理,所以将它变换成“/scripts/one.php”。 + + + +如果URI中包含base64编码的内容,必须将斜线压缩调整成off,因为base64编码本身会使用“/”字符。 +然而。出于安全方面的考虑,最好还是不要关闭压缩。 + + + +这条指令可以指定在默认虚拟主机的配置级别。这样的话,这个配置可以覆盖监听同一地址和端口的所有虚拟主机。 + + + + + + +on | off +on +http +server +location + + +在响应状态码大于等于400时,在响应正文中添加一段注释,使响应正文达到512字节。 +本指令可以为MSIE客户端开启或关闭这个功能。 + + + + + + +on | off +off +http +server +location + + +为MSIE客户端开启或者关闭用页面刷新取代页面重定向的功能。 + + + + + + +off + +max=N +[inactive=time] +off +http +server +location + + +用于配置文件缓存,可缓存: + + + +打开文件的描述符,大小和修改时间; + + + +目录查找结果; + + + +文件查找时的错误结果,诸如“file not found”(文件不存在)、“no read permission”(无读权限)等等。 + +应单独使用指令开启缓存错误结果的功能。 + + + + + + + +指令有下列参数: + + + +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; + + + + + + + +on | off +off +http +server +location + + +开启或者关闭缓存文件查找的错误结果。 + + + + + + + + + +number +1 +http +server +location + + +设置在由指令的inactive参数配置的超时时间内, +文件应该被访问的最小number(次数)。如果访问次数大于等于此值,文件描述符会保留在缓存中,否则从缓存中删除。 + + + + + + +time +60s +http +server +location + + +设置检查缓存的元素的时间间隔。 + + + + + + + +on | off +off +http +server + + +这条指令已经被废弃,请使用指令。 + + + + + + + + +on | off +on +http +server +location + + +开启或关闭nginx发起重定向时指定端口。 + + + +重定向中首要主机名的使用由指令控制。 + + + + + + +size +1460 +http +server +location + + +如果可能,到客户端的数据将被推迟发送,直到nginx需要发送的数据至少有size字节。 +设置为0将关闭推迟发送的功能。 + + + + + + +size +0 +http +server +location + + +设置内核参数,控制文件预读的数量。 + + + +在Linux上,因为使用的是posix_fadvise(0, 0, 0, POSIX_FADV_SEQUENTIAL)系统调用,所以size无用。 + + + +在FreeBSD上,访问的是fcntl(O_READAHEAD,size)系统调用。 +该系统调用在FreeBSD 9.0-CURRENT才被支持,在FreeBSD 7上则需要打补丁。 + + + + + + +on | off +off +http +server +location + + +允许或禁止指令进行多次重定向。 +允许的话,重定向次数也有限制。 +而禁止此功能时,当访问指令重定向的错误页面出现任何问题时,nginx将直接输出默认错误页面。 + + + + + + +size +4k +http +server + + +允许对每个请求的内存分配进行细调。这条指令对性能影响很小,通常情况下不应使用。 + + + + + + +on | off +off +http +server +location + + +开启或关闭重置超时连接的功能。重置连接是这样执行的:关闭套接字以前,设置SO_LINGER选项的超时值为0, +那么当关闭套接字时,nginx向客户端发送TCP RST,并且释放此套接字占用的所有内存。 +这样可以避免某个已关闭的套接字长时间处于FIN_WAIT1状态,并占用内存缓冲区。 + + + +应该注意的事,超时的长连接仍然是正常关闭。 + + + + + + + +address ... +[valid=time] + +http +server +location + + +配置将后端服务器的名字解析成ip地址的名字服务器,比如: + +resolver 127.0.0.1 [::1]:5353; + +这里地址可以指定域名或者ip地址,可以带端口号(1.3.1,1.2.2)。如果未指定端口,nginx使用53端口。 +以轮询方式发送请求到多台名字服务器。 + +在1.1.7版以前,只允许配置一个名字服务器。而支持使用IPv6地址定义名字服务器则是从1.3.1和1.2.2版本开始。 + +nginx会缓存名字解析的结果。默认情况下,缓存时间是名字解析响应中的TTL字段的值。也允许通过valid参数覆盖它: + +resolver 127.0.0.1 [::1]:5353 valid=30s; + + +在1.1.9版以前,不可能调节缓存时间,nginx总会将响应缓存5分钟。 + + + + + + + +time +30s +http +server +location + + +为名字解析设置超时,比如: + +resolver_timeout 5s; + + + + + + + +path +html +http +server +location +if in location + + +为请求设置根目录。比如,如果配置如下 + +location /i/ { + root /data/w3; +} + +那么nginx将使用文件/data/w3/i/top.gif响应请求“/i/top.gif”。 + + + +path的值中可以包含除$document_root$realpath_root以外的变量。 + + + +文件路径的构造仅仅是将URI拼在root指令的值后面。如果需要修改URI,应该使用指令。 + + + + + + +all | any +all +http +server +location + + +nginx进行访问限制的有ngx_http_access_module模块和 +ngx_http_auth_basic_module模块。 +本指令设置成all时,表示只有当两个模块的所有限制条件(写入配置的)都授权访问时,允许请求访问; +设置成any时,表示如果当任意模块的任意限制条件授权访问时,允许请求访问。 + + + +举例: + +location / { + satisfy any; + + allow 192.168.1.0/32; + deny all; + + auth_basic "closed site"; + auth_basic_user_file conf/htpasswd; +} + + + + + + + +on | off +off +http +server +location + + +这条指令已被指令的any参数取代。 + + + + + + +size +0 +http +server +location + + +如果设置成非0值,nginx将尝试最小化向客户端发送数据的次数。 +这是通过将方法的NOTE_LOWAT标志, +或者将套接字的SO_SNDLOWAT属性设置成指定的size实现的。 + + + +这条指令在Linux、Solaris和Windows操作系统无效。 + + + + + + +time +60s +http +server +location + + +设置向客户端传输响应的超时。超时仅指两次相邻写操作之间的时间间隔,而非整个响应的传输时间。 +如果客户端在这段时间中没有收到任何数据,连接将关闭。 + + + + + + + +on | off +off +http +server +location +if in location + + +开启或关闭使用sendfile调用。 + + + + + + + +size +0 +http +server +location + + +设置为非0值时,可以限制在一次sendfile调用时传输的数据量。 +如果不进行限制,一个快速的连接可能会霸占整个worker进程的所有资源。 + + + + + + + + +http + + +表示开始设置虚拟主机的配置。 +nginx没有明显分隔IP-based(基于IP地址)和name-based(基于
Host
请求头)这两种类型的虚拟主机, +而是用指令描述虚拟主机接受连接的地址和端口,用指令列出虚拟主机的所有主机名。 +在文档“Nginx如何处理一个请求”中提供了示例配置。 +
+ +
+ + + +name ... +"" +server + + +设置虚拟主机名,比如: + +server { + server_name example.com www.example.com; +} + + + + +第一个名字成为虚拟主机的首要主机名。 + + + +主机名中可以含有星号(“*”),以替代名字的开始部分或结尾部分: + +server { + server_name example.com *.example.com www.example.*; +} + +上面这些名字称为通配符主机名。 + + + +上面例子中的前两个名字可以组合成一个: + +server { + server_name .example.com; +} + + + + +也可以在主机名中使用正则表达式,就是在名字前面补一个波浪线(“~”): + +server { + server_name www.example.com ~^www\d+\.example\.com$; +} + + + + +可以在正则表达式中包含匹配组(0.7.40),后续被其他指令使用: + +server { + server_name ~^(www\.)?(.+)$; + + location / { + root /sites/$2; + } +} + +server { + server_name _; + + location / { + root /sites/default; + } +} + + + + + +正则表达式中的命名匹配组可以创建变量(0.8.25),后续被其他指令使用: + +server { + server_name ~^(www\.)?(?<domain>.+)$; + + location / { + root /sites/$domain; + } +} + +server { + server_name _; + + location / { + root /sites/default; + } +} + + + + +如果参数值等于“$hostname”(0.9.4),将使用机器的hostname来替换。 + + + +nginx也允许定义空主机名(0.7.11): + +server { + server_name www.example.com ""; +} + +这种主机名可以让虚拟主机处理没有
Host
请求头的请求,而不是让指定“地址:端口”的默认虚拟主机来处理。 +这是本指令的默认设置。 + +在0.8.48版以前,机器的hostname被用作默认设置。 + +
+ + +通过名字查找虚拟主机时,如果一个名字可以匹配多个指定的配置,比如同时匹配上通配符和正则表达式, +按下面优先级,使用先匹配上的虚拟主机: + + + +确切的名字; + + + +最长的以星号起始的通配符名字,比如“*.example.com”; + + + +最长的以星号结束的通配符名字,比如“mail.*”; + + + +第一个匹配的正则表达式名字(按在配置文件中出现的顺序)。 + + + + + + +另一篇文档“虚拟主机名”对虚拟主机名的有详细的描述。 + + +
+ + + +on | off +off +http +server +location + + +开启或关闭nginx将指令指定的首要虚拟主机名用于发起的重定向的功能。 +关闭此功能时,nginx将使用
Host
请求头的中的名字,如果没有此请求头,nginx将使用虚拟主机所在的IP地址。 +
+ + +重定向中端口的使用由指令控制。 + + +
+ + + +size +32|64|128 +http + + +设置主机名哈希表的表项长度,其默认值取决于处理器的缓存线长度。 +另一篇文档“设置哈希表”详细介绍了如何设置哈希表。 + + + + + + +size +512 +http + + +设置主机名哈希表的最大size(桶容量)。 +另一篇文档“设置哈希表”详细介绍了如何设置哈希表。 + + + + + + +on | off +on +http +server +location + + +开启或关闭在错误信息的
Server
响应头中输出nginx版本号。 +
+ +
+ + + +on | off +on +http +server +location + + +开启或关闭nginx使用TCP_NODELAY选项的功能。 +这个选项仅在将连接转变为长连接的时候才被启用。(译者注,在upstream发送响应到客户端时也会启用)。 + + + + + + +on | off +off +http +server +location + + +开启或者关闭nginx在FreeBSD上使用TCP_NOPUSH套接字选项, +在Linux上使用TCP_CORK套接字选项。 +选项仅在使用的时候才开启。 +开启此选项允许 + + + +在Linux和FreeBSD 4.*上将响应头和正文的开始部分一起发送; + + + +一次性发送整个文件。 + + + + + + + + + +file ... uri +file ... =code + +server +location + + +按指定顺序检查文件是否存在,并且使用第一个找到的文件来处理请求,那么处理过程就是在当前上下文环境中进行的。 +文件路径是根据指令和指令,将file参数拼接而成。 +可以在名字尾部添加斜线以检查目录是否存在,比如“$uri/”。 +如果找不到任何文件,将按最后一个参数指定的uri进行内部跳转。 +比如: + +location /images/ { + try_files $uri /images/default.gif; +} + +location = /images/default.gif { + expires 30s; +} + +最后一个参数也可以指向一个命名路径,如下面的例子所示。 +从0.7.51版开始,最后一个参数也可以是code: + +location / { + try_files $uri $uri/index.html $uri.html =404; +} + + + + +下面是代理Mongrel的例子: + +location / { + try_files /system/maintenance.html + $uri $uri/index.html $uri.html + @mongrel; +} + +location @mongrel { + proxy_pass http://mongrel; +} + + + + +下面是Drupal用FastCGI的例子: + +location / { + try_files $uri $uri/ @drupal; +} + +location ~ \.php$ { + try_files $uri @drupal; + + fastcgi_pass ...; + + fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name; + fastcgi_param SCRIPT_NAME $fastcgi_script_name; + fastcgi_param QUERY_STRING $args; + + ... other fastcgi_param's +} + +location @drupal { + fastcgi_pass ...; + + fastcgi_param SCRIPT_FILENAME /path/to/index.php; + fastcgi_param SCRIPT_NAME /index.php; + fastcgi_param QUERY_STRING q=$uri&$args; + + ... other fastcgi_param's +} + +而下面的例子中 + +location / { + try_files $uri $uri/ @drupal; +} + +try_files指令等价于 + +location / { + error_page 404 = @drupal; + log_not_found off; +} + +然后是这里, + +location ~ \.php$ { + try_files $uri @drupal; + + fastcgi_pass ...; + + fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name; + + ... +} + +try_files在将请求发送到FastCGI服务器以前检查PHP文件是否存在。 + + + +下面是Wordpress和Joomla的例子: + +location / { + try_files $uri $uri/ @wordpress; +} + +location ~ \.php$ { + try_files $uri @wordpress; + + fastcgi_pass ...; + + fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name; + ... other fastcgi_param's +} + +location @wordpress { + fastcgi_pass ...; + + fastcgi_param SCRIPT_FILENAME /path/to/index.php; + ... other fastcgi_param's +} + + + + + + + + + + text/html html; + image/gif gif; + image/jpeg jpg; + +http +server +location + + +设置文件扩展名和响应的MIME类型的映射表。 +可以将多个扩展名映射到同一种类型,比如: + +types { + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; +} + + + + +随nginx发行的conf/mime.types文件中包含了足够全面的映射表。 + + + +为了是为某个路径的所有请求生成MIME类型“application/octet-stream”, +可以使用下面配置: + +location /download/ { + types { } + default_type application/octet-stream; +} + + + + + + + +size +32|64|128 +http +server +location + + +设置MIME类型哈希表的表项长度,其默认值取决于处理器的缓存线长度。 +另一篇文档“设置哈希表”详细介绍了如何设置哈希表。 + + + + + + +size +1024 +http +server +location + + +设置MIME类型哈希表的最大size(桶容量)。 +另一篇文档“设置哈希表”详细介绍了如何设置哈希表。 + + + + + + +on | off +off +http +server + + +允许或禁止在客户端请求头中使用下划线。 +如果禁止,含有下划线的请求头将被标志为非法请求头并接受指令的处理。 + + + +可以在默认主机的配置级别定义此命令。这样,指令设置将覆盖监听同一地址和端口的所有虚拟主机。 + + + + + + +size +64 +http + + +设置变量哈希表的表项长度,其默认值取决于处理器的缓存线长度。 +另一篇文档“设置哈希表”详细介绍了如何设置哈希表。 + + + + + + +size +512 +http + + +设置变量哈希表的最大size(桶容量)。 +另一篇文档“设置哈希表”详细介绍了如何设置哈希表。 + + + + +
+ + +
+ + +ngx_http_core_module模块支持内嵌变量,变量名与Apache服务器对应。 +首先,这些变量可以表示客户端的请求头字段,诸如$http_user_agent$http_cookie等等。 +nginx也支持其他变量: + + +$arg_name + +请求行中的name参数。 + + +$args + +请求行中参数字符串。 + + +$binary_remote_addr + +客户端IP地址的二进制形式,值的长度总是4字节。 + + +$body_bytes_sent + +nginx返回给客户端的字节数,不含响应头。 + + +$bytes_sent + +nginx返回给客户端的字节数(1.3.8, 1.2.5)。 + + +$connection + +连接的序列号(1.3.8, 1.2.5)。 + + +$content_length + +
Content-Length
请求头的值。 +
+ +$content_type + +
Content-Type
请求头的值。 +
+ +$cookie_name + +名为name的cookie。 + + +$document_root + +当前请求的指令或指令的配置值。 + + +$document_uri + +与$uri相同。 + + +$host + +
Host
请求头的值,如果没有该请求头,则为与请求对应的虚拟主机的首要主机名。 +
+ +$hostname + +机器名称。 + + +$http_name + +任意请求头的值;变量名的后半部为转化为小写并且用下划线替代横线后的请求头名称。 + + +$https + +如果连接是SSL模块,返回“on”,否则返回空字符串。 + + +$is_args + +如果请求行带有参数,返回“?”,否则返回空字符串。 + + +$limit_rate + +允许设置此值来限制连接的传输速率。 + + +$msec + +当前时间,单位是秒,精度是毫秒。(1.3.9, 1.2.6) + + +$nginx_version + +nginx版本号。 + + +$pid + +worker进程的PID。 + + +$query_string + +与$args相同。 + + +$realpath_root + +按指令或指令算出的当前请求的绝对路径。其中的符号链接都会解析成真是文件路径。 + + +$remote_addr + +客户端IP地址。 + + +$remote_port + +客户端端口。 + + +$remote_user + +为基本用户认证提供的用户名。 + + +$request + +完整的原始请求行。 + + +$request_body + +请求正文。 + +在由指令和 +指令处理的路径中, +这个变量值可用。 + + + +$request_body_file + +请求正文的临时文件名。 + +处理完成时,临时文件将被删除。 +如果希望总是将请求正文写入文件,需要开启。 +如果在被代理的请求或FastCGI请求中传递临时文件名,就应该禁止传递请求正文本身。 +使用proxy_pass_request_body off指令 +和fastcgi_pass_request_body off指令 +分别禁止在代理和FastCGI中传递请求正文。 + + + +$request_completion + +请求完成时返回“OK”,否则返回空字符串。 + + +$request_filename + +基于指令或指令,以及请求URI,得到的当前请求的文件路径。 + + +$request_method + +HTTP方法,通常为“GET”或者“POST”。 + + +$request_time + +请求处理的时间,单位为秒,精度是毫秒(1.3.9, 1.2.6);请求处理时间从由客户端接收到第一个字节开始计算。 + + +$request_uri + +完整的原始请求行(带参数)。 + + +$scheme + +请求协议类型,为“http”或“https”。 + + +$sent_http_name + +任意的响应头字段的值。 +变量名的后半部为转化为小写并且用下划线替代横线后的响应头名称。 + + +$server_addr + +接受请求的服务器地址。 + +为计算这个值,通常需要进行一次系统调用。为了避免系统调用,必须指定指令 +的地址,并且使用bind参数。 + + + +$server_name + +接受请求的虚拟主机的首要主机名。 + + +$server_port + +接受请求的虚拟主机的端口。 + + +$server_protocol + +请求协议,通常为“HTTP/1.0”或“HTTP/1.1”。 + + +$status + +响应状态码。 + + + +$tcpinfo_rtt, +$tcpinfo_rttvar, +$tcpinfo_snd_cwnd, +$tcpinfo_rcv_space + + +客户端TCP连接的信息,在支持套接字选项TCP_INFO的系统中可用。 + + +$uri + +当前请求规范化以后的URI。 + +变量$uri的值可能随请求的处理过程而改变。 +比如,当进行内部跳转时,或者使用默认页文件。 + + + +
+
+ +
+ +
diff --git a/xml/cn/docs/http/ngx_http_empty_gif_module.xml b/xml/cn/docs/http/ngx_http_empty_gif_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_empty_gif_module.xml @@ -0,0 +1,54 @@ + + + + + + + + + +
+ + +模块 ngx_http_empty_gif_module 只返回一个透明像素的GIF图片。 + + +
+ + +
+ + + +location = /_.gif { + empty_gif; +} + + + +
+ + +
+ + + + +location + + +在当前location里使用这个模块处理请求。 + + + + +
+ +
diff --git a/xml/cn/docs/http/ngx_http_flv_module.xml b/xml/cn/docs/http/ngx_http_flv_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_flv_module.xml @@ -0,0 +1,65 @@ + + + + + + + + +
+ + +模块ngx_http_flv_module 为Flash Video(FLV)文件 +提供服务端伪流媒体支持 + + + +通过返回以请求偏移位置开始的文件内容,该模块专门处理 +在查询串中有start参数的请求, +和有预先设置到FLV头部的请求。 + + + +这个模块并不是默认构建的,必须通过配置参数 +--with-http_flv_module +来启用。 + + +
+ + +
+ + + +location ~ \.flv$ { + flv; +} + + + +
+ + +
+ + + +location + + +在当前location里使用这个模块处理请求。 + + + + +
+ +
diff --git a/xml/cn/docs/http/ngx_http_geo_module.xml b/xml/cn/docs/http/ngx_http_geo_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_geo_module.xml @@ -0,0 +1,152 @@ + + + + + + + + +
+ + +ngx_http_geo_module 模块创建变量,并根据客户端IP地址对变量赋值。 + + +
+ + +
+ + + +geo $geo { + default 0; + 127.0.0.1/32 2; + 192.168.1.0/24 1; + 10.1.0.0/16 1; +} + + + +
+ + +
+ + +[$address] $variable + +http + + +定义从指定的变量获取客户端的IP地址。默认情况下,nginx从$remote_addr变量取得客户端IP地址,但也可以从其他变量获得(0.7.27版),比如: + +geo $arg_remote_addr $geo { + ...; +} + +如果该变量的值不能代表一个合法的IP地址,那么nginx将使用地址“255.255.255.255”。 + + + +nginx通过CIDR或者地址段(0.7.23版)来描述地址,同时支持下面的特殊参数: + + +delete + +删除指定网络(0.7.23版)。 + + +default + +如果客户端地址不能匹配任意一个定义的地址,nginx将使用此值。 +如果使用CIDR,可以用“0.0.0.0/0”代替default。 + + +include + +包含一个定义地址和值的文件。可以多次包含。 + + +proxy + +定义可信地址(0.8.7,0.7.63版)。 +如果请求来自可信地址,nginx将使用其
X-Forwarded-For
头来获得地址。 +相对于普通地址,可信地址是顺序检测的。 + +从1.3.0和1.2.1版本起,nginx开始支持IPv6地址。 + +
+ +proxy_recursive + +开启递归查找地址(1.3.0,1.2.1版)。 +如果关闭递归查找,在客户端地址与某个可信地址匹配时,nginx将使用
X-Forwarded-For
中的最后一个地址来代替原始客户端地址。 +如果开启递归查找,在客户端地址与某个可信地址匹配时,nginx将使用
X-Forwarded-For
中最后一个与所有可信地址都不匹配的地址来代替原始客户端地址。 +
+ +ranges + +指示地址将定义为地址段的形式(0.7.23版)。这个参数应该第一个被定义。为了加速装载地址库,地址应按升序定义。 + + +
+
+ + +举例: + +geo $country { + default ZZ; + include conf/geo.conf; + delete 127.0.0.0/16; + proxy 192.168.100.0/24; + proxy 2001:0db8::/32; + + 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; + + + + +nginx将使用能最精确匹配客户端地址的配置中定义的值。比如,对于地址127.0.0.1,nginx会选取“RU”而非“US”,作为变量值。 + + + +地址段的例子: + +geo $country { + ranges; + default ZZ; + 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; +} + + + +
+ +
+ +
diff --git a/xml/cn/docs/http/ngx_http_geoip_module.xml b/xml/cn/docs/http/ngx_http_geoip_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_geoip_module.xml @@ -0,0 +1,167 @@ + + + + + + + + +
+ + +ngx_http_geoip_module 模块(0.8.6+)创建变量,使用预编译的MaxMind数据库解析客户端IP地址,得到变量值。 + + + +nginx默认不编译这个模块,需要开启--with-http_geoip_module编译选项。 + +模块依赖MaxMind GeoIP库。 + + + +
+ + +
+ + + +http { + geoip_country GeoIP.dat; + geoip_city GeoLiteCity.dat; + geoip_proxy 192.168.100.0/24; + geoip_proxy 2001:0db8::/32; + geoip_proxy_recursive on; + ... + + + +
+ + +
+ + +database + +http + + +指定数据库,用于根据客户端IP地址得到其所在国家。 +使用这个数据库时,配置中可用下列变量: + + +$geoip_country_code + +双字符国家代码,比如 +“RU”,“US”。 + + +$geoip_country_code3 + +三字符国家代码,比如 +“RUS”,“USA”。 + + +$geoip_country_name + +国家名称,比如 +“Russian Federation”,“United States”。 + + + + + + + + + +database + +http + + +指定数据库,用于根据客户端IP地址得到其所在的国家、行政区和城市。 +使用这个数据库时,配置中可用下列变量: + + +$geoip_city_country_code + +双字符国家代码,比如 +“RU”,“US”。 + + +$geoip_city_country_code3 + +三字符国家代码,比如 +“RUS”,“USA”。 + + +$geoip_city_country_name + +国家名称,比如 +“Russian Federation”,“United States”。 + + +$geoip_region + +国家行政区名(行政区、直辖区、州、省、联邦管辖区,诸如此类),比如 +“Moscow City”,“DC”。 + + +$geoip_city + +城市名称,比如 +“Moscow”,“Washington”。 + + +$geoip_postal_code + +邮编。 + + + + + + + + + +address | CIDR + +http +1.3.0 +1.2.1 + + +定义可信地址。 +如果请求来自可信地址,nginx将使用其
X-Forwarded-For
头来获得地址。 +
+ +
+ + + +on | off +off +http +1.3.0 +1.2.1 + + +如果关闭递归查找,在客户端地址与某个可信地址匹配时,nginx将使用
X-Forwarded-For
中的最后一个地址来代替原始客户端地址。 +如果开启递归查找,在客户端地址与某个可信地址匹配时,nginx将使用
X-Forwarded-For
中最后一个与所有可信地址都不匹配的地址来代替原始客户端地址。 +
+ +
+ +
+ +
diff --git a/xml/cn/docs/http/ngx_http_image_filter_module.xml b/xml/cn/docs/http/ngx_http_image_filter_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_image_filter_module.xml @@ -0,0 +1,219 @@ + + + + + + + + +
+ + +ngx_http_image_filter_module 模块(0.7.54+)是一个 +过滤器,它可以对JPEG,GIF和PNG等图像进行变换。 + + + +这个模块并不是默认编译的,需要通过 +--with-http_image_filter_module编译选项来启用。 + +这个模块使用了 +libgd 库。 +推荐使用这个库可用的最新版本;在写这个文档时它的最新版本是2.0.35。 + + + +
+ + +
+ + + +location /img/ { + proxy_pass http://backend; + image_filter resize 150 100; + image_filter rotate 90; + error_page 415 = /empty; +} + +location = /empty { + empty_gif; +} + + + +
+ + +
+ + +off +test +size + + rotate + 90 | 180 | + 270 + + resize + width + height + + crop + width + height + +location + + +设置图像变换的操作: + + +off + +在所在location关闭模块处理。 + + +test + +确保应答是JPEG,GIF或PNG格式的图像。否则错误 + +将被返回。 + + +size + +以JSON格式返回图像信息。例如: + +{ "img" : { "width": 100, "height": 100, "type": "gif" } } + +如果有错误发生,将会返回如下: + +{} + + + +rotate +90|180|270 + + +将图像逆时针旋转指定角度。 +参数的值可以包含变量。 +可以单独使用,或与 +resizecrop 变换同时使用. + + +resize +width +height + + +按比例缩小图像至指定大小。 +如果想只指定其中一维,另一维可以指定为: +“-”。 +如果有错误发生,服务器会返回 +. +参数的值可以包含变量。 +当与 rotate 参数同时使用时, +旋转发生在缩放 之后。 + + +crop +width +height + + +按比例以图像的最短边为准对图像大小进行缩小,然后裁剪另一边多出来的部分。 +如果想只指定其中一维,另一维可以指定为: +“-”。 +如果有错误发生,服务器会返回 +. +参数的值可以包含变量。 +当与 rotate 参数同时使用时, +旋转发生在裁剪 之前。 + + + + + + + + + +size +1M +http +server +location + + +设置用来读图像的缓冲区的最大值。 +若图像超过这个大小,服务器会返回 +. + + + + + + +quality +75 +http +server +location + + +设置变换后的JPEG图像的 质量 。 +可配置值: 1 ~ 100 。 +更小的值意味着更差的图像质量以及更少需要传输的数据。 +推荐的最大值是95. +参数的值可以包含变量。 + + + + + + +percent +0 +http +server +location + + +增加最终图像的锐度。 +锐度百分比可以超过100. +0为关闭锐化。 +参数的值可以包含变量。 + + + + + + +on|off +on +http +server +location + + +定义当对PNG,或者GIF图像进行颜色变换时是否需要保留透明度。 +损失透明度有可能可以获得更高的图像质量。 +PNG图像中的alpha通道的透明度默认会一直被保留。 + + + + +
+ +
diff --git a/xml/cn/docs/http/ngx_http_limit_req_module.xml b/xml/cn/docs/http/ngx_http_limit_req_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_limit_req_module.xml @@ -0,0 +1,153 @@ + + + + + + + + +
+ + +ngx_http_limit_req_module模块(0.7.21)可以通过定义的 +键值来限制请求处理的频率。特别的,它可以限制来自单个IP地址的请求处理频率。 +限制的方法是通过一种“漏桶”的方法——固定每秒处理的请求数,推迟过多的请求处理。 + + + +
+ + +
+ + + +http { + limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; + + ... + + server { + + ... + + location /search/ { + limit_req zone=one burst=5; + } + + + +
+ + +
+ + + + zone=name + [burst=number] + [nodelay] + +http +server +location + + +设置对应的共享内存限制域和允许被处理的最大请求数阈值。 +如果请求的频率超过了限制域配置的值,请求处理会被延迟,所以 +所有的请求都是以定义的频率被处理的。 +超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值 +这时,这个请求会被终止,并返回 +错误。这个阈值的默认值等于0。 +比如这些指令: + +limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; + +server { + location /search/ { + limit_req zone=one burst=5; + } + +限制平均每秒不超过一个请求,同时允许超过频率限制的请求数不多于5个。 + + + +如果不希望超过的请求被延迟,可以用nodelay参数: + +limit_req zone=one burst=5 nodelay; + + + + + + + + +info | +notice | +warn | +error +error +http +server +location +0.8.18 + + +设置你所希望的日志级别,当服务器因为频率过高拒绝或者延迟处理请求时可以记下相应级别的日志。 +延迟记录的日志级别比拒绝的低一个级别;比如, +如果设置“limit_req_log_level notice”, +延迟的日志就是info级别。 + + + + + + + + $variable + zone=name:size + rate=rate + +http + + +设置一块共享内存限制域的参数,它可以用来保存键值的状态。 +它特别保存了当前超出请求的数量。 +键的值就是指定的变量(空值不会被计算)。 +示例用法: + +limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; + + + + +这里,状态被存在名为“one”,最大10M字节的共享内存里面。对于这个限制域来说 +平均处理的请求频率不能超过每秒一次。 + + + +键值是客户端的IP地址。 +如果不使用$remote_addr变量,而用$binary_remote_addr变量, +可以将每条状态记录的大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录。 +如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 +错误。 + + + +请求频率可以设置为每秒几次(r/s)。如果请求的频率不到每秒一次, +你可以设置每分钟几次(r/m)。比如每秒半次就是30r/m。 + + + + +
+ +
diff --git a/xml/cn/docs/http/ngx_http_log_module.xml b/xml/cn/docs/http/ngx_http_log_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_log_module.xml @@ -0,0 +1,266 @@ + + + + + + + + +
+ + +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; + + + +
+ + +
+ + + + path + [format + [buffer=size]] +off +logs/access.log combined +http +server +location +if in location +limit_except + + +为访问日志设置路径,格式和缓冲区大小(nginx访问日志支持缓存)。 +在同一个配置层级里可以指定多个日志。 +特定值off会取消当前配置层级里的所有access_log指令。 +如果没有指定日志格式则会使用预定义的“combined”格式。 + + + +缓冲区的大小不能超过磁盘文件原子性写入的大小。 +对于FreeBSD来说缓冲区大小是无限制的。 + + + +日志文件的路径可以包含变量(0.7.6+), +但此类日志存在一些限制: + + + +工作进程使用的 +应拥有在目录里创建文件的权限; + + + +写缓冲无效; + + + +每条日志写入都会打开和关闭文件。然而,频繁使用的文件描述符可以存储在 +缓存中, +在指令的valid参数指定的时间里, +写操作能持续写到旧文件。 + + + +每次日志写入的操作都会检查请求的 +根目录是否存在, +如果不存在则日志不会被创建。 +因此在一个层级里同时指定 +和access_log是一个不错的想法: + +server { + root /spool/vhost/data/$host; + access_log /spool/vhost/logs/$host; + ... + + + + + + + + + + + + name + string ... +combined "..." +http + + +指定日志的格式。 + + + +日志格式允许包含普通变量和只在日志写入时存在的变量: + + +$body_bytes_sent + +发送给客户端的字节数,不包括响应头的大小; +该变量与Apache模块mod_log_config里的“%B”参数兼容。 + + +$bytes_sent + +发送给客户端的总字节数。 + + +$connection + +连接的序列号。 + + +$connection_requests + +当前通过一个连接获得的请求数量。 + + +$msec + +日志写入时间。单位为秒,精度是毫秒。 + + +$pipe + +如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。 + + +$request_length + +请求的长度(包括请求行,请求头和请求正文)。 + + +$request_time + +请求处理时间,单位为秒,精度毫秒; +从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。 + + +$status + +响应状态。 + + +$time_iso8601 + +ISO8601标准格式下的本地时间。 + + +$time_local + +通用日志格式下的本地时间。 + + + + + + +发送给客户端的响应头拥有“sent_http_”前缀。 +比如$sent_http_content_range。 + + + +配置始终包含预先定义的“combined”日志格式: + +log_format combined '$remote_addr - $remote_user [$time_local] ' + '"$request" $status $body_bytes_sent ' + '"$http_referer" "$http_user_agent"'; + + + + + + + + + +max=N +[inactive=time] +[min_uses=N] +[valid=time] +off +off +http +server +location + + +定义一个缓存,用来存储频繁使用的文件名中包含变量的日志文件描述符。 +该指令包含以下参数: + + +max + +设置缓存中描述符的最大数量;如果缓存被占满,最近最少使用(LRU)的描述符将被关闭。 + + +inactive + +设置缓存文件描述符在多长时间内没有被访问就关闭; +默认为10秒。 + + +min_uses + +设置在inactive参数指定的时间里, +最少访问多少次才能使文件描述符保留在缓存中;默认为1。 + + +valid + +设置一段用于检查超时后文件是否仍以同样名字存在的时间; +默认为60秒。 + + +off + +禁用缓存。 + + + + + + +使用实例: + +open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2; + + + + + +
+ +
diff --git a/xml/cn/docs/http/ngx_http_map_module.xml b/xml/cn/docs/http/ngx_http_map_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_map_module.xml @@ -0,0 +1,186 @@ + + + + + + + + +
+ + +模块 ngx_http_map_module 可以创建一些和另外变量相关联的变量。 + + +
+ + +
+ + + +map $http_host $name { + hostnames; + + default 0; + + example.com 1; + *.example.com 1; + example.org 2; + *.example.org 2; + .example.net 3; + wap.* 4; +} + +map $http_user_agent $mobile { + default 0; + "~Opera Mini" 1; +} + + + +
+ + +
+ + + + string + $variable + +http + + +在配置的参数中,第一个是要创建新的变量,它的值取决于后面一个或多个源变量。 + +在0.9.0版本之前,这里只支持一个变量。 + + + + +在 map 块里的参数指定了源变量值和结果值的对应关系。 + + + +源变量值可以使用字符串或者正则表达式 (0.9.6)。 + + + +一个正则表达式如果以 “~” 开头,这个正则表达式对大小写敏感; +若以 “~*”开头 (1.0.4),这个正则表达式对大小写不敏感。 +且正则表达式里可以包含命名捕获和位置捕获,这些变量可以跟结果变量一起被其它指令使用。 + + + +如果源变量的值正好跟特殊参数同名(看下面),它要以 “\” 字符作为前缀。 + + + +结果变量可以是一个字符串也可以是另外一个变量 (0.9.0)。 + + + +这个指令也支持三个特殊参数。 + +default value + +如果源变量值没有匹配到任何变量,则设置一个默认值作为结果。 +当没有设置 default,将会用一个空的字符串作为默认的结果。 + + +hostnames + +允许用前缀或者后缀掩码指定域名作为源变量值,举个例子, + +*.example.com 1; +example.* 1; + +这两条记录 + +example.com 1; +*.example.com 1; + +可以被合并为: + +.example.com 1; + +这个参数必须写在值映射列表的最前面。 + + +include file + +包含一个或者多个存有映射值的文件。 + + + + + + +如果源值匹配了多余一个的指定变量,例如掩码和正则同时匹配,那么将会按照下面的顺序进行优先选择: + + + +没有掩码的字符串 + + + +最长的带前缀的字符串,例如: “*.example.com” + + + +最长的带后缀的字符串,例如:“mail.*” + + + +按顺序第一个先匹配的正则表达式 (在配置文件中体现的顺序) + + + +默认值 + + + + + + + + + +size +32|64|128 +http + + +为 的变量哈稀表设置桶大小。 +默认值取决于处理器cache line的大小。 +可以从这里获取到更多参考信息: +设置哈稀表. + + + + + + +size +2048 +http + + +设置 变量哈稀表大小的上限。 +可以从这里获取到更多参考信息: +设置哈稀表. + + + + +
+ +
diff --git a/xml/cn/docs/http/ngx_http_proxy_module.xml b/xml/cn/docs/http/ngx_http_proxy_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_proxy_module.xml @@ -0,0 +1,1103 @@ + + + + + + + + +
+ + +ngx_http_proxy_module 模块允许传送请求到其它服务器。 + + +
+ + +
+ + + +location / { + proxy_pass http://localhost:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; +} + + + +
+ + +
+ + +size +4k|8k +http +server +location + + +设置缓冲区的大小为size。nginx从被代理的服务器读取响应时,使用该缓冲区保存响应的开始部分。这部分通常包含着一个小小的响应头。该缓冲区大小默认等于指令设置的一块缓冲区的大小,但它也可以被设置得更小。 + + + + + + +on | off +on +http +server +location + + +代理的时候,开启或关闭缓冲后端服务器的响应。 + + + +当开启缓冲时,nginx尽可能快地从被代理的服务器接收响应,再将它存入指令设置的缓冲区中。如果响应无法整个纳入内存,那么其中一部分将存入磁盘上的临时文件。指令可以控制临时文件的写入。 + + + +当关闭缓冲时,收到响应后,nginx立即将其同步传给客户端。nginx不会尝试从被代理的服务器读取整个请求,而是将指令设定的大小作为一次读取的最大长度。 + + + +响应头
X-Accel-Buffering
传递“yes”或“no”可以动态地开启或关闭代理的缓冲功能。 +这个能力可以通过指令关闭。 +
+ +
+ + + +number size +8 4k|8k +http +server +location + + +为每个连接设置缓冲区的数量为number,每块缓冲区的大小为size。这些缓冲区用于保存从被代理的服务器读取的响应。每块缓冲区默认等于一个内存页的大小。这个值是4K还是8K,取决于平台。 + + + + + + +size +8k|16k +http +server +location + + +当开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小时,nginx一定会向客户端发送响应,直到缓冲小于此值。这条指令用来设置此值。 +同时,剩余的缓冲区可以用于接收响应,如果需要,一部分内容将缓冲到临时文件。该大小默认是指令设置单块缓冲大小的两倍。 + + + + + + +zone | off +off +http +server +location + + +指定用于页面缓存的共享内存。同一块共享内存可以在多个地方使用。off参数可以屏蔽从上层配置继承的缓存功能。 + + + + + + +string ... + +http +server +location + + +定义nginx不从缓存取响应的条件。如果至少一个字符串条件非空而且非“0”,nginx就不会从缓存中去取响应: + +proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment; +proxy_cache_bypass $http_pragma $http_authorization; + +本指令可和与一起使用。 + + + + + + +string +$scheme$proxy_host$request_uri +http +server +location + + +定义如何生成缓存的键,比如 + +proxy_cache_key "$host$request_uri $cookie_user"; + +这条指令的默认值类似于下面字符串 + +proxy_cache_key $scheme$proxy_host$uri$is_args$args; + + + + + + + +on | off +off +http +server +location +1.1.12 + + +开启此功能时,对于相同的请求,同时只允许一个请求发往后端,并根据指令的设置在缓存中植入一个新条目。 +其他请求相同条目的请求将一直等待,直到缓存中出现相应的内容,或者锁在指令设置的超时后被释放。 + + + + + + +time +5s +http +server +location +1.1.12 + + +为指令设置锁的超时。 + + + + + + +number +1 +http +server +location + + +设置响应被缓存的最小请求次数。 + + + + + + + + path + [levels=levels] + keys_zone=name:size + [inactive=time] + [max_size=size] + [loader_files=number] + [loader_sleep=time] + [loader_threshold=time] + +http + + +设置缓存的路径和其他参数。缓存数据是保存在文件中的,缓存的键和文件名都是在代理URL上执行MD5的结果。 + +levels参数定义了缓存的层次结构。比如,下面配置 + +proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m; + +缓存中文件名看起来是这样的: + +/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c + + + + +被缓存的响应首先写入一个临时文件,然后进行重命名。从0.8.9版本开始,临时文件和缓存可以放在不同的文件系统。但请注意,这将导致文件在这两个文件系统中进行拷贝,而不是廉价的重命名操作。因此,针对任何路径,都建议将缓存和指令设置的临时文件目录放在同一文件系统。 + + + +此外,所有活动的键和缓存数据相关的信息都被存放在共享内存中。共享内存通过keys_zone参数的namesize来定义。被缓存的数据如果在inactive参数指定的时间内未被访问,就会被从缓存中移除,不论它是否是刚产生的。inactive的默认值是10分钟。 + + + +特殊进程“cache manager”监控缓存的条目数量,如果超过max_size参数设置的最大值,使用LRU算法移除缓存数据。 + + + +nginx新启动后不就,特殊进程“cache loader”就被启动。该进程将文件系统上保存的过去缓存的数据的相关信息重新加载到共享内存。加载过程分多次迭代完成,每次迭代,进程只加载不多于loader_files参数指定的文件数量(默认值为100)。此外,每次迭代过程的持续时间不能超过loader_threshold参数的值(默认200毫秒)。每次迭代之间,nginx的暂停时间由loader_sleep参数指定(默认50毫秒)。 + + + + + + + + error | + timeout | + invalid_header | + updating | + http_500 | + http_502 | + http_503 | + http_504 | + http_404 | + off + ... +off +http +server +location + + +如果后端服务器出现状况,nginx是可以使用过期的响应缓存的。这条指令就是定义何种条件下允许开启此机制。这条指令的参数与指令的参数相同。 + + + +此外,updating参数允许nginx在正在更新缓存的情况下使用过期的缓存作为响应。这样做可以使更新缓存数据时,访问源服务器的次数最少。 + + + +在植入新的缓存条目时,如果想使访问源服务器的次数最少,可以使用指令。 + + + + + + +[code ...] time + +http +server +location + + +为不同的响应状态码设置不同的缓存时间。比如,下面指令 + +proxy_cache_valid 200 302 10m; +proxy_cache_valid 404 1m; + +设置状态码为200和302的响应的缓存时间为10分钟,状态码为404的响应的缓存时间为1分钟。 + + + +如果仅仅指定了time, + +proxy_cache_valid 5m; + +那么只有状态码为200、300和302的响应会被缓存。 + + + +如果使用了any参数,那么就可以缓存任何响应: + +proxy_cache_valid 200 302 10m; +proxy_cache_valid 301 1h; +proxy_cache_valid any 1m; + + + + +缓存参数也可以直接在响应头中设定。这种方式的优先级高于使用这条指令设置缓存时间。 +
X-Accel-Expires
响应头可以以秒为单位设置响应的缓存时间,如果值为0,表示禁止缓存响应,如果值以@开始,表示自1970年1月1日以来的秒数,响应一直会被缓存到这个绝对时间点。 +如果不含
X-Accel-Expires
响应头,缓存参数仍可能被
Expires
或者
Cache-Control
响应头设置。 +如果响应头含有
Set-Cookie
,响应将不能被缓存。 +这些头的处理过程可以使用指令忽略。 +
+ +
+ + + +time +60s +http +server +location + + +设置与后端服务器建立连接的超时时间。应该注意这个超时一般不可能大于75秒。 + + + + + + +off +domain replacement +off +http +server +location +1.1.15 + + +设置
Set-Cookie
响应头中的domain属性的替换文本。 +假设后端服务器返回的
Set-Cookie
响应头含有属性“domain=localhost”,那么指令 + +proxy_cookie_domain localhost example.org; + +将这个属性改写为“domain=example.org”。 +
+ + +domainreplacement配置字符串,以及domain属性中起始的点将被忽略。 +匹配过程大小写不敏感。 + + + +domainreplacement配置字符串中可以包含变量: + +proxy_cookie_domain www.$host $host; + + + + +这条指令同样可以使用正则表达式。这时,domain应以“~”标志开始,且可以使用命名匹配组和位置匹配组,而replacement可以引用这些匹配组: + +proxy_cookie_domain ~\.(?P<sl_domain>[-0-9a-z]+\.[a-z]+)$ $sl_domain; + + + + +可以同时定义多条proxy_cookie_domain指令: + +proxy_cookie_domain localhost example.org; +proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1; + + + + +off参数可以取消当前配置级别的所有proxy_cookie_domain指令: + +proxy_cookie_domain off; +proxy_cookie_domain localhost example.org; +proxy_cookie_domain www.example.org example.org; + + + +
+ + + +off +path replacement +off +http +server +location +1.1.15 + + +设置
Set-Cookie
响应头中的path属性的替换文本。 +假设后端服务器返回的
Set-Cookie
响应头含有属性“path=/two/some/uri/”,那么指令 + +proxy_cookie_path /two/ /; + +将这个属性改写为“path=/some/uri/”。 +
+ + +pathreplacement配置字符串可以包含变量: + +proxy_cookie_path $uri /some$uri; + + + + +这条指令同样可以使用正则表达式。如果使用大小写敏感的匹配,path应以“~”标志开始,如果使用大小写不敏感的匹配,path应以“~*”标志开始。path可以使用命名匹配组和位置匹配组,replacement可以引用这些匹配组: + +proxy_cookie_path ~*^/user/([^/]+) /u/$1; + + + + +可以同时定义多条proxy_cookie_path指令: + +proxy_cookie_path /one/ /; +proxy_cookie_path / /two/; + + + + +off参数可以取消当前配置级别的所有proxy_cookie_path指令: + +proxy_cookie_path off; +proxy_cookie_path /two/ /; +proxy_cookie_path ~*^/user/([^/]+) /u/$1; + + + +
+ + + +field + +http +server +location + + +nginx默认不会将
Date
Server
X-Pad
,和
X-Accel-...
响应头发送给客户端。proxy_hide_header指令则可以设置额外的响应头,这些响应头也不会发送给客户端。相反的,如果希望允许传递某些响应头给客户端,可以使用指令。 +
+ +
+ + + +1.0 | 1.1 +1.0 +http +server +location +1.1.4 + + +设置代理使用的HTTP协议版本。默认使用的版本是1.0,而1.1版本则推荐在使用连接时一起使用。 + + + + + + +on | off +off +http +server +location + + +决定当客户端在响应传输完成前就关闭连接时,nginx是否应关闭后端连接。 + + + + + + +field ... + +http +server +location + + +不处理后端服务器返回的指定响应头。下面的响应头可以被设置: +
X-Accel-Redirect
X-Accel-Expires
X-Accel-Limit-Rate
(1.1.6),
X-Accel-Buffering
(1.1.6), +
X-Accel-Charset
(1.1.6),
Expires
Cache-Control
,和
Set-Cookie
(0.8.44)。 +
+ + +如果不被取消,这些头部的处理可能产生下面结果: + + + +
X-Accel-Expires
Expires
Cache-Control
,和
Set-Cookie
+设置响应缓存的参数; +
+ + +
X-Accel-Redirect
执行到指定URI的内部跳转; +
+ + +
X-Accel-Limit-Rate
设置响应到客户端的传输速率限制; +
+ + +
X-Accel-Buffering
启动或者关闭响应缓冲; +
+ + +
X-Accel-Charset
设置响应所需的字符集。 +
+ +
+
+ +
+ + + +on | off +off +http +server +location + + +当后端服务器的响应状态码大于等于400时,决定是否直接将响应发送给客户端,亦或将响应转发给nginx由指令来处理。 + + + + + + +size +1024m +http +server +location + + +打开响应缓冲以后,如果整个响应不能存放在指令设置的缓冲区内,部分响应可以存放在临时文件中。 +这条指令可以设置临时文件的最大容量。而每次写入临时文件的数据量则由指令定义。 + + + +将此值设置为0将禁止响应写入临时文件。 + + + + + + + + error | + timeout | + invalid_header | + http_500 | + http_502 | + http_503 | + http_504 | + http_404 | + off + ... +error timeout +http +server +location + + +指定在何种情况下一个失败的请求应该被发送到下一台后端服务器: + + +error +和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误; + +timeout +和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现超时; + +invalid_header +后端服务器返回空响应或者非法响应头; + +http_500 +后端服务器返回的响应状态码为500; + +http_502 +后端服务器返回的响应状态码为502; + +http_503 +后端服务器返回的响应状态码为503; + +http_504 +后端服务器返回的响应状态码为504; + +http_404 +后端服务器返回的响应状态码为404; + +off +停止将请求发送给下一台后端服务器。 + + + + + +需要理解一点的是,只有在没有向客户端发送任何数据以前,将请求转给下一台后端服务器才是可行的。也就是说,如果在传输响应到客户端时出现错误或者超时,这类错误是不可能恢复的。 + + + + + + +string ... + +http +server +location + + +定义nginx不将响应写入缓存的条件。如果至少一个字符串条件非空而且非“0”,nginx就不将响应存入缓存: + +proxy_no_cache $cookie_nocache $arg_nocache$arg_comment; +proxy_no_cache $http_pragma $http_authorization; + +这条指令可以和指令一起使用。 + + + + + + +URL + +location +if in location +limit_except + + +设置后端服务器的协议和地址,还可以设置可选的URI以定义本地路径和后端服务器的映射关系。 +这条指令可以设置的协议是“http”或者“https”,而地址既可以使用域名或者IP地址加端口(可选)的形式来定义: + +proxy_pass http://localhost:8000/uri/; + +又可以使用UNIX域套接字路径来定义。该路径接在“unix”字符串后面,两端由冒号所包围,比如: + +proxy_pass http://unix:/tmp/backend.socket:/uri/; + + + + +如果解析一个域名得到多个地址,所有的地址都会以轮转的方式被使用。当然,也可以使用服务器组来定义地址。 + + + +请求URI按下面规则传送给后端服务器: + + + +如果proxy_pass使用了URI,当传送请求到后端服务器时,规范化以后的请求路径与配置中的路径的匹配部分将被替换为指令中定义的URI: + +location /name/ { + proxy_pass http://127.0.0.1/remote/; +} + + + + +如果proxy_pass没有使用URI,传送到后端服务器的请求URI一般客户端发起的原始URI,如果nginx改变了请求URI,则传送的URI是nginx改变以后完整的规范化URI: + +location /some/path/ { + proxy_pass http://127.0.0.1; +} + + +在1.1.12版以前,如果proxy_pass没有使用URI,某些情况下,nginx改变URI以后,会错误地将原始URI而不是改变以后的URI发送到后端服务器。 + + + + + + +某些情况下,无法确定请求URI中应该被替换的部分: + + + +使用正则表达式定义路径。 + +这种情况下,指令不应该使用URI。 + + + + +在需要代理的路径中,使用指令改变了URI,但仍使用相同配置处理请求(break): + +location /name/ { + rewrite /name/([^/]+) /users?name=$1 break; + proxy_pass http://127.0.0.1; +} + + +这种情况下,本指令设置的URI会被忽略,改变后的URI将被发送给后端服务器。 + + + + + + +后端服务器的地址,端口和URI中都可以使用变量: + +proxy_pass http://$host$uri; + +甚至像这样: + +proxy_pass $request; + + + + +这种情况下,后端服务器的地址将会在定义的服务器组中查找。如果查找不到,nginx使用来查找该地址。 + + + + + + +field + +http +server +location + + +允许传送被屏蔽的后端服务器响应头到客户端。 + + + + + + +time +60s +http +server +location + + +定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。 + + + + + + +default +off +redirect replacement +default +http +server +location + + +设置后端服务器
Location
响应头和
Refresh
响应头的替换文本。 +假设后端服务器返回的响应头是 +“Location: http://localhost:8000/two/some/uri/”,那么指令 + +proxy_redirect http://localhost:8000/two/ http://frontend/one/; + +将把字符串改写为 +“Location: http://frontend/one/some/uri/”。 +
+ + +replacement字符串可以省略服务器名: + +proxy_redirect http://localhost:8000/two/ /; + +此时将使用代理服务器的主域名和端口号来替换。如果端口是80,可以不加。 + + + +用default参数指定的默认替换使用了指令的参数。因此,下面两例配置等价: + +location /one/ { + proxy_pass http://upstream:port/two/; + proxy_redirect default; + + + +location /one/ { + proxy_pass http://upstream:port/two/; + proxy_redirect http://upstream:port/two/ /one/; + +而且因为同样的原因,指令使用变量时,不允许本指令使用default参数。 + + + +replacement字符串可以包含变量: + +proxy_redirect http://localhost:8000/ http://$host:$server_port/; + + + + +而redirect字符串从1.1.11版本开始也可以包含变量: + +proxy_redirect http://$proxy_host:8000/ /; + + + + +同时,从1.1.11版本开始,指令支持正则表达式。使用正则表达式的话,如果是大小写敏感的匹配,redirect以“~”作为开始,如果是大小写不敏感的匹配,redirect以“~*”作为开始。而且redirect的正则表达式中可以包含命名匹配组和位置匹配组,而在replacement中可以引用这些匹配组的值: + +proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2; +proxy_redirect ~*/user/([^/]+)/(.+)$ http://$1.example.com/$2; + + + + +除此以外,可以同时定义多个proxy_redirect指令: + +proxy_redirect default; +proxy_redirect http://localhost:8000/ /; +proxy_redirect http://www.example.com/ /; + + + + +另外,off参数可以使所有相同配置级别的proxy_redirect指令无效: + +proxy_redirect off; +proxy_redirect default; +proxy_redirect http://localhost:8000/ /; +proxy_redirect http://www.example.com/ /; + + + + +最后,使用这条指令也可以为地址为相对地址的重定向添加域名: + +proxy_redirect / /; + + + +
+ + + +time +60s +http +server +location + + +定义向后端服务器传输请求的超时。此超时是指相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的最长时间。如果后端服务器在超时时间段内没有接收到任何数据,连接将被关闭。 + + + + + + +field value +Host $proxy_host +Connection close +http +server +location + + +允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。 +当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 +默认情况下,只有两个请求头会被重新定义: + +proxy_set_header Host $proxy_host; +proxy_set_header Connection close; + + + + +如果不想改变请求头
Host
的值,可以这样来设置: + +proxy_set_header Host $http_host; + +
+ + +但是,如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。 +这种情况下,更好的方式是使用$host变量——它的值在请求包含
Host
请求头时为
Host
字段的值,在请求未携带
Host
请求头时为虚拟主机的主域名: + +proxy_set_header Host $host; + +
+ + +此外,服务器名可以和后端服务器的端口一起传送: + +proxy_set_header Host $host:$proxy_port; + + + + +如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器: + +proxy_set_header Accept-Encoding ""; + + + +
+ + + +on | off +on +http +server +location + + +决定是否重用与后端服务器的SSL会话。如果日志中出现“SSL3_GET_FINISHED:digest check failed”错误,请尝试关闭会话重用。 + + + + + + + + on | + off | + string +off +http +server +location + + +开启将文件保存到磁盘上的功能。如果设置为on,nginx将文件保存在指令或指令设置的路径中。如果设置为off,nginx将关闭文件保存的功能。此外,保存的文件名也可以使用含变量的string参数来指定: + +proxy_store /data/www$original_uri; + + + + +保存文件的修改时间根据接收到的
Last-Modified
响应头来设置。响应都是先写到临时文件,然后进行重命名来生成的。从0.8.9版本开始,临时文件和持久化存储可以放在不同的文件系统,但是需要注意这时文件执行的是在两个文件系统间拷贝操作,而不是廉价的重命名操作。因此建议保存文件的路径和指令设置的临时文件的路径在同一个文件系统中。 +
+ + +这条指令可以用于创建静态无更改文件的本地拷贝,比如: + +location /images/ { + root /data/www; + open_file_cache_errors off; + error_page 404 = /fetch$uri; +} + +location /fetch/ { + internal; + + proxy_pass http://backend/; + proxy_store on; + proxy_store_access user:rw group:rw all:r; + proxy_temp_path /data/temp; + + alias /data/www/; +} + + + + +或者像这样: + +location /images/ { + root /data/www; + error_page 404 = @fetch; +} + +location @fetch { + internal; + + proxy_pass http://backend; + proxy_store on; + proxy_store_access user:rw group:rw all:r; + proxy_temp_path /data/temp; + + root /data/www; +} + + + +
+ + + +users:permissions ... +user:rw +http +server +location + + +设置新创建的文件和目录的访问权限,比如: + +proxy_store_access user:rw group:rw all:r; + + + + +如果指定了任何group或者all的访问权限,那么可以略去user的访问权限: + +proxy_store_access group:rw all:r; + + + + + + + +size +8k|16k +http +server +location + + +在开启缓冲后端服务器响应到临时文件的功能后,设置nginx每次写数据到临时文件的size(大小)限制。 +size的默认值是指令和指令定义的每块缓冲区大小的两倍, +而临时文件最大容量由指令设置。 + + + + + + + + path + [level1 + [level2 + [level3]]] +proxy_temp +http +server +location + + +定义从后端服务器接收的临时文件的存放路径,可以为临时文件路径定义至多三层子目录的目录树。 +比如,下面配置 + +proxy_temp_path /spool/nginx/proxy_temp 1 2; + +那么临时文件的路径看起来会是这样: + +/spool/nginx/proxy_temp/7/45/00000123457 + + + + + +
+ + +
+ + +ngx_http_proxy_module支持内嵌变量,可以用于在指令中构造请求头: + + +$proxy_host +后端服务器的主机名和端口; + +$proxy_port +后端服务器的端口; + +$proxy_add_x_forwarded_for +$remote_addr变量值添加在客户端
X-Forwarded-For
请求头的后面,并以逗号分隔。 +如果客户端请求未携带
X-Forwarded-For
请求头,$proxy_add_x_forwarded_for变量值将与$remote_addr变量相同。
+
+
+ +
+ +
diff --git a/xml/cn/docs/http/ngx_http_random_index_module.xml b/xml/cn/docs/http/ngx_http_random_index_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_random_index_module.xml @@ -0,0 +1,62 @@ + + + + + + + + +
+ + +The module ngx_http_random_index_module picks a random +file in a directory as an index file. +It works before the +ngx_http_index_module +module. + + + +This module is not built by default, it should be enabled with the +--with-http_random_index_module +configuration parameter. + + +
+ + +
+ + + +location / { + random_index on; +} + + + +
+ + +
+ + +on | off +off +location + + +Enables or disables module processing in a surrounding location. + + + + +
+ +
diff --git a/xml/cn/docs/http/ngx_http_realip_module.xml b/xml/cn/docs/http/ngx_http_realip_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_realip_module.xml @@ -0,0 +1,112 @@ + + + + + + + + +
+ + +The ngx_http_realip_module module allows +to change the client address to the one sent in the specified header field. + + + +This module is not built by default, it should be enabled with the +--with-http_realip_module +configuration parameter. + + +
+ + +
+ + + +set_real_ip_from 192.168.1.0/24; +set_real_ip_from 192.168.2.1; +set_real_ip_from 2001:0db8::/32; +real_ip_header X-Forwarded-For; +real_ip_recursive on; + + + +
+ + +
+ + + + address | + CIDR | + unix: + +http +server +location + + +Defines trusted addresses that are known to send correct +replacement addresses. +If the special value unix: is specified, +all UNIX-domain sockets will be trusted. + +IPv6 addresses are supported starting from versions 1.3.0 and 1.2.1. + + + + + + + + + field | + X-Real-IP | + X-Forwarded-For +X-Real-IP +http +server +location + + +Defines a request header field used to send +the address for a replacement. + + + + + + +on | off +off +http +server +location +1.3.0 +1.2.1 + + +If recursive search is disabled, an original client address that +matches one of the trusted addresses is replaced by the last +address sent in the request header field defined by the + directive. +If recursive search is enabled, an original client address that +matches one of the trusted addresses is replaced by the last +non-trusted address sent in the request header field. + + + + +
+ +
diff --git a/xml/cn/docs/http/ngx_http_referer_module.xml b/xml/cn/docs/http/ngx_http_referer_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_referer_module.xml @@ -0,0 +1,141 @@ + + + + + + + + +
+ + +ngx_http_referer_module模块允许拦截
Referer
请求头中含有非法值的请求,阻止它们访问站点。 +需要注意的是伪造一个有效的
Referer
请求头是相当容易的, +因此这个模块的预期目的不在于彻底地阻止这些非法请求,而是为了阻止由正常浏览器发出的大规模此类请求。 +还有一点需要注意,即使正常浏览器发送的合法请求,也可能没有
Referer
请求头。 +
+ +
+ + +
+ + + +valid_referers none blocked server_names + *.example.com example.* www.example.org/galleries/ + ~\.google\.; + +if ($invalid_referer) { + return 403; +} + + + +
+ + +
+ + +size +64 +server +location +1.0.5 + + +设置用来存储有效referer的哈希表的表项长度。 +详细的情况参见哈希表设置。 + + + + + + +size +2048 +server +location +1.0.5 + + +设置用来存储有效referer的哈希表最大桶容量。 +详细的情况参见哈希表设置。 + + + + + + + + none | + blocked | + server_names | + string + ... + +server +location + + +
Referer
请求头为指定值时,内嵌变量$invalid_referer被设置为空字符串, +否则这个变量会被置成“1”。查找匹配时不区分大小写。 +
+ + +该指令的参数可以为下面的内容: + + +none + +缺少
Referer
请求头; +
+ +blocked + +
Referer
请求头存在,但是它的值被防火墙或者代理服务器删除; +这些值都不以“http://” 或者 “https://”字符串作为开头; +
+ +server_names + +
Referer
请求头包含某个虚拟主机名; +
+ +任意字符串 + +定义一个服务器名和可选的URI前缀。服务器名允许在开头或结尾使用“*”符号。 +当nginx检查时,
Referer
请求头里的服务器端口将被忽略。 +
+ +正则表达式 + +必须以“~”符号作为开头。 +需要注意的是表达式会从“http://”或者“https://”之后的文本开始匹配。 + + +
+
+ + +实例: + +valid_referers none blocked server_names + *.example.com example.* www.example.org/galleries/ + ~\.google\.; + + + +
+ +
+ +
diff --git a/xml/cn/docs/http/ngx_http_rewrite_module.xml b/xml/cn/docs/http/ngx_http_rewrite_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_rewrite_module.xml @@ -0,0 +1,374 @@ + + + + + + + + +
+ + +ngx_http_rewrite_module模块允许正则替换URI,返回页面重定向,和按条件选择配置。 + + + +ngx_http_rewrite_module模块指令按以下顺序处理: + + + +处理在级别中定义的模块指令; + + + +为请求查找location; + + + +处理在选中的中定义的模块指令。如果指令改变了URI,按新的URI查找location。这个循环至多重复10次,之后nginx返回错误。 + + + + + +
+ + +
+ + + + +server +location +if + + +停止处理当前这一轮的ngx_http_rewrite_module指令集。 + + + +举例: + +if ($slow) { + limit_rate 10k; + break; +} + + + + + + + +(condition) + +server +location + + +计算指定的condition的值。如果为真,执行定义在大括号中的rewrite模块指令,并将if指令中的配置指定给请求。if指令会从上一层配置中继承配置。 + + + +条件可以是下列任意一种: + + + +变量名;如果变量值为空或者是以“0”开始的字符串,则条件为假; + + + +使用“=”和“!=”运算符比较变量和字符串; + + + +使用“~”(大小写敏感)和“~*”(大小写不敏感)运算符匹配变量和正则表达式。正则表达式可以包含匹配组,匹配结果后续可以使用变量$1..$9引用。如果正则表达式中包含字符“}”或者“;”,整个表达式应该被包含在单引号或双引号的引用中。 + + + +使用“-f”和“!-f”运算符检查文件是否存在; + + + +使用“-d”和“!-d”运算符检查目录是否存在; + + + +使用“-e”和“!-e”运算符检查文件、目录或符号链接是否存在; + + + +使用“-x”和“!-x”运算符检查可执行文件; + + + + + + +举例: + +if ($http_user_agent ~ MSIE) { + rewrite ^(.*)$ /msie/$1 break; +} + +if ($http_cookie ~* "id=([^;]+)(?:;|$)") { + set $id $1; +} + +if ($request_method = POST) { + return 405; +} + +if ($slow) { + limit_rate 10k; +} + +if ($invalid_referer) { + return 403; +} + + +内嵌变量$invalid_referer的值是通过指令设置的。 + + + + + + + +code [text] +code URL +URL + +server +location +if + + +停止处理并返回指定code给客户端。返回非标准的状态码444可以直接关闭连接而不返回响应头。 + + + +从0.8.42版开始,可以在指令中指定重定向的URL(状态码为301、302、303和307),或者指定响应体文本(状态码为其它值)。响应体文本或重定向URL中可以包含变量。作为一种特殊情况,重定向URL可以简化为当前server的本地URI,那么完整的重定向URL将按照请求协议($scheme)、指令和指令的配置进行补全。 + + + +另外,状态码为302的临时重定向使用的URL可以作为指令的唯一参数。该参数应该以“http://”、“https://”或者“https://”开始。URL中可以包含变量。 + + + + +0.7.51版本以前只能返回下面状态码: +204、400、402 — 406、408、410、411、413、416 和 500 — 504。 + + + +直到1.1.16和1.0.13版,状态码307才被认为是一种重定向。 + + + + + + + + + regex + replacement + [flag] + +server +location +if + + +如果指定的正则表达式能匹配URI,此URI将被replacement参数定义的字符串改写。rewrite指令按其在配置文件中出现的顺序执行。flag可以终止后续指令的执行。如果replacement的字符串以“http://”或“https://”开头,nginx将结束执行过程,并返回给客户端一个重定向。 + + + +可选的flag参数可以是其中之一: + + +last + +停止执行当前这一轮的ngx_http_rewrite_module指令集,然后查找匹配改变后URI的新location; + + +break + +停止执行当前这一轮的ngx_http_rewrite_module指令集; + + +redirect + +在replacement字符串未以“http://”或“https://”开头时,使用返回状态码为302的临时重定向; + + +permanent + +返回状态码为301的永久重定向。 + + + +完整的重定向URL将按照请求协议($scheme)、指令和指令的配置进行补全。 + + + +举例: + +server { + ... + rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; + rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; + return 403; + ... +} + + + + +但是当上述指令写在“/download/”的location中时,应使用标志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; +} + + + + +如果replacement字符串包括新的请求参数,以往的请求参数会添加到新参数后面。如果不希望这样,在replacement字符串末尾加一个问号“?”,就可以避免,比如: + +rewrite ^/users/(.*)$ /show?user=$1? last; + + + + +如果正则表达式中包含字符“}”或者“;”,整个表达式应该被包含在单引号或双引号的引用中。 + + + + + + +on | off +off +http +server +location +if + + +开启或者关闭将ngx_http_rewrite_module模块指令的处理日志以notice级别记录到错误日志中。 + + + + + + +variable value + +server +location +if + + +为指定变量variable设置变量值valuevalue可以包含文本、变量或者它们的组合。 + + + + + + +on | off +on +http +server +location +if + + +控制是否记录变量未初始化的警告到日志。 + + + + +
+ + +
+ + +ngx_http_rewrite_module模块的指令在解析配置阶段被编译成nginx内部指令。这些内部指令在处理请求时被解释执行。而解释器是一个简单的堆栈机器。 + + + +比如,下面指令 + +location /download/ { + if ($forbidden) { + return 403; + } + + if ($slow) { + limit_rate 10k; + } + + rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break; +} + +将被翻译成下面这些指令: + +variable $forbidden +check against zero + return 403 + end of code +variable $slow +check against zero +match of regular expression +copy "/" +copy $1 +copy "/mp3/" +copy $2 +copy ".mp3" +end of regular expression +end of code + + + + +请注意没有对应上面的指令的内部指令,因为这个指令与ngx_http_rewrite_module模块无关。nginx会为这个块单独创建一个配置,包含limit_rate等于10k。如果条件为真,nginx将把这个配置指派给请求。 + + + +指令 + +rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break; + +可以通过将正则表达式中的第一个斜线“/”放入圆括号,来实现节约一个内部指令: + +rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; + +对应的内部指令将会是这样: + +match of regular expression +copy $1 +copy "/mp3/" +copy $2 +copy ".mp3" +end of regular expression +end of code + + + +
+ +
diff --git a/xml/cn/docs/http/ngx_http_upstream_module.xml b/xml/cn/docs/http/ngx_http_upstream_module.xml new file mode 100644 --- /dev/null +++ b/xml/cn/docs/http/ngx_http_upstream_module.xml @@ -0,0 +1,366 @@ + + + + + + + + +
+ + +ngx_http_upstream_module模块 +允许定义一组服务器。它们可以在指令、 +和 +中被引用到。 + + +
+ + +
+ + + +upstream backend { + server backend1.example.com weight=5; + server backend2.example.com:8080; + server unix:/tmp/backend3; + + server backup1.example.com:8080 backup; + server backup2.example.com:8080 backup; +} + +server { + location / { + proxy_pass http://backend; + } +} + + + +
+ + +
+ + +name + +http + + +定义一组服务器。 +这些服务器可以监听不同的端口。 +而且,监听在TCP和UNIX域套接字的服务器可以混用。 + + + +例子: + +upstream backend { + server backend1.example.com weight=5; + server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; + server unix:/tmp/backend3; +} + + + + +默认情况下,nginx按加权轮转的方式将请求分发到各服务器。 +在上面的例子中,每7个请求会通过以下方式分发: +5个请求分到backend1.example.com, +一个请求分到第二个服务器,一个请求分到第三个服务器。 +与服务器通信的时候,如果出现错误,请求会被传给下一个服务器,直到所有可用的服务器都被尝试过。 +如果所有服务器都返回失败,客户端将会得到最后通信的那个服务器的(失败)响应结果。 + + + + + + +address [parameters] + +upstream + + +定义服务器的地址address和其他参数parameters。 +地址可以是域名或者IP地址,端口是可选的,或者是指定“unix:”前缀的UNIX域套接字的路径。如果没有指定端口,就使用80端口。 +如果一个域名解析到多个IP,本质上是定义了多个server。 + + + +你可以定义下面的参数: + + +weight=number + +设定服务器的权重,默认是1。 + + +max_fails=number + +设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。在下一个fail_timeout时间段,服务器不会再被尝试。 +失败的尝试次数默认是1。设为0就会停止统计尝试次数,认为服务器是一直可用的。 +你可以通过指令、 +和 +来配置什么是失败的尝试。 +默认配置时,http_404状态不被认为是失败的尝试。 + + +fail_timeout=time + +设定 + + + +统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。 + + + +服务器被认为不可用的时间段。 + + + +默认情况下,该超时时间是10秒。 + + +backup + +标记为备用服务器。当主服务器不可用以后,请求会被传给这些服务器。 + + +down + +标记服务器永久不可用,可以跟指令一起使用。 + + + + + + +Example: + +upstream backend { + server backend1.example.com weight=5; + server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; + server unix:/tmp/backend3; + + server backup1.example.com:8080 backup; +} + + + + + + + + + +upstream + + +指定服务器组的负载均衡方法,请求基于客户端的IP地址在服务器间进行分发。 +IPv4地址的前三个字节或者IPv6的整个地址,会被用来作为一个散列key。 +这种方法可以确保从同一个客户端过来的请求,会被传给同一台服务器。除了当服务器被认为不可用的时候,这些客户端的请求会被传给其他服务器,而且很有可能也是同一台服务器。 + +从1.3.2和1.2.2版本开始支持IPv6地址。 + + + + +如果其中一个服务器想暂时移除,应该加上down参数。这样可以保留当前客户端IP地址散列分布。 + + + +例子: + +upstream backend { + ip_hash; + + server backend1.example.com; + server backend2.example.com; + server backend3.example.com down; + server backend4.example.com; +} + + + + + +从1.3.1和1.2.2版本开始,ip_hash的负载均衡方法才支持设置服务器权重值。 + + + + + + + +connections + +upstream +1.1.4 + + +激活对上游服务器的连接进行缓存。 + + + +connections参数设置每个worker进程与后端服务器保持连接的最大数量。这些保持的连接会被放入缓存。 +如果连接数大于这个值时,最久未使用的连接会被关闭。 + +需要注意的是,keepalive指令不会限制Nginx进程与上游服务器的连接总数。 +新的连接总会按需被创建。 +connections参数应该稍微设低一点,以便上游服务器也能处理额外新进来的连接。 + + + + +配置memcached上游服务器连接keepalive的例子: + +upstream memcached_backend { + server 127.0.0.1:11211; + server 10.0.0.2:11211; + + keepalive 32; +} + +server { + ... + + location /memcached/ { + set $memcached_key $uri; + memcached_pass memcached_backend; + } + +} + + + + +对于HTTP代理,指令应该设置为“1.1”,同时
Connection
头的值也应被清空。 + +upstream http_backend { + server 127.0.0.1:8080; + + keepalive 16; +} + +server { + ... + + location /http/ { + proxy_pass http://http_backend; + proxy_http_version 1.1; + proxy_set_header Connection ""; + ... + } +} + +
+ + + +另外一种选择是,HTTP/1.0协议的持久连接也可以通过发送
Connection: Keep-Alive
头来实现。不过不建议这样用。 +
+
+ + +对于FastCGI的服务器,需要设置 + +指令来让连接keepalive工作: + +upstream fastcgi_backend { + server 127.0.0.1:9000; + + keepalive 8; +} + +server { + ... + + location /fastcgi/ { + fastcgi_pass fastcgi_backend; + fastcgi_keep_conn on; + ... + } +} + + + + + +当使用的负载均衡方法不是默认的轮转法时,必须在keepalive 指令之前配置。 + + + +针对SCGI和uwsgi协议,还没有实现其keepalive连接的打算。 + + + +
+ + + + + +upstream +1.3.1 +1.2.2 + + +指定服务器组的负载均衡方法,根据其权重值,将请求发送到活跃连接数最少的那台服务器。 +如果这样的服务器有多台,那就采取有权重的轮转法进行尝试。 + + + + +
+ + +
+ + +ngx_http_upstream_module模块支持以下嵌入变量: + + + +$upstream_addr + +保存服务器的IP地址和端口或者是UNIX域套接字的路径。 +在请求处理过程中,如果有多台服务器被尝试了,它们的地址会被拼接起来,以逗号隔开,比如: +“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”。 +如果在服务器之间通过
X-Accel-Redirect
头或者有内部跳转,那么这些服务器组之间会以冒号隔开,比如:“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”。 +
+ +$upstream_response_time + +以毫秒的精度保留服务器的响应时间,(输出)单位是秒。 +出现多个响应时,也是以逗号和冒号隔开。 + + +$upstream_status + +保存服务器的响应代码。 +出现多个响应时,也是以逗号和冒号隔开。 + + +$upstream_http_... + +保存服务器的响应头的值。比如
Server
响应头的值可以通过$upstream_http_server变量来获取。 +需要注意的是只有最后一个响应的头会被保留下来。 +
+ +
+
+ +
+ +
diff --git a/xml/cn/docs/index.xml b/xml/cn/docs/index.xml --- a/xml/cn/docs/index.xml +++ b/xml/cn/docs/index.xml @@ -8,7 +8,7 @@
@@ -93,11 +93,36 @@ ngx_http_browser_module + +ngx_http_core_module + + + + +ngx_http_empty_gif_module + + + + +ngx_http_geo_module + + + + +ngx_http_geoip_module + + + ngx_http_gzip_static_module + +ngx_http_image_filter_module + + + ngx_http_index_module @@ -107,6 +132,41 @@ ngx_http_index_module ngx_http_limit_conn_module + + +ngx_http_limit_req_module + + + + +ngx_http_log_module + + + + +ngx_http_map_module + + + + +ngx_http_proxy_module + + + + +ngx_http_referer_module + + + + +ngx_http_rewrite_module + + + + +ngx_http_upstream_module + +