Mercurial > hg > nginx-site
changeset 720:9934338f83af
Updated the Chinese documentation.
line wrap: on
line diff
--- a/xml/cn/GNUmakefile Thu Oct 11 08:19:38 2012 +0000 +++ b/xml/cn/GNUmakefile Thu Oct 11 10:23:05 2012 +0000 @@ -3,6 +3,8 @@ DOCS = \ faq \ windows \ + syntax \ + dirindex \ http/request_processing \ http/server_names \ http/configuring_https_servers \ @@ -19,14 +21,39 @@ FAQ_XML = $(foreach name, $(FAQ), xml/$(DOC_LANG)/docs/$(name).xml) FAQ_HTML = $(foreach name, $(FAQ), $(OUT)/$(DOC_LANG)/docs/$(name).html) +REFS = \ + http/ngx_http_access_module \ + http/ngx_http_addition_module \ + http/ngx_http_auth_basic_module \ + http/ngx_http_autoindex_module \ + http/ngx_http_browser_module \ + http/ngx_http_gzip_static_module \ + http/ngx_http_index_module \ + http/ngx_http_limit_conn_module \ + +REFS_XML = $(foreach name, $(REFS), xml/$(DOC_LANG)/docs/$(name).xml) +REFS_HTML = $(foreach name, $(REFS), $(OUT)/$(DOC_LANG)/docs/$(name).html) + $(DOC_LANG): \ $(OUT)/$(DOC_LANG)/index.html \ $(OUT)/$(DOC_LANG)/docs/index.html \ $(DOCS_HTML) \ + $(REFS_HTML) \ $(FAQ_HTML) \ $(OUT)/$(DOC_LANG)/docs/index.html: \ $(DOCS_XML) \ + $(REFS_XML) \ + +xml/$(DOC_LANG)/docs/dirindex.xml: \ + $(REFS_XML) \ + xslt/dirindex.xslt + echo "<modules>$(patsubst %, \ + <module name=\"%\"/>, $(filter %.xml,$^))</modules>" | \ + xsltproc -o - \ + --stringparam LANG $(patsubst xml/%/docs/dirindex.xml,%,$@) \ + xslt/dirindex.xslt - | \ + sed 's;xml/[^/]*/docs/;;g' > $@ $(OUT)/$(DOC_LANG)/docs/faq.html: \ $(FAQ_XML) \
--- a/xml/cn/docs/debugging_log.xml Thu Oct 11 08:19:38 2012 +0000 +++ b/xml/cn/docs/debugging_log.xml Thu Oct 11 10:23:05 2012 +0000 @@ -1,8 +1,14 @@ -<!DOCTYPE article SYSTEM "../../../dtd/article.dtd"> +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE article SYSTEM "../../../dtd/article.dtd"> <article name="调试日志" link="/cn/docs/debugging_log.html" - lang="cn"> + lang="cn" + rev="1"> <section> @@ -24,7 +30,7 @@ </para> <para> -注意,在其他级别定义日志,如在<i>server</i>层次,会关闭该主机的日志: +注意,重新定义错误日志时,如过没有指定<literal>debug</literal>级别,调试日志会被屏蔽。下面的例子里,在<link doc="http/ngx_http_core_module.xml" id="server"/>层中重新定义的日志就屏蔽了这个虚拟主机的调试日志: <programlisting> error_log /path/to/log debug; @@ -33,7 +39,7 @@ error_log /path/to/log; ... </programlisting> -应该注释掉这条server日志,或者也增加<literal>debug</literal>标志: +为了避免这个问题,注释这行重新定义日志的配置,或者也给日志指定<literal>debug</literal>级别: <programlisting> error_log /path/to/log debug; @@ -45,7 +51,7 @@ </para> <para> -另外,也可以只针对某些地址开启调试日志: +另外,也可以只针对<link doc="ngx_core_module.xml" id="debug_connection">选定的客户端地址</link>开启调试日志: <programlisting> error_log /path/to/log;
--- a/xml/cn/docs/http/configuring_https_servers.xml Thu Oct 11 08:19:38 2012 +0000 +++ b/xml/cn/docs/http/configuring_https_servers.xml Thu Oct 11 10:23:05 2012 +0000 @@ -1,8 +1,15 @@ -<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd"> +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd"> <article name="配置HTTPS服务器" link="/cn/docs/http/configuring_https_servers.html" lang="cn" + rev="3" + translator="cfsego" author="Igor Sysoev" editor="Brian Mercer"> @@ -13,32 +20,29 @@ <programlisting> server { - listen 443; - server_name www.nginx.com; - ssl on; - ssl_certificate www.nginx.com.crt; - ssl_certificate_key www.nginx.com.key; - ssl_protocols SSLv3 TLSv1; - ssl_ciphers HIGH:!aNULL:!MD5; + listen 443; + server_name www.example.com; + ssl <b>on</b>; + ssl_certificate <b>www.example.com.crt</b>; + ssl_certificate_key <b>www.example.com.key</b>; + ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers HIGH:!aNULL:!MD5; ... } </programlisting> -服务器证书是公开的,会被传送到所有连接到服务器的客户端。而私钥不是公开的,需要存放在访问受限的文件中,当然,nginx主进程必须有读取密钥的权限。还有一种情况,私钥和证书存放在同一个文件中: - +服务器证书是公开的,会被传送到每一个连接到服务器的客户端。而私钥不是公开的,需要存放在访问受限的文件中,当然,nginx主进程必须有读取密钥的权限。私钥和证书可以存放在同一个文件中: <programlisting> - ssl_certificate www.nginx.com.cert; - ssl_certificate_key www.nginx.com.cert; + ssl_certificate www.example.com.cert; + ssl_certificate_key www.example.com.cert; </programlisting> - 这种情况下,证书文件同样得设置访问限制。当然,虽然证书和密钥存放在同一个文件,只有证书会发送给客户端,密钥不会发送。 </para> <para> - -<literal>ssl_protocols</literal>和<literal>ssl_ciphers</literal>指令可以用来强制用户连接只能引入SSL/TLS那些强壮的协议版本和强大的加密算法。从1.0.5版本开始,nginx默认使用<literal>ssl_protocols SSLv3 TLSv1</literal>和<literal>ssl_ciphers HIGH:!aNULL:!MD5</literal>,所以只有在之前的版本,明确地配置它们才是有意义的。 +<link doc="ngx_http_ssl_module.xml" id="ssl_protocols"/>和<link doc="ngx_http_ssl_module.xml" id="ssl_ciphers"/>指令可以用来强制用户连接只能引入SSL/TLS那些强壮的协议版本和强大的加密算法。从1.0.5版本开始,nginx默认使用“<literal>ssl_protocols SSLv3 TLSv1</literal>”和“<literal>ssl_ciphers HIGH:!aNULL:!MD5</literal>”,所以只有在之前的版本,明确地配置它们才是有意义的。从1.1.13和1.0.12版本开始,nginx默认使用“<literal>ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2</literal>”。 </para> <para> @@ -56,7 +60,7 @@ <section id="optimization" name="HTTPS服务器优化"> <para> -SSL操作需要消耗CPU资源,所以在多处理器的系统,需要启动多个工作进程,而且数量需要不少于可用CPU的个数。最消耗CPU资源的SSL操作是SSL握手,有两种方法可以将每个客户端的握手操作数量降到最低:第一种是保持客户端长连接,在一个SSL连接发送多个请求,第二种是在并发的连接或者后续的连接中重用SSL会话参数,这样可以避免SSL握手的操作。会话缓存用于保存SSL会话,这些缓存在工作进程间共享,可以使用<literal>ssl_session_cache</literal>指令进行配置。1M缓存可以存放大约4000个会话。默认的缓存超时是5分钟,可以使用<literal>ssl_session_timeout</literal>来修改。下面是一个针对4核系统的配置优化的例子,使用10M的共享会话缓存: +SSL操作需要消耗CPU资源,所以在多处理器的系统,需要启动多个工作进程,而且数量需要不少于可用CPU的个数。最消耗CPU资源的SSL操作是SSL握手,有两种方法可以将每个客户端的握手操作数量降到最低:第一种是保持客户端长连接,在一个SSL连接发送多个请求,第二种是在并发的连接或者后续的连接中重用SSL会话参数,这样可以避免SSL握手的操作。会话缓存用于保存SSL会话,这些缓存在工作进程间共享,可以使用<link doc="ngx_http_ssl_module.xml" id="ssl_session_cache"/>指令进行配置。1M缓存可以存放大约4000个会话。默认的缓存超时是5分钟,可以使用<link doc="ngx_http_ssl_module.xml" id="ssl_session_timeout"/>加大它。下面是一个针对4核系统的配置优化的例子,使用10M的共享会话缓存: <programlisting> <b>worker_processes 4</b>; @@ -66,15 +70,15 @@ <b>ssl_session_timeout 10m</b>; server { - listen 443; - server_name www.nginx.com; - <b>keepalive_timeout 70</b>; + listen 443; + server_name www.example.com; + <b>keepalive_timeout 70</b>; - ssl on; - ssl_certificate www.nginx.com.crt; - ssl_certificate_key www.nginx.com.key; - ssl_protocols SSLv3 TLSv1; - ssl_ciphers HIGH:!aNULL:!MD5; + ssl on; + ssl_certificate www.example.com.crt; + ssl_certificate_key www.example.com.key; + ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers HIGH:!aNULL:!MD5; ... </programlisting> </para> @@ -88,18 +92,18 @@ 有些浏览器不接受那些众所周知的证书认证机构签署的证书,而另外一些浏览器却接受它们。这是由于证书签发使用了一些中间认证机构,这些中间机构被众所周知的证书认证机构授权代为签发证书,但是它们自己却不被广泛认知,所以有些客户端不予识别。针对这种情况,证书认证机构提供一个证书链的包裹,用来声明众所周知的认证机构和自己的关系,需要将这个证书链包裹与服务器证书合并成一个文件。在这个文件里,服务器证书需要出现在认证方证书链的前面: <programlisting> -$ cat www.nginx.com.crt bundle.crt > www.nginx.com.chained.crt +$ cat www.example.com.crt bundle.crt > www.example.com.chained.crt </programlisting> -这个文件需要使用<literal>ssl_certificate</literal>指令来引用: +这个文件需要使用<link doc="ngx_http_ssl_module.xml" id="ssl_certificate"/>指令来引用: <programlisting> server { - listen 443; - server_name www.nginx.com; - ssl on; - ssl_certificate www.nginx.com.chained.crt; - ssl_certificate_key www.nginx.com.key; + listen 443; + server_name www.example.com; + ssl on; + ssl_certificate www.example.com.chained.crt; + ssl_certificate_key www.example.com.key; ... } </programlisting> @@ -107,7 +111,7 @@ 如果服务器证书和认证方证书链合并时顺序弄错了,nginx就不能正常启动,而且会显示下面的错误信息: <programlisting> -SSL_CTX_use_PrivateKey_file(" ... /www.nginx.com.key") failed +SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed (SSL: error:0B080074:x509 certificate routines: X509_check_private_key:key values mismatch) </programlisting> @@ -143,27 +147,28 @@ ... </programlisting> -在这个例子中,www.GoDaddy.com的服务器证书(#0)的受签者(“s”)是被签发机构(“i”)签名的,而这个签发机构又是证书(#1)的受签者,接着证书(#1)的签发机构又是证书(#2)的受签者,最后证书(#2)是被众所周知的签发机构ValiCert, Inc签发。ValiCert, Inc的证书内嵌在浏览器中,被浏览器自动识别。 +在这个例子中,www.GoDaddy.com的服务器证书(#0)的受签者(“s”)是被签发机构(“i”)签名的,而这个签发机构又是证书(#1)的受签者,接着证书(#1)的签发机构又是证书(#2)的受签者,最后证书(#2)是被众所周知的签发机构ValiCert, Inc签发。ValiCert, Inc的证书内嵌在浏览器中,被浏览器自动识别(这段话神似英国诗《在Jack盖的房子里》里面的内容)。 </para> <para> -如果没有加入认证方证书链,那只能看到服务器证书(#0)。 +如果没有加入认证方证书链,就只会显示服务器证书(#0)。 </para> </section> -<section id="single_http_https_server" name="统一的HTTP/HTTPS主机"> +<section id="single_http_https_server" name="合并HTTP/HTTPS主机"> <para> -从开始就将HTTP主机和HTTPS主机分开配置是很好一个很好的实践。虽然它们的功能现在看来是一样的,但是这个情况将来可能会有很大变化,那么合在一起的配置就有问题了。如果HTTP和HTTPS主机配置相同,而又不考虑将来重写配置的话,可以用一个主机配置统一处理HTTP和HTTPS请求。方法是删除<literal>ssl on</literal>的配置项,并在*:443端口添加参数<literal>ssl</literal>: +如果HTTP和HTTPS虚拟主机的功能是一致的,可以配置一个虚拟主机,既处理HTTP请求,又处理HTTPS请求。 +配置的方法是删除<literal>ssl on</literal>的指令,并在*:443端口添加参数<literal>ssl</literal>: <programlisting> server { - listen 80; - listen 443 ssl; - server_name www.nginx.com; - ssl_certificate www.nginx.com.crt; - ssl_certificate_key www.nginx.com.key; + listen 80; + listen 443 ssl; + server_name www.example.com; + ssl_certificate www.example.com.crt; + ssl_certificate_key www.example.com.key; ... } </programlisting> @@ -171,7 +176,7 @@ <note> 在0.8.21版本以前,只有添加了<literal>default</literal>参数的监听端口才能添加<literal>ssl</literal>参数: <programlisting> -listen 443 default ssl; +listen 443 default ssl; </programlisting> </note> </para> @@ -182,27 +187,27 @@ <section id="name_based_https_servers" name="基于名字的HTTPS主机"> <para> -在同一个IP上配置多个HTTPS主机,会出现问题: +如果在同一个IP上配置多个HTTPS主机,会出现一个很普遍的问题: <programlisting> server { - listen 443; - server_name www.nginx.com; - ssl on; - ssl_certificate www.nginx.com.crt; + listen 443; + server_name www.example.com; + ssl on; + ssl_certificate www.example.com.crt; ... } server { - listen 443; - server_name www.nginx.org; - ssl on; - ssl_certificate www.nginx.org.crt; + listen 443; + server_name www.example.org; + ssl on; + ssl_certificate www.example.org.crt; ... } </programlisting> -使用上面的配置,不论浏览器请求哪个主机,都只会收到默认主机的证书,比方说就是<literal>www.nginx.com</literal>。这是由SSL协议本身的行为引起的。因为SSL规定在建立SSL连接以后,才能发送HTTP请求,所以nginx建立SSL连接时不知道所请求主机的名字,因此,它只会返回默认主机的证书。 +使用上面的配置,不论浏览器请求哪个主机,都只会收到默认主机<literal>www.example.com</literal>的证书。这是由SSL协议本身的行为引起的——先建立SSL连接,再发送HTTP请求,所以nginx建立SSL连接时不知道所请求主机的名字,因此,它只会返回默认主机的证书。 </para> <para> @@ -210,18 +215,18 @@ <programlisting> server { - listen 192.168.1.1:443; - server_name www.nginx.com; - ssl on; - ssl_certificate www.nginx.com.crt; + listen 192.168.1.1:443; + server_name www.example.com; + ssl on; + ssl_certificate www.example.com.crt; ... } server { - listen 192.168.1.2:443; - server_name www.nginx.org; - ssl on; - ssl_certificate www.nginx.org.crt; + listen 192.168.1.2:443; + server_name www.example.org; + ssl on; + ssl_certificate www.example.org.crt; ... } </programlisting> @@ -234,31 +239,31 @@ name="带有多个主机名的SSL证书"> <para> -也有其他一些方法可以实现多个HTTPS主机共享一个IP地址,但都有不足。其中一种方法是使用在“SubjectAltName”字段中存放多个名字的证书,比如<literal>www.nginx.com</literal>和<literal>www.nginx.org</literal>。这种方法的限制是“SubjectAltName”字段的长度。 +也有其他一些方法可以实现多个HTTPS主机共享一个IP地址,但都有不足。其中一种方法是使用在“SubjectAltName”字段中存放多个名字的证书,比如<literal>www.example.com</literal>和<literal>www.example.org</literal>。但是,“SubjectAltName”字段的长度有限制。 </para> <para> -另一种方式是使用主机名中含有通配符的证书,比如<literal>*.nginx.org</literal>。这个证书匹配<literal>www.nginx.org</literal>,但是不匹配<literal>nginx.org</literal>和<literal>www.sub.nginx.org</literal>。这两种方法可以结合在一起——使用在“SubjectAltName”字段中存放的多个名字的证书,这些名字既可以是确切的名字,也可以是通配符,比如<literal>nginx.org</literal>和<literal>*.nginx.org</literal>。 +另一种方式是使用主机名中含有通配符的证书,比如<literal>*.example.org</literal>。这个证书匹配<literal>www.example.org</literal>,但是不匹配<literal>example.org</literal>和<literal>www.sub.example.org</literal>。这两种方法可以结合在一起——使用在“SubjectAltName”字段中存放的多个名字的证书,这些名字既可以是确切的名字,也可以是通配符,比如<literal>example.org</literal>和<literal>*.example.org</literal>。 </para> <para> -最好将带有多个名字的证书和它的密钥文件配置在http配置块中,这样可以只保存一份内容拷贝,所有主机的配置都从中继承: +最好将带有多个名字的证书和它的密钥文件配置在<i>http</i>配置块中,这样可以只保存一份内容拷贝,所有主机的配置都从中继承: <programlisting> ssl_certificate common.crt; ssl_certificate_key common.key; server { - listen 443; - server_name www.nginx.com; - ssl on; + listen 443; + server_name www.example.com; + ssl on; ... } server { - listen 443; - server_name www.nginx.org; - ssl on; + listen 443; + server_name www.example.org; + ssl on; ... } </programlisting> @@ -270,9 +275,10 @@ <section id="sni" name="主机名指示"> <para> -在一个IP上运行多个HTTPS主机的更通用的方案是<link url="http://en.wikipedia.org/wiki/Server_Name_Indication">TLSv1.1 主机名指示扩展</link>(SNI,RFC3546),它允许浏览器和服务器进行SSL握手时,将请求的主机名传递服务器,因此服务器可以知道使用哪一个证书来服务这个连接。但SNI只得到有限的浏览器的支持。下面列举支持SNI的浏览器最低版本和平台信息: +在一个IP上运行多个HTTPS主机的更通用的方案是<link url="http://en.wikipedia.org/wiki/Server_Name_Indication">TLS主机名指示扩展</link>(SNI,RFC6066),它允许浏览器和服务器进行SSL握手时,将请求的主机名传递给服务器,因此服务器可以知道使用哪一个证书来服务这个连接。但SNI只得到有限的浏览器的支持。下面列举支持SNI的浏览器最低版本和平台信息: </para> +<para> <list type="bullet"> <listitem> @@ -296,6 +302,10 @@ </listitem> </list> +<note> +通过SNI只能传递域名,但是,当请求中包含可读的IP地址时,某些浏览器将服务器的IP地址作为服务器的名字进行了传送。这是一个错误,大家不应该依赖于这个。 +</note> +</para> <para> 为了在nginx中使用SNI,那么无论是在编译nginx时使用的OpenSSL类库,还是在运行nginx时使用的OpenSSL运行库,都必须支持SNI。从0.9.8f版本开始,OpenSSL通过<nobr>“--enable-tlsext”</nobr>配置选项加入SNI支持,从0.9.8j版本开始,此选项成为默认选项。当nginx被编译成支持SNI时,在使用“-V”选项运行时会显示如下信息: @@ -329,7 +339,7 @@ </listitem> <listitem> -从0.7.14版本开始,<literal>listen</literal>指令支持<literal>ssl</literal>参数。 +从0.7.14版本开始,<link doc="ngx_http_core_module.xml" id="listen"/>指令支持<literal>ssl</literal>参数。 </listitem> <listitem> @@ -347,7 +357,7 @@ <list type="bullet"> <listitem> -0.7.65、0.8.19及以后版本,默认SSL协议是SSLv3和TLSv1。 +0.7.65、0.8.19及以后版本,默认SSL协议是SSLv3、TLSv1、TLSc1.1和TLSv1.2(如果OpenSSL库支持)。 </listitem> <listitem>
--- a/xml/cn/docs/http/converting_rewrite_rules.xml Thu Oct 11 08:19:38 2012 +0000 +++ b/xml/cn/docs/http/converting_rewrite_rules.xml Thu Oct 11 10:23:05 2012 +0000 @@ -1,7 +1,13 @@ -<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd"> +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd"> <article name="转换rewrite规则" link="/cn/docs/http/converting_rewrite_rules.html" + rev="1" lang="cn"> @@ -11,8 +17,8 @@ 共享站点的管理员,习惯于<i>只</i>在Apache下使用.htaccess文件配置<i>所有</i>信息,通常会将下面规则 <programlisting> -RewriteCond %{HTTP_HOST} nginx.org -RewriteRule (.*) http://www.nginx.org$1 +RewriteCond %{HTTP_HOST} example.org +RewriteRule (.*) http://www.example.org$1 </programlisting> 翻译成这样: @@ -20,9 +26,9 @@ <programlisting> server { listen 80; - server_name www.nginx.org nginx.org; - if ($http_host = nginx.org) { - rewrite (.*) http://www.nginx.org$1; + server_name www.example.org example.org; + if ($http_host = example.org) { + rewrite (.*) http://www.example.org$1; } ... } @@ -30,18 +36,18 @@ </para> <para> -这种做法是错的,复杂而且低效。正确的方式是为<literal>nginx.org</literal>定义一个单独的服务器: +这种做法是错的,复杂而且低效。正确的方式是为<literal>example.org</literal>定义一个单独的服务器: <programlisting> server { listen 80; - server_name nginx.org; - return 301 http://www.nginx.org$request_uri; + server_name example.org; + return 301 http://www.example.org$request_uri; } server { listen 80; - server_name www.nginx.org; + server_name www.example.org; ... } </programlisting> @@ -49,7 +55,7 @@ <note> 在0.9.1版本(含)以前,可以这样实现重定向: <programlisting> - rewrite ^ http://www.nginx.org$request_uri?; + rewrite ^ http://www.example.org$request_uri?; </programlisting> </note> @@ -61,34 +67,34 @@ <section> <para> -再举一个例子,处理一个和刚才相反的逻辑:既不是来自<literal>nginx.com</literal>,又不是来自<literal>www.nginx.com</literal>: +再举一个例子,处理一个和刚才相反的逻辑:既不是来自<literal>example.com</literal>,又不是来自<literal>www.example.com</literal>: <programlisting> -RewriteCond %{HTTP_HOST} !nginx.com -RewriteCond %{HTTP_HOST} !www.nginx.com -RewriteRule (.*) http://www.nginx.com$1 +RewriteCond %{HTTP_HOST} !example.com +RewriteCond %{HTTP_HOST} !www.example.com +RewriteRule (.*) http://www.example.com$1 </programlisting> -应该按下面这样分开定义<literal>nginx.com</literal>、<literal>www.nginx.com</literal>和其他站点: +应该按下面这样分开定义<literal>example.com</literal>、<literal>www.example.com</literal>和其他站点: <programlisting> server { listen 80; - server_name nginx.com www.nginx.com; + server_name example.com www.example.com; ... } server { listen 80 default_server; server_name _; - return 301 http://nginx.com$request_uri; + return 301 http://example.com$request_uri; } </programlisting> <note> 在0.9.1版本(含)以前,可以这样实现重定向: <programlisting> - rewrite ^ http://nginx.com$request_uri?; + rewrite ^ http://example.com$request_uri?; </programlisting> </note>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/cn/docs/http/ngx_http_access_module.xml Thu Oct 11 10:23:05 2012 +0000 @@ -0,0 +1,99 @@ +<?xml version="1.0"?> + +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> + +<module name="ngx_http_access_module模块" + link="/cn/docs/http/ngx_http_access_module.html" + lang="cn" + translator="WenMing" + rev="1"> + +<section id="summary"> + +<para> +模块 <literal>ngx_http_access_module</literal> 允许限制某些IP地址的客户端访问。 +</para> + +<para> +也可以通过 +<link doc="ngx_http_auth_basic_module.xml">密码</link>来限制访问。 +使用 + <link doc="ngx_http_core_module.xml" id="satisfy"/> 指令就能同时通过IP地址和密码来限制访问。 +</para> + +</section> + + +<section id="example" name="配置范例"> + +<para> +<example> +location / { + deny 192.168.1.1; + allow 192.168.1.0/24; + allow 10.1.1.0/16; + allow 2001:0db8::/32; + deny all; +} +</example> +</para> + +<para> +规则按照顺序依次检测,直到匹配到第一条规则。 +在这个例子里,IPv4的网络中只有 +<literal>10.1.1.0/16</literal> 和 <literal>192.168.1.0/24</literal>允许访问,但 +<literal>192.168.1.1</literal>除外, +对于IPv6的网络,只有<literal>2001:0db8::/32</literal>允许访问。 +在规则很多的情况下,使用 +<link doc="ngx_http_geo_module.xml">ngx_http_geo_module</link> +模块变量更合适。 +</para> + +</section> + + +<section id="directives" name="指令"> + +<directive name="allow"> +<syntax> + <value>address</value> | + <value>CIDR</value> | + <literal>all</literal></syntax> +<default/> +<context>http</context> +<context>server</context> +<context>location</context> +<context>limit_except</context> + +<para> +允许指定的网络地址访问。 +</para> + +</directive> + + +<directive name="deny"> +<syntax> + <value>address</value> | + <value>CIDR</value> | + <literal>all</literal></syntax> +<default/> +<context>http</context> +<context>server</context> +<context>location</context> +<context>limit_except</context> + +<para> +拒绝指定的网络地址访问。 +</para> + +</directive> + +</section> + +</module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/cn/docs/http/ngx_http_addition_module.xml Thu Oct 11 10:23:05 2012 +0000 @@ -0,0 +1,83 @@ +<?xml version="1.0"?> + +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> + +<module name="ngx_http_addition_module模块" + link="/cn/docs/http/ngx_http_addition_module.html" + lang="cn" + translator="Weibin Yao" + rev="1"> + +<section id="summary"> + +<para> +<literal>ngx_http_addition_module</literal> 是一个过滤模块,它可以在回复正文前后加上内容。 +这个模块默认不会编译进去,若要开启需加上编译选项:<literal>--with-http_addition_module</literal>。 +</para> + +</section> + + +<section id="example" name="Example Configuration"> + +<para> +<example> +location / { + add_before_body /before_action; + add_after_body /after_action; +} +</example> +</para> + +</section> + + +<section id="directives" name="Directives"> + +<directive name="add_before_body"> +<syntax><value>uri</value></syntax> +<default/> +<context>location</context> + +<para> +在回复正文之前加入一段文字,nginx会发起一个子请求去获取这些文字。 +</para> + +</directive> + + +<directive name="add_after_body"> +<syntax><value>uri</value></syntax> +<default/> +<context>location</context> + +<para> +在回复正文之后加入一段文字,nginx会发起一个子请求去获取这些文字。 +</para> + +</directive> + + +<directive name="addition_types"> +<syntax><value>mime-type</value> ...</syntax> +<default>text/html</default> +<context>http</context> +<context>server</context> +<context>location</context> +<appeared-in>0.7.9</appeared-in> + +<para> +指定生效的回复MIME类型,默认始终包含“<literal>text/html</literal>”。 +如果设置类型为“<literal>*</literal>”,就会匹配任何类型的回复(0.8.29)。 +</para> + +</directive> + +</section> + +</module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/cn/docs/http/ngx_http_auth_basic_module.xml Thu Oct 11 10:23:05 2012 +0000 @@ -0,0 +1,92 @@ +<?xml version="1.0"?> + +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> + +<module name="ngx_http_auth_basic_module模块" + link="/cn/docs/http/ngx_http_auth_basic_module.html" + lang="cn" + translator="WenMing" + rev="1"> + +<section id="summary"> + +<para> +模块<literal>ngx_http_auth_basic_module</literal> 允许使用“HTTP基本认证”协议验证用户名和密码来限制对资源的访问。 +</para> + +<para> +也可以通过 +<link doc="ngx_http_auth_basic_module.xml">地址</link>来限制访问。 +使用<link doc="ngx_http_core_module.xml" id="satisfy"/> 指令就能同时通过地址和密码来限制访问。 +</para> + +</section> + + +<section id="example" name="配置范例"> + +<para> +<example> +location / { + auth_basic "closed site"; + auth_basic_user_file conf/htpasswd; +} +</example> +</para> + +</section> + + +<section id="directives" name="指令"> + +<directive name="auth_basic"> +<syntax><value>string</value> | <literal>off</literal></syntax> +<default>off</default> +<context>http</context> +<context>server</context> +<context>location</context> +<context>limit_except</context> + +<para> +开启使用“HTTP基本认证”协议的用户名密码验证。 +指定的参数被用作 <value>域</value>。 +参数<literal>off</literal>可以取消继承自上一个配置等级 +<literal>auth_basic</literal> 指令的影响。 +</para> + +</directive> + + +<directive name="auth_basic_user_file"> +<syntax><value>file</value></syntax> +<default/> +<context>http</context> +<context>server</context> +<context>location</context> +<context>limit_except</context> + +<para> +指定保存用户名和密码的文件,格式如下: +<example> +# comment +name1:password1 +name2:password2:comment +name3:password3 +</example> +</para> + +<para> +密码应该使用<c-func>crypt</c-func>函数加密。 +可以用Apache发行包中的<command>htpasswd</command>命令来创建此类文件。 +</para> + +</directive> + +</section> + +</module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/cn/docs/http/ngx_http_autoindex_module.xml Thu Oct 11 10:23:05 2012 +0000 @@ -0,0 +1,84 @@ +<?xml version="1.0"?> + +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> + +<module name="Module ngx_http_autoindex_module" + link="/cn/docs/http/ngx_http_autoindex_module.html" + lang="cn" + translator="Weibin Yao" + rev="1"> + +<section id="summary"> + +<para> +<literal>ngx_http_autoindex_module</literal> 模块可以列出目录中的文件。 +一般当<link doc="ngx_http_index_module.xml">ngx_http_index_module</link>模块找不到默认主页的时候,会把请求转给 <literal>ngx_http_autoindex_module</literal>模块去处理。 +</para> + +</section> + + +<section id="example" name="Example Configuration"> + +<para> +<example> +location / { + autoindex on; +} +</example> +</para> + +</section> + + +<section id="directives" name="Directives"> + +<directive name="autoindex"> +<syntax><literal>on</literal> | <literal>off</literal></syntax> +<default>off</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +开启或者关闭列出目录中文件的功能。 +</para> + +</directive> + + +<directive name="autoindex_exact_size"> +<syntax><literal>on</literal> | <literal>off</literal></syntax> +<default>on</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +设置目录中列出的文件是显示精确大小,还是对KB,MB,GB进行四舍五入。 +</para> + +</directive> + + +<directive name="autoindex_localtime"> +<syntax><literal>on</literal> | <literal>off</literal></syntax> +<default>off</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +设置目录中列出文件的时间是本地时间还是UTC时间。 +</para> + +</directive> + +</section> + +</module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/cn/docs/http/ngx_http_browser_module.xml Thu Oct 11 10:23:05 2012 +0000 @@ -0,0 +1,160 @@ +<?xml version="1.0"?> + +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> + +<module name="ngx_http_browser_module模块" + link="/cn/docs/http/ngx_http_browser_module.html" + lang="cn" + translator="litianqing" + rev="1"> + +<section id="summary"> + +<para> +模块<literal>ngx_http_browser_module</literal>创建变量,它们的值取决于 +请求头中<header>User-Agent</header>的值: +<list type="tag"> + +<tag-name><var>$modern_browser</var></tag-name> +<tag-desc> +如果浏览器被为识别为新式浏览器,该值等于<link id="modern_browser_value"/>指令设置的值; +</tag-desc> + +<tag-name><var>$ancient_browser</var></tag-name> +<tag-desc> +如果浏览器被识别为旧式浏览器,该值等于<link id="ancient_browser_value"/>指令设置的值; +</tag-desc> + +<tag-name><var>$msie</var></tag-name> +<tag-desc> +如果浏览器被识别为任何版本的MSIE,该值等于“1”。 +</tag-desc> + +</list> +</para> + +</section> + + +<section id="example" name="配置示例"> + +<para> +选择一个默认页: +<example> +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; +</example> +</para> + +<para> +旧式浏览器的重定向: +<example> +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; +} +</example> +</para> + +</section> + + +<section id="directives" name="指令"> + +<directive name="ancient_browser"> +<syntax><value>string</value> ...</syntax> +<default/> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +如果任一指定的子串在请求头的<header>User-Agent</header>域中被发现,浏览器将被认定为旧式浏览器。 +特殊字符串“<literal>netscape4</literal>” 相当于正则表达式“<literal>^Mozilla/[1-4]</literal>”。 +</para> + +</directive> + + +<directive name="ancient_browser_value"> +<syntax><value>string</value></syntax> +<default>1</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +设定变量<var>$ancient_browser</var>的值。 +</para> + +</directive> + + +<directive name="modern_browser"> +<syntax><value>browser</value> <value>version</value></syntax> +<syntax><literal>unlisted</literal></syntax> +<default/> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +指定一个版本,此版本及后续版本的浏览器都被认定为新式浏览器。 +浏览器可以是下列之一: <literal>msie</literal>, +<literal>gecko</literal> (基于Mozilla), +<literal>opera</literal>,<literal>safari</literal>, +或者 <literal>konqueror</literal>。 +</para> + +<para> +版本可被指定为以下形式:X, X.X, X.X.X, 或 X.X.X.X。 +每一形式的最大值分别是4000, 4000.99, 4000.99.99, 和 4000.99.99.99。 +</para> + +<para> +浏览器既没有在<literal>modern_browser</literal>中列出,又没有在<link id="ancient_browser"/>中 +列出时,如果配置了特殊值<literal>unlisted</literal>,那么浏览器将被认定为新式浏览器,否则 +认定为旧式浏览器。 +如果请求头中没有<header>User-Agent</header>域,浏览器以没有列出对待。 +</para> + +</directive> + + +<directive name="modern_browser_value"> +<syntax><value>string</value></syntax> +<default>1</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +设定变量<var>$modern_browser</var>的值。 +</para> + +</directive> + +</section> + +</module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/cn/docs/http/ngx_http_gzip_static_module.xml Thu Oct 11 10:23:05 2012 +0000 @@ -0,0 +1,70 @@ +<?xml version="1.0"?> + +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> + +<module name="ngx_http_gzip_static_module模块" + link="/cn/docs/http/ngx_http_gzip_static_module.html" + lang="cn" + translator="WenMing" + rev="1"> + +<section id="summary"> + +<para> +模块 <literal>ngx_http_gzip_static_module</literal> 允许发送以“<literal>.gz</literal>”作为文件扩展名的预压缩文件,以替代发送普通文件。 +</para> + +<para> +这个模块不是默认编译的,因此需要指定 +<literal>--with-http_gzip_static_module</literal> +编译选项。 +</para> + +</section> + + +<section id="example" name="配置范例"> + +<para> +<example> +gzip_static on; +gzip_proxied expired no-cache no-store private auth; +</example> +</para> + +</section> + + +<section id="directives" name="指令"> + +<directive name="gzip_static"> +<syntax><literal>on</literal> | <literal>off</literal></syntax> +<default>off</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +启用或者禁用检查预压缩文件是否存在。 +与以下指令共同确定功能开启: +<link doc="ngx_http_gzip_module.xml" id="gzip_http_version"/>, +<link doc="ngx_http_gzip_module.xml" id="gzip_proxied"/>, +<link doc="ngx_http_gzip_module.xml" id="gzip_disable"/>, +和<link doc="ngx_http_gzip_module.xml" id="gzip_vary"/>. +</para> + +<para> +文件可以使用 <command>gzip</command> 命令来进行压缩,或任何其他兼容的命令。 +建议压缩文件和原始文件的修改日期和时间保持一致。 +</para> + +</directive> + +</section> + +</module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/cn/docs/http/ngx_http_index_module.xml Thu Oct 11 10:23:05 2012 +0000 @@ -0,0 +1,77 @@ +<?xml version="1.0"?> + +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> + +<module name="ngx_http_index_module模块" + link="/cn/docs/http/ngx_http_index_module.html" + lang="cn" + translator="litianqing" + rev="1"> + +<section id="summary"> + +<para> +模块 <literal>ngx_http_index_module</literal> 处理以斜线字符(‘<literal>/</literal>’)结尾的请求。 +</para> + +</section> + + +<section id="example" name="配置范例"> + +<para> +<example> +location / { + index index.$geo.html index.html; +} +</example> +</para> + +</section> + + +<section id="directives" name="指令"> + +<directive name="index"> +<syntax><value>file</value> ...</syntax> +<default>index.html</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +定义将要被作为默认页的文件。 +文件 <value>file</value> 的名字可以包含变量。 +文件以配置中指定的顺序被nginx检查。 +列表中的最后一个元素可以是一个带有绝对路径的文件。 +例子: +<example> +index index.$geo.html index.0.html /index.html; +</example> +</para> + +<para> +需要注意的是,index文件会引发内部重定向,请求可能会被其它location处理。 +比如,下面这个例子: +<example> +location = / { + index index.html; +} + +location / { + ... +} +</example> +请求“<literal>/</literal>”实际上将会在第二个location中作为“<literal>/index.html</literal>”被处理。 +</para> + +</directive> + +</section> + +</module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/cn/docs/http/ngx_http_limit_conn_module.xml Thu Oct 11 10:23:05 2012 +0000 @@ -0,0 +1,158 @@ +<?xml version="1.0"?> + +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> + +<module name="ngx_http_limit_conn_module 模块" + link="/cn/docs/http/ngx_http_limit_conn_module.html" + lang="cn" + translator="G_will" + rev="1"> + +<section id="summary"> + +<para> +<literal>ngx_http_limit_conn_module</literal> 模块可以按照定义的键限定每个键值的连接数。特别的,可以设定单一 IP 来源的连接数。 +</para> + +<para> +并不是所有的连接都会被模块计数;只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数。 +</para> + +</section> + + +<section id="example" name="配置范例"> + +<para> +<example> +http { + limit_conn_zone $binary_remote_addr zone=addr:10m; + + ... + + server { + + ... + + location /download/ { + limit_conn addr 1; + } +</example> +</para> + +</section> + + +<section id="directives" name="指令"> + +<directive name="limit_conn"> +<syntax><value>zone</value> <value>number</value></syntax> +<default/> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +指定一块已经设定的共享内存空间,以及每个给定键值的最大连接数。当连接数超过最大连接数时,服务器将会返回 +<http-status code="503" text="Service Temporarily Unavailable"/> +错误。比如,如下配置 +<example> +limit_conn_zone $binary_remote_addr zone=addr:10m; + +server { + location /download/ { + limit_conn addr 1; + } +</example> +表示,同一 IP 同一时间只允许有一个连接。 +</para> + +<para> +当多个 <literal>limit_conn</literal> 指令被配置时,所有的连接数限制都会生效。比如,下面配置不仅会限制单一IP来源的连接数,同时也会限制单一虚拟服务器的总连接数: +<example> +limit_conn_zone $binary_remote_addr zone=perip:10m; +limit_conn_zone $server_name zone=perserver:10m; + +server { + ... + limit_conn perip 10; + limit_conn perserver 100; +} +</example> + +</para> + +<para> +如果当前配置层级没有<literal>limit_conn</literal>指令,将会从更高层级继承连接限制配置。 +</para> + +</directive> + + +<directive name="limit_conn_log_level"> +<syntax> +<literal>info</literal> | +<literal>notice</literal> | +<literal>warn</literal> | +<literal>error</literal></syntax> +<default>error</default> +<context>http</context> +<context>server</context> +<context>location</context> +<appeared-in>0.8.18</appeared-in> + +<para> +指定当连接数超过设定的最大连接数,服务器限制连接时的日志等级。 +</para> + +</directive> + + +<directive name="limit_conn_zone"> +<syntax> + <value>$variable</value> + <literal>zone</literal>=<value>name</value>:<value>size</value></syntax> +<default/> +<context>http</context> + +<para> +设定保存各个键的状态的共享内存空间的参数。键的状态中保存了当前连接数。键的值可以是特定变量的任何非空值(空值将不会被考虑)。 +使用范例: +<example> +limit_conn_zone $binary_remote_addr zone=addr:10m; +</example> +这里,设置客户端的IP地址作为键。注意,这里使用的是<var>$binary_remote_addr</var>变量,而不是<var>$remote_addr</var>变量。<var>$remote_addr</var>变量的长度为7字节到15字节不等,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。而<var>$binary_remote_addr</var>变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。一兆字节的共享内存空间可以保存3.2万个32位的状态,1.6万个64位的状态。如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 +<http-status code="503" text="Service Temporarily Unavailable"/> +错误。 +</para> + +</directive> + + +<directive name="limit_zone"> +<syntax> + <value>name</value> + <value>$variable</value> + <value>size</value></syntax> +<default/> +<context>http</context> + +<para> +这条指令在 1.1.8 版本中已经被废弃,应该使用等效的<link id="limit_conn_zone"/>指令。该指令的语法也有变化: +<note> +<literal>limit_conn_zone</literal> +<value>$variable</value> +<literal>zone</literal>=<value>name</value>:<value>size</value>; +</note> +</para> + +</directive> + +</section> + +</module>
--- a/xml/cn/docs/http/request_processing.xml Thu Oct 11 08:19:38 2012 +0000 +++ b/xml/cn/docs/http/request_processing.xml Thu Oct 11 10:23:05 2012 +0000 @@ -1,8 +1,15 @@ -<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd"> +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd"> <article name="Nginx如何处理一个请求" link="/cn/docs/http/request_processing.html" lang="cn" + rev="1" + translator="Jinglong & cfsego" author="Igor Sysoev" editor="Brian Mercer"> @@ -14,38 +21,38 @@ <programlisting> server { - listen 80; - server_name nginx.org www.nginx.org; + listen 80; + server_name example.org www.example.org; ... } server { - listen 80; - server_name nginx.net www.nginx.net; + listen 80; + server_name example.net www.example.net; ... } server { - listen 80; - server_name nginx.com www.nginx.com; + listen 80; + server_name example.com www.example.com; ... } </programlisting> </para> <para> -在这个配置中,nginx仅仅检查请求的Host头以决定该请求应由哪个虚拟主机来处理。如果Host头没有匹配到任意一个主机名,或者请求中根本没有包含这个头,那nginx会将这个请求分发到默认的虚拟主机。在以上配置中,第一个被列出的虚拟主机即nginx的默认虚拟主机——这是nginx的标准默认行为。如果不想第一个虚拟主机成为默认主机,可以显式地在"<literal>listen</literal>"指令中设置"<literal>default_server</literal>"参数: +在这个配置中,nginx仅仅检查请求的<header>Host</header>头以决定该请求应由哪个虚拟主机来处理。如果Host头没有匹配任意一个虚拟主机,或者请求中根本没有包含Host头,那nginx会将请求分发到定义在此端口上的默认虚拟主机。在以上配置中,第一个被列出的虚拟主机即nginx的默认虚拟主机——这是nginx的默认行为。而且,可以显式地设置某个主机为默认虚拟主机,即在"<literal>listen</literal>"指令中设置"<literal>default_server</literal>"参数: <programlisting> server { - listen 80 <b>default_server</b>; - server_name nginx.net www.nginx.net; + listen 80 <b>default_server</b>; + server_name example.net www.example.net; ... } </programlisting> <note> -"<literal>default_server</literal>"参数从0.8.21版开始使用。在之前的版本中,需要使用"<literal>default</literal>"参数代替。 +"<literal>default_server</literal>"参数从0.8.21版开始可用。在之前的版本中,应该使用"<literal>default</literal>"参数代替。 </note> 请注意"<literal>default_server</literal>"是监听端口的属性,而不是主机名的属性。后面会对此有更多介绍。 @@ -58,7 +65,7 @@ name="如何防止处理未定义主机名的请求"> <para> -如果不想处理未定义<header>Host</header>头的请求,可以定义如下主机,以丢弃这些请求: +如果不允许请求中缺少<header>Host</header>头,可以定义如下主机,丢弃这些请求: <programlisting> server { @@ -68,7 +75,8 @@ } </programlisting> -在这里,我们设置主机名为空字符串以匹配未定义<header>Host</header>头的请求,而且返回了一个nginx特有的,非http标准的返回码444,它可以用来关闭连接。从0.8.48版本开始,这已成为主机名的默认设置,所以<literal>server_name ""</literal>可以省略。而之前的版本使用机器的<i>hostname</i>作为默认主机名。 +在这里,我们设置主机名为空字符串以匹配未定义<header>Host</header>头的请求,而且返回了一个nginx特有的,非http标准的返回码444,它可以用来关闭连接。 +<note>从0.8.48版本开始,这已成为主机名的默认设置,所以可以省略<literal>server_name ""</literal>。而之前的版本使用机器的<i>hostname</i>作为主机名的默认值。</note> </para> </section> @@ -82,46 +90,46 @@ <programlisting> server { - listen 192.168.1.1:80; - server_name nginx.org www.nginx.org; + listen 192.168.1.1:80; + server_name example.org www.example.org; ... } server { - listen 192.168.1.1:80; - server_name nginx.net www.nginx.net; + listen 192.168.1.1:80; + server_name example.net www.example.net; ... } server { - listen 192.168.1.2:80; - server_name nginx.com www.nginx.com; + listen 192.168.1.2:80; + server_name example.com www.example.com; ... } </programlisting> -这个配置中,nginx根据"<literal>server</literal>"配置块中的"<literal>listen</literal>"指令首先测试请求的IP地址和端口是否匹配某个定义的值。如果匹配成功,则继续测试请求的Host头是否匹配这个块中的"<literal>server_name</literal>"的值。如果主机名匹配失败,这个请求将被交给默认的虚拟主机处理。例如,一个从192.168.1.1:80端口收到的访问<literal>www.nginx.com</literal>的请求将被监听192.168.1.1:80端口的默认服务器处理,本例中就是第一个服务器,因为这个端口上没有定义域名为<literal>www.nginx.com</literal>的服务器。 +这个配置中,nginx首先测试请求的IP地址和端口是否匹配某个<link doc="ngx_http_core_module.xml" id="server"/>配置块中的<link doc="ngx_http_core_module.xml" id="listen"/>指令配置。接着nginx继续测试请求的Host头是否匹配这个<link doc="ngx_http_core_module.xml" id="server"/>块中的某个<link doc="ngx_http_core_module.xml" id="server_name"/>的值。如果主机名没有找到,nginx将把这个请求交给默认虚拟主机处理。例如,一个从192.168.1.1:80端口收到的访问<literal>www.example.com</literal>的请求将被监听192.168.1.1:80端口的默认虚拟主机处理,本例中就是第一个服务器,因为这个端口上没有定义名为<literal>www.example.com</literal>的虚拟主机。 </para> <para> -之前已经提到默认服务器是监听端口的属性,所以不同的监听端口可以设置不同的默认服务器: +默认服务器是监听端口的属性,所以不同的监听端口可以设置不同的默认服务器: <programlisting> server { - listen 192.168.1.1:80; - server_name nginx.org www.nginx.org; + listen 192.168.1.1:80; + server_name example.org www.example.org; ... } server { - listen 192.168.1.1:80 default_server; - server_name nginx.net www.nginx.net; + listen 192.168.1.1:80 <b>default_server</b>; + server_name example.net www.example.net; ... } server { - listen 192.168.1.2:80 default_server; - server_name nginx.com www.nginx.com; + listen 192.168.1.2:80 <b>default_server</b>; + server_name example.com www.example.com; ... } </programlisting> @@ -134,38 +142,38 @@ name="一个简单PHP站点配置"> <para> -现在让我们来看一下,在一个典型的,简单的PHP站点中,nginx怎样为一个请求选择<i>location</i>来处理: +现在我们来看在一个典型的,简单的PHP站点中,nginx怎样为一个请求选择<i>location</i>来处理: <programlisting> server { - listen 80; - server_name nginx.org www.nginx.org; - root /data/www; + listen 80; + server_name example.org www.example.org; + root /data/www; location / { - index index.html index.php; + index index.html index.php; } location ~* \.(gif|jpg|png)$ { - expires 30d; + expires 30d; } location ~ \.php$ { - fastcgi_pass localhost:9000; - fastcgi_param SCRIPT_FILENAME - $document_root$fastcgi_script_name; - include fastcgi_params; + fastcgi_pass localhost:9000; + fastcgi_param SCRIPT_FILENAME + $document_root$fastcgi_script_name; + include fastcgi_params; } } </programlisting> </para> <para> -第一步,nginx使用字符串匹配找出最准确的location,这一步nginx会忽略location在配置文件出现的顺序。上面的配置中,只有唯一一个非正则匹配的location,也就是"<literal>/</literal>",它可以匹配任意的请求,一般作为最后一个选择。第二步,nginx会继续匹配正则表达式的location,匹配到第一个正则表达式后停止搜索。匹配到的location将被使用。正则表达式的匹配,按照配置中的顺序进行,出现在前的优先匹配。如果没有匹配到正则表达式,则使用第一步匹配的结果。 +首先,nginx使用前缀匹配找出最准确的location,这一步nginx会忽略location在配置文件出现的顺序。上面的配置中,唯一的前缀匹配location是"<literal>/</literal>",而且因为它可以匹配任意的请求,所以被作为最后一个选择。接着,nginx继续按照配置中的顺序依次匹配正则表达式的location,匹配到第一个正则表达式后停止搜索。匹配到的location将被使用。如果没有匹配到正则表达式的location,则使用刚刚找到的最准确的前缀匹配的location。 </para> <para> -请注意所有location匹配测试只使用请求的URI部分,而不使用参数部分。这是因为参数在请求串中顺序是任意的,比如: +请注意所有location匹配测试只使用请求的URI部分,而不使用参数部分。这是因为写参数的方法很多,比如: <programlisting> /index.php?user=john&page=1 @@ -180,32 +188,24 @@ </para> <para> -现在让我们来看一下使用上面的配置进来的请求是怎样被处理的: +现在让我们来看使用上面的配置,请求是怎样被处理的: -<list type="bullet"> +<list type="bullet" compact="no"> <listitem> -<para> -请求"<literal>/logo.gif</literal>"首先匹配上location "<literal>/</literal>",然后匹配上正则表达式"<literal>\.(gif|jpg|png)$</literal>"。因此,它将被后匹配上的location处理。根据"<literal>root /data/www</literal>"指令,nginx将请求映射到文件"<literal>/data/www/logo.gif</literal>",并发送这个文件到客户端。 -</para> +请求"<literal>/logo.gif</literal>"首先匹配上location "<literal>/</literal>",然后匹配上正则表达式"<literal>\.(gif|jpg|png)$</literal>"。因此,它将被后者处理。根据"<literal>root /data/www</literal>"指令,nginx将请求映射到文件<path>/data/www/logo.gif</path>",并发送这个文件到客户端。 </listitem> <listitem> -<para> -请求"<literal>/index.php</literal>"首先也匹配上location "<literal>/</literal>",然后匹配上正则表达式"<literal>\.(php)$</literal>"。 因此,它将被后匹配上的location处理,会被发送到一个监听在localhost:9000的FastCGI服务器。"<literal>fastcgi_param</literal>"指令将FastCGI的参数SCRIPT_FILENAME的值设置为"<literal>/data/www/index.php</literal>",接着FastCGI服务器将执行这个文件。变量$document_root等于"<literal>root</literal>"指令设置的值,变量$fastcgi_script_name的值等于请求的uri,"<literal>/index.php</literal>"。 -</para> +请求"<literal>/index.php</literal>"首先也匹配上location "<literal>/</literal>",然后匹配上正则表达式"<literal>\.(php)$</literal>"。 因此,它将被后者处理,进而被发送到监听在localhost:9000的FastCGI服务器。<link doc="ngx_http_fastcgi_module.xml" id="fastcgi_param"/>指令将FastCGI的参数<literal>SCRIPT_FILENAME</literal>的值设置为"<literal>/data/www/index.php</literal>",接着FastCGI服务器执行这个文件。变量<var>$document_root</var>等于<link doc="ngx_http_core_module.xml" id="root"/>指令设置的值,变量<var>$fastcgi_script_name</var>的值是请求的uri,"<literal>/index.php</literal>"。 </listitem> <listitem> -<para> -请求"<literal>/about.html</literal>"仅能匹配上location "<literal>/</literal>",因此,它将使用此location进行处理。根据"<literal>root /data/www</literal>"指令,nginx将请求映射到文件"<literal>/data/www/about.html</literal>",并发送这个文件到客户端。 -</para> +请求"<literal>/about.html</literal>"仅能匹配上location "<literal>/</literal>",因此,它将使用此location进行处理。根据"<literal>root /data/www</literal>"指令,nginx将请求映射到文件"<path>/data/www/about.html</path>",并发送这个文件到客户端。 </listitem> <listitem> -<para> -请求"<literal>/</literal>"的处理更为复杂。它仅能匹配上location "<literal>/</literal>",因此,它将使用此location进行处理。然后,"<literal>index</literal>"指令使用它的参数和"<literal>root /data/www</literal>"指令所组成的文件路径来检测对应的文件是否存在。如果文件"<literal>/data/www/index.php</literal>"存在,"<literal>index</literal>"指令将执行一次内部重定向到"<literal>/index.php</literal>",接着nginx将重新寻找匹配"<literal>/index.php</literal>"的location,就好像这次请求是从客户端发过来一样。正如我们之前看到的那样,这个重定向的请求最终交给FastCGI服务器来处理。 -</para> +请求"<literal>/</literal>"的处理更为复杂。它仅能匹配上location "<literal>/</literal>",因此,它将使用此location进行处理。然后,<link doc="ngx_http_index_module.xml" id="index"/>指令使用它的参数和"<literal>root /data/www</literal>"指令所组成的文件路径来检测对应的文件是否存在。如果文件<path>/data/www/index.html</path>不存在,而<path>/data/www/index.php</path>存在,此指令将执行一次内部重定向到"<literal>/index.php</literal>",接着nginx将重新寻找匹配"<literal>/index.php</literal>"的location,就好像这次请求是从客户端发过来一样。正如我们之前看到的那样,这个重定向的请求最终交给FastCGI服务器来处理。 </listitem> </list>
--- a/xml/cn/docs/http/server_names.xml Thu Oct 11 08:19:38 2012 +0000 +++ b/xml/cn/docs/http/server_names.xml Thu Oct 11 10:23:05 2012 +0000 @@ -1,8 +1,15 @@ -<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd"> +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd"> <article name="虚拟主机名" link="/cn/docs/http/server_names.html" lang="cn" + rev="2" + translator="cfsego" author="Igor Sysoev" editor="Brian Mercer"> @@ -11,18 +18,18 @@ <para> -虚拟主机名使用<literal>server_name</literal>指令定义,并用于决定某个请求应由哪台虚拟主机处理。具体请参考《<link doc="request_processing.xml">nginx如何处理一个请求</link>》。虚拟主机名可以使用确切的名字,通配符,或者是正则表达式来定义: +虚拟主机名使用<link doc="ngx_http_core_module.xml" id="server_name"/>指令定义,用于决定由某台<link doc="ngx_http_core_module.xml" id="server">虚拟主机</link>来处理请求。具体请参考《<link doc="request_processing.xml">nginx如何处理一个请求</link>》。虚拟主机名可以使用确切的名字,通配符,或者是正则表达式来定义: <programlisting> server { listen 80; - server_name nginx.org www.nginx.org; + server_name example.org www.example.org; ... } server { listen 80; - server_name *.nginx.org; + server_name *.example.org; ... } @@ -34,12 +41,12 @@ server { listen 80; - server_name ~^(?<user>.+)\.nginx\.net$; + server_name ~^(?<user>.+)\.example\.net$; ... } </programlisting> -nginx将以下面顺序检测名字: +nginx以名字查找虚拟主机时,如果名字可以匹配多于一个主机名定义,比如同时匹配了通配符的名字和正则表达式的名字,那么nginx按照下面的优先级别进行查找,并选中第一个匹配的虚拟主机: <list type="enum"> @@ -48,19 +55,18 @@ </listitem> <listitem> -以星号起始的通配符名字:<literal>*.nginx.org</literal>; +最长的以星号起始的通配符名字:<literal>*.example.org</literal>; </listitem> <listitem> -以星号结束的通配符名字:<literal>mail.*</literal>; +最长的以星号结束的通配符名字:<literal>mail.*</literal>; </listitem> <listitem> -正则表达式名字,按在配置文件中出现的顺序遍历。 +第一个匹配的正则表达式名字(按在配置文件中出现的顺序)。 </listitem> </list> -一旦匹配成功,停止搜索。 </para> </section> @@ -70,11 +76,11 @@ name="通配符名字"> <para> -通配符名字只可以在名字的起始处或结尾处包含一个星号,并且星号与其他字符之间用点分隔。所以,<literal>www.*.nginx.org</literal>和<literal>w*.nginx.org</literal>都是非法的。不过,上面的两个名字可以使用正则表达式描述:<literal>~^www\..+\.nginx\.org$</literal>和<literal>~^w.*\.nginx\.org$</literal>。星号可以匹配名字的多个节(各节都是以点号分隔的),比如<literal>*.nginx.org</literal>不仅匹配<literal>www.nginx.org</literal>,也匹配<literal>www.sub.nginx.org</literal>。 +通配符名字只可以在名字的起始处或结尾处包含一个星号,并且星号与其他字符之间用点分隔。所以,“<literal>www.*.example.org</literal>”和“<literal>w*.example.org</literal>”都是非法的。不过,上面的两个名字可以使用正则表达式描述,即“<literal>~^www\..+\.example\.org$</literal>”和“<literal>~^w.*\.example\.org$</literal>”。星号可以匹配名字的多个节(各节都是以点号分隔的)。“<literal>*.example.org</literal>”不仅匹配<literal>www.example.org</literal>,也匹配<literal>www.sub.example.org</literal>。 </para> <para> -有一种形如<literal>.nginx.org</literal>的特殊通配符,它可以既匹配确切的名字<literal>nginx.org</literal>,又可以匹配一般的通配符名字<literal>*.nginx.org</literal>。 +有一种形如“<literal>.example.org</literal>”的特殊通配符,它可以既匹配确切的名字“<literal>example.org</literal>”,又可以匹配一般的通配符名字“<literal>*.example.org</literal>”。 </para> </section> @@ -84,16 +90,16 @@ name="正则表达式名字"> <para> -nginx使用兼容PCRE的正则表达式。为了使用正则表达式,虚拟主机名必须以波浪线“~”起始: +nginx使用的正则表达式兼容PCRE。为了使用正则表达式,虚拟主机名必须以波浪线“~”起始: <programlisting> -server_name ~^www\d+\.nginx\.net$; +server_name ~^www\d+\.example\.net$; </programlisting> -否则该名字会被认为是确切的名字,如果表达式含星号,则会被认为是通配符名字(很可能是一个非法的通配符名字)。不要忘记设置“^”和“$”锚点,语法上不是必须的,但是逻辑上是需要的。同时需要注意的是,域名中的点“.”需要用反斜线“\”转义。正则表达式中含有“{”和“}”,那么正则表达式需要被引用,如: +否则该名字会被认为是个确切的名字,如果表达式含星号,则会被认为是个通配符名字(而且很可能是一个非法的通配符名字)。不要忘记设置“<literal>^</literal>”和“<literal>$</literal>”锚点,语法上它们不是必须的,但是逻辑上是的。同时需要注意的是,域名中的点“.”需要用反斜线“\”转义。含有“<literal>{</literal>”和“<literal>}</literal>”的正则表达式需要被引用,如: <programlisting> -server_name "~^(?<name>\w\d<b>{</b>1,3<b>}</b>+)\.nginx\.net$"; +server_name "~^(?<name>\w\d<b>{</b>1,3<b>}</b>+)\.example\.net$"; </programlisting> 否则nginx就不能启动,错误提示是: @@ -164,26 +170,34 @@ name="其他类型的名字"> <para> -如果需要用一个非默认的虚拟主机处理请求头中不含“Host”字段的请求,需要指定一个空名字: +有一些主机名会被特别对待。 +</para> + +<para> +如果需要用一个非默认的<link doc="ngx_http_core_module.xml" id="server">虚拟主机</link>处理请求头中不含<header>Host</header>字段的请求,需要指定一个空名字: <programlisting> server { listen 80; - server_name nginx.org www.nginx.org ""; + server_name example.org www.example.org ""; ... } </programlisting> </para> <para> -如果server块中没有定义<literal>server_name</literal>,nginx使用空名字作为虚拟主机名。 +如果<link doc="ngx_http_core_module.xml" id="server"/>块中没有定义<link doc="ngx_http_core_module.xml" id="server_name"/>,nginx使用空名字作为虚拟主机名。 <note> -同样的情况下,nginx 0.8.48版本以下(含)使用<i>本地主机名</i>作为虚拟主机名。 +nginx 0.8.48版本以下(含)在同样的情况下会使用机器名作为虚拟主机名。 </note> </para> <para> -如果使用IP地址而不是主机名来请求服务器,那么请求头的“HOST”字段包含的将是IP地址。可以将IP地址作为虚拟主机名来处理这种请求: +如果以“<literal>$hostname</literal>”(nginx 0.9.4及以上版本)定义虚拟主机名,机器名将被使用。 +</para> + +<para> +如果使用IP地址而不是主机名来请求服务器,那么请求头的<header>Host</header>字段包含的将是IP地址。可以将IP地址作为虚拟主机名来处理这种请求: <programlisting> server { @@ -199,7 +213,7 @@ </para> <para> -在匹配所有的服务器的例子中,可以见到一个奇怪的名字“_”: +在匹配所有的服务器的例子中,可以见到一个奇怪的名字“<literal>_</literal>”: <programlisting> server { @@ -209,24 +223,24 @@ } </programlisting> -这没什么特别的,它只不过是成千上万的与真实的名字毫不相干的非法域名中的一个而已。当然,也可以使用“--”、“!@#”等等。 +这没什么特别的,它只不过是成千上万的与真实的名字绝无冲突的非法域名中的一个而已。当然,也可以使用“<literal>--</literal>”和“<literal>!@#</literal>”等等。 </para> <para> -nginx直到0.6.25版本还支持一个特殊的名字“*”,这个名字一直被错误地理解成是一个匹配所有的名字。但它从来没有像匹配所有的名字,或者通配符那样工作过,而是用来支持一种功能,此功能现在已经改由<literal>server_name_in_redirect</literal>指令提供支持了。所以,现在这个特殊的名字“*”就过时了,应该使用<literal>server_name_in_redirect</literal>指令。需要注意的是,使用<literal>server_name</literal>指令无法描述匹配所有的名字或者默认服务器,需要使用<literal>listen</literal>指令的一个属性来完成这项工作。具体请参考《<link doc="request_processing.xml">nginx如何处理一个请求</link>》。可以定义两个服务器都监听*:80和*:8080端口,然后指定一个作为端口*:8080的默认服务器,另一个作为端口*:80的默认服务器: +nginx直到0.6.25版本还支持一个特殊的名字“<literal>*</literal>”,这个名字一直被错误地理解成是一个匹配所有的名字。但它从来没有像匹配所有的名字,或者通配符那样工作过,而是用来支持一种功能,此功能现在已经改由<link doc="ngx_http_core_module.xml" id="server_name_in_redirect"/>指令提供支持了。所以,现在这个特殊的名字“<literal>*</literal>”已经过时了,应该使用<link doc="ngx_http_core_module.xml" id="server_name_in_redirect"/>指令取代它。需要注意的是,使用<link doc="ngx_http_core_module.xml" id="server_name"/>指令无法描述匹配所有的名字或者默认服务器。这是<link doc="ngx_http_core_module.xml" id="listen"/>指令的属性,而不是<link doc="ngx_http_core_module.xml" id="server_name"/>指令的属性。具体请参考《<link doc="request_processing.xml">nginx如何处理一个请求</link>》。可以定义两个服务器都监听*:80和*:8080端口,然后指定一个作为端口*:8080的默认服务器,另一个作为端口*:80的默认服务器: <programlisting> server { listen 80; listen 8080 default_server; - server_name nginx.net; + server_name example.net; ... } server { listen 80 default_server; listen 8080; - server_name nginx.org; + server_name example.org; ... } </programlisting> @@ -240,16 +254,28 @@ name="优化"> <para> -确切名字和通配符名字存储在哈希表中。哈希表和监听端口关联,每个端口都最多关联到三张表:确切名字的哈希表,以星号起始的通配符名字的哈希表和以星号结束的通配符名字的哈希表。哈希表的尺寸在配置阶段进行了优化,可以以最小的CPU缓存命中失败来找到名字。nginx首先搜索确切名字的哈希表,如果没有找到,搜索以星号起始的通配符名字的哈希表,如果还是没有找到,继续搜索以星号结束的通配符名字的哈希表。因为名字是按照域名的节来搜索的,所以搜索通配符名字的哈希表比搜索确切名字的哈希表慢。注意<literal>.nginx.org</literal>存储在通配符名字的哈希表中,而不在确切名字的哈希表中。正则表达式是一个一个串行的测试,所以是最慢的,而且不可扩展。 +确切名字和通配符名字存储在哈希表中。哈希表和监听端口关联。哈希表的尺寸在配置阶段进行了优化,可以以最小的CPU缓存命中失败来找到名字。设置哈希表的细节参见<link doc="../hash.xml">这篇文档</link> +</para> + +<para> +nginx首先搜索确切名字的哈希表,如果没有找到,搜索以星号起始的通配符名字的哈希表,如果还是没有找到,继续搜索以星号结束的通配符名字的哈希表。 </para> <para> -鉴于以上原因,请尽可能使用确切的名字。举个例子,如果使用<literal>nginx.org</literal>和<literal>www.nginx.org</literal>来访问服务器是最频繁的,那么将它们明确的定义出来就更为有效: +因为名字是按照域名的节来搜索的,所以搜索通配符名字的哈希表比搜索确切名字的哈希表慢。注意特殊的通配符名字“<literal>.example.org</literal>”存储在通配符名字的哈希表中,而不在确切名字的哈希表中。 +</para> + +<para> +正则表达式是一个一个串行的测试,所以是最慢的,而且不可扩展。 +</para> + +<para> +鉴于以上原因,请尽可能使用确切的名字。举个例子,如果使用<literal>example.org</literal>和<literal>www.example.org</literal>来访问服务器是最频繁的,那么将它们明确的定义出来就更为有效: <programlisting> server { listen 80; - server_name nginx.org www.nginx.org *.nginx.org; + server_name example.org www.example.org *.example.org; ... } </programlisting> @@ -259,20 +285,20 @@ <programlisting> server { listen 80; - server_name .nginx.org; + server_name .example.org; ... } </programlisting> </para> <para> -如果定义了大量名字,或者定义了非常长的名字,那就需要在<i>http</i>配置块中调整<literal>server_names_hash_max_size</literal>和<literal>server_names_hash_bucket_size</literal>的值。<literal>server_names_hash_bucket_size</literal>的默认值可能是32,或者是64,或者是其他值,取决于CPU的缓存行的长度。如果这个值是32,那么定义“too.long.server.name.nginx.org”作为虚拟主机名就会失败,显示下面错误信息: +如果定义了大量名字,或者定义了非常长的名字,那可能需要在<i>http</i>配置块中使用<link doc="ngx_http_core_module.xml" id="server_names_hash_max_size"/>和<link doc="ngx_http_core_module.xml" id="server_names_hash_bucket_size"/>指令进行调整。<link doc="ngx_http_core_module.xml" id="server_names_hash_bucket_size"/>的默认值可能是32,或者是64,或者是其他值,取决于CPU的缓存行的长度。如果这个值是32,那么定义“<literal>too.long.server.name.example.org</literal>”作为虚拟主机名就会失败,而nginx显示下面错误信息: <programlisting> could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32 </programlisting> -出现了这种情况,那就需要将设置值扩大一倍: +出现了这种情况,那就需要将指令的值扩大一倍: <programlisting> http { @@ -288,11 +314,11 @@ or server_names_hash_bucket_size: 32 </programlisting> -那么应该先尝试设置<literal>server_names_hash_max_size</literal>的值差不多等于名字列表的名字总量。如果还不能解决问题,或者服务器启动非常缓慢,再尝试提高<literal>server_names_hash_bucket_size</literal>的值。 +那么应该先尝试设置<link doc="ngx_http_core_module.xml" id="server_names_hash_max_size"/>的值差不多等于名字列表的名字总量。如果还不能解决问题,或者服务器启动非常缓慢,再尝试提高<link doc="ngx_http_core_module.xml" id="server_names_hash_bucket_size"/>的值。 </para> <para> -如果只为一个监听端口配置了唯一的主机,那么nginx就完全不会测试虚拟主机名了(也不会建立那些名字哈希表)。不过,有一个例外,如果<literal>server_name</literal>是一个含有捕获组的正则表达式,这时nginx就不得不执行这个表达式以得到捕获组。 +如果只为一个监听端口配置了唯一的主机,那么nginx就完全不会测试虚拟主机名了(也不会为监听端口建立哈希表)。不过,有一个例外,如果定义的虚拟主机名是一个含有捕获组的正则表达式,这时nginx就不得不执行这个表达式以得到捕获组。 </para> </section> @@ -305,7 +331,11 @@ <list type="bullet"> <listitem> -从0.8.48版本开始,默认的虚拟主机名是空名字“”。 +从0.9.4版本开始,支持特殊的虚拟主机名“<literal>$hostname</literal>”。 +</listitem> + +<listitem> +从0.8.48版本开始,默认的虚拟主机名是空名字“”。 </listitem> <listitem> @@ -317,7 +347,7 @@ </listitem> <listitem> -从0.7.12版本开始,支持空名字“”。 +从0.7.12版本开始,支持空名字“”。 </listitem> <listitem> @@ -329,15 +359,15 @@ </listitem> <listitem> -从0.6.0版本开始,支持形如<literal>nginx.*</literal>的通配符名字。 +从0.6.0版本开始,支持形如<literal>example.*</literal>的通配符名字。 </listitem> <listitem> -从0.3.18版本开始,支持形如<literal>.nginx.org</literal>的特殊通配符名字。 +从0.3.18版本开始,支持形如<literal>.example.org</literal>的特殊通配符名字。 </listitem> <listitem> -从0.1.13版本开始,支持形如<literal>*.nginx.org</literal>的通配符名字。 +从0.1.13版本开始,支持形如<literal>*.example.org</literal>的通配符名字。 </listitem> </list> @@ -345,4 +375,4 @@ </section> -</article> +</article> \ No newline at end of file
--- a/xml/cn/docs/index.xml Thu Oct 11 08:19:38 2012 +0000 +++ b/xml/cn/docs/index.xml Thu Oct 11 10:23:05 2012 +0000 @@ -1,8 +1,14 @@ -<!DOCTYPE article SYSTEM "../../../dtd/article.dtd"> +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> -<article name="nginx文档" +<!DOCTYPE article SYSTEM "../../../dtd/article.dtd"> + +<article name="Nginx文档" link="/cn/docs/" lang="cn" + rev="3" toc="no"> @@ -28,6 +34,10 @@ </listitem> <listitem> +<link doc="syntax.xml"/> +</listitem> + +<listitem> <link doc="debugging_log.xml"/> </listitem> @@ -37,7 +47,7 @@ </section> -<section id="howto" name="howto"> +<section id="howto" name="How-To"> <para> <list type="bullet"> @@ -51,4 +61,55 @@ </section> + +<section name="模块参考目录"> + +<para> +<list type="bullet"> + +<listitem> +<link doc="http/ngx_http_access_module.xml"> +ngx_http_access_module</link> +</listitem> + +<listitem> +<link doc="http/ngx_http_addition_module.xml"> +ngx_http_addition_module</link> +</listitem> + +<listitem> +<link doc="http/ngx_http_auth_basic_module.xml"> +ngx_http_auth_basic_module</link> +</listitem> + +<listitem> +<link doc="http/ngx_http_autoindex_module.xml"> +ngx_http_autoindex_module</link> +</listitem> + +<listitem> +<link doc="http/ngx_http_browser_module.xml"> +ngx_http_browser_module</link> +</listitem> + +<listitem> +<link doc="http/ngx_http_gzip_static_module.xml"> +ngx_http_gzip_static_module</link> +</listitem> + +<listitem> +<link doc="http/ngx_http_index_module.xml"> +ngx_http_index_module</link> +</listitem> + +<listitem> +<link doc="http/ngx_http_limit_conn_module.xml"> +ngx_http_limit_conn_module</link> +</listitem> + +</list> +</para> + +</section> + </article>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/cn/docs/syntax.xml Thu Oct 11 10:23:05 2012 +0000 @@ -0,0 +1,42 @@ +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE article SYSTEM "../../../dtd/article.dtd"> + +<article name="配置文件中的计量单位" + link="/cn/docs/syntax.html" + lang="cn" + translator="cfsego" + rev="2"> + +<section> + +<para> +容量可以用千字节(<literal>k</literal>,<literal>K</literal>)和兆字节(<literal>m</literal>,<literal>M</literal>)来描述,比如“<literal>8k</literal>”,“<literal>1m</literal>”。 +如果没有指定单位,容量以字节为单位。 +</para> + +<para> +时间可以用分钟、小时、天等来描述: +<table width="30%"> +<tr><td width="20%">s</td><td>秒</td></tr> +<tr><td width="20%">m</td><td>分钟</td></tr> +<tr><td width="20%">h</td><td>小时</td></tr> +<tr><td width="20%">d</td><td>天</td></tr> +<tr><td width="20%">w</td><td>周</td></tr> +<tr><td width="20%">M</td><td>月,30天</td></tr> +<tr><td width="20%">y</td><td>年,365天</td></tr> +</table> +</para> + +<para> +比如,“<literal>1h 30m</literal>”,“<literal>1y 6M</literal>”。 +另外,在一些指令中,描述时间可以精确到毫秒精度(<literal>ms</literal>)。 +如果没有指定单位,时间以秒为单位。 +</para> + +</section> + +</article>
--- a/xml/cn/docs/sys_errlist.xml Thu Oct 11 08:19:38 2012 +0000 +++ b/xml/cn/docs/sys_errlist.xml Thu Oct 11 10:23:05 2012 +0000 @@ -1,8 +1,14 @@ -<!DOCTYPE article SYSTEM "../../../dtd/article.dtd"> +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE article SYSTEM "../../../dtd/article.dtd"> <article name="关于“‘sys_errlist’ is deprecated; use ‘strerror’ or ‘strerror_r’ instead”的提示" link="/cn/docs/sys_errlist.html" - lang="cn"> + lang="cn" + rev="1"> <section>
--- a/xml/cn/docs/welcome_nginx_facebook.xml Thu Oct 11 08:19:38 2012 +0000 +++ b/xml/cn/docs/welcome_nginx_facebook.xml Thu Oct 11 10:23:05 2012 +0000 @@ -1,14 +1,20 @@ -<!DOCTYPE article SYSTEM "../../../dtd/article.dtd"> +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> -<article name="我尝试打开Facebook,但得到的是一个“Welcome to nginx!”的页面" +<!DOCTYPE article SYSTEM "../../../dtd/article.dtd"> + +<article name="我尝试打开Facebook,Yahoo!,Yandex,Tumblr,Google等等,但得到的是一个“Welcome to nginx!”的页面" link="/cn/docs/welcome_nginx_facebook.html" - lang="cn"> + lang="cn" + rev="1"> <section> <para> <initial>问:</initial> -我尝试打开Facebook,Yahoo!,Google,或者其他一些知名网站时,但是得到的都是空白页,上面有一条与nginx相关的信息:“Welcome to nginx!”或者是“404 Not Found / nginx”。 +我尝试打开Facebook,Yahoo!,Yandex,Tumblr,Google,或者其他一些知名网站时,但是得到的都是空白页,页面上有一条与nginx相关的信息:“Welcome to nginx!”或者是“404 Not Found / nginx”。 </para> @@ -16,21 +22,98 @@ 我怀疑出了什么问题,而且有可能有恶意的企图要把我引导到流氓页面去(为了黑掉我的电脑,钓鱼等等)。为什么?nginx跟我想连上Facebook(Yahoo!,Google等等)有什么关系? </para> - <para> </para> <para> <initial>答:</initial> -nginx是世界上最流行的三种web服务器之一。它是一个免费的开源软件,完全合法,和任何威胁或者恶意活动毫无关系。“Welcome to nginx!”的网页是一个运行nginx的服务器可能的诊断返回之一。 +第一,你看到的“Welcome to nginx!”不是我们的网站。nginx是我们开发和分发的一个<b>免费</b>的<link url="http://en.wikipedia.org/wiki/Open-source_software">开源</link>web服务器软件。“Welcome to nginx!”的页面只是任何一个运行nginx服务器的网站都会返回的诊断响应。目前,nginx是世界上第二流行的开源web服务器,它被70,000,000网站(因特网的10%)所使用。这些网站中绝大多数都是合法的,但也有一些不是。我们的软件是本着让因特网上具备高性能和高扩展性的好意而创造的,它遵循<link url="http://nginx.org/LICENSE">流行的开源许可</link>,本质上与任何威胁和恶意行为都没有任何关系————nginx不是恶意软件,它也不在你的电脑上。但是某些恶意软件确实会篡改你的电脑或者路由器,把你引导到某个欺诈的因特网服务器上。 +</para> + +<para> +(免责声明: 对于下列行为造成的任何负面影响和效果,nginx不承担任何责任。按下面建议进行操作时,您需要自行承担风险。尤其是您对您的操作系统和/或因特网应用不是很有经验时,这点非常重要。对任何直接的,间接的,偶然的,特殊的,典型的,或者继发的损害,包括但不限于使用、数据、收益方面的损失,或者营业中断,nginx不负有任何责任)。 +</para> + +<para> +<list type="bullet" compact="no"> +<listitem> +检查你的TCP/IP设置,查看DNS配置是否合法(请咨询ISP或IT支持人员) +</listitem> + +<listitem> +使用<link url="http://code.google.com/speed/public-dns/">Google +Public DNS</link>, 尝试修复这个问题。Google Public DNS的描述是:“Google Public DNS是一款免费的全球域名系统(DNS)解析服务,您可以使用它替代您当前的DNS供应服务。[..]使用Google Public DNS,你可以:加速您的浏览体验。<b>提升你的安全性</b>。” +</listitem> + +<listitem> +清除您的DNS解析缓存。在微软Windos XP上,运行“开始” > “运行”,然后输入下面指令:“ipconfig /flushdns”。在微软Vista, Windows 7和Windows 8上,点击“开始”图标,找到“所有应用” > “附件” > “命令提示符”,右击,选择“以管理员身份运行”,再输入“ipconfig /flushdns”,敲回车键。 +</listitem> + +<listitem> +点击浏览器上的“刷新”按钮。清空浏览器的数据(缓存,cookie等等)。比如,使用Chrome浏览器,找到并点击“清除浏览数据”(设置 > 显示高级设置)。使用IE浏览器,找到“工具” > “Interner选项” > “常规”)。<b>注意:</b>您在这里可能删除您保存的密码信心,所以请仔细操作并检查您正在进行的究竟是何种操作。 +</listitem> + +<listitem> +检查“hosts”文件中是否不包含除“127.0.0.1 localhost”以外的其他项;如果不是,那么这些项中是否有您要访问的网站。“hosts”文件位于C:\WINDOWS\system32\drivers\etc文件夹下。通常文件中应该只有一项“127.0.0.1 localhost”。“hosts”文件可以使用记事本查看和编辑。 +</listitem> + +<listitem> +检查安装到您的浏览器中的插件和扩展。重新安装您的浏览器或者如果可能的话,使用其他浏览器替代。 +</listitem> +</list> +</para> + +<para> +当你尝试访问一些知名网站的时候,得到的不是熟悉的页面反而是“Welcome to nginx!”的时候,你的<b>操作系统</b>设置,<b>家用路由器</b>设置,或者<b>浏览器</b>设置一定有问题。如果你的电脑是干净且安全的,就不应该出现这种情况。 </para> +<para> +如果将DNS服务器换成Google Public DNS,刷新DNS解析缓存,修复您的浏览器配置,或者清理“hosts”文件(适当的)确实解决了问题,那么您的电脑上或者周边网络中可能存在着恶意软件。使用您偏好的杀毒软件和恶意软件清除工具找出并清除它们。 +</para> + +<para> +其他可能有用的文章: +</para> + +<para> +DCWG.org: +</para> +<para> +<link url="http://www.dcwg.org/detect/"> +如何发现您的电脑是否已经被DNS Changer侵犯和感染?</link> +</para> + +<para> +<link url="http://www.dcwg.org/fix/"> +如何清理或修复恶意软件DNS Changer</link> +</para> <para> -然而,你认为你的电脑或操作系统设置一定出问题了的假设是正确的——当你尝试访问一些知名网站的时候,得到的不是熟悉的页面反而是“Welcome to nginx!”。如果你的电脑是干净且安全的,就不应该出现这种情况。我们建议你检查并且核实你的操作系统设置(可能需要ISP或者支持人员的帮助),而且在你的电脑上安装并运行杀毒软件是一个好主意。可能有些邪恶的组织正在窃听从你电脑发出的数据流,而且潜在地可能对你和Internet上的其他用户造成巨大危害。 +Microsoft: +</para> +<para> +<link url="http://www.microsoft.com/security/pc-security/malware-removal.aspx"> +恶意软件删除工具</link> +</para> + +<para> +<link url="http://support.microsoft.com/kb/972034"> +如何将主机文件重置回默认值?</link> </para> +<para> +<link url="http://support.microsoft.com/kb/299357"> +如何重置 Internet 协议 (TCP/IP)</link> +</para> + +<para> +Tech-Recipes: +</para> +<para> +<link url="http://www.tech-recipes.com/rx/1600/vista_dns_cache_flush/"> +在Vista,Windows 7和Windows 8系统中刷新,清除,重置DNS缓存</link> +</para> </section>
--- a/xml/cn/docs/windows.xml Thu Oct 11 08:19:38 2012 +0000 +++ b/xml/cn/docs/windows.xml Thu Oct 11 10:23:05 2012 +0000 @@ -1,8 +1,14 @@ +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + <!DOCTYPE article SYSTEM "../../../dtd/article.dtd"> <article name="nginx Windows版使用说明" link="/cn/docs/windows.html" - lang="cn"> + lang="cn" + rev="1"> <section>
--- a/xml/cn/index.xml Thu Oct 11 08:19:38 2012 +0000 +++ b/xml/cn/index.xml Thu Oct 11 10:23:05 2012 +0000 @@ -1,16 +1,24 @@ -<!DOCTYPE article SYSTEM "../../dtd/article.dtd"> +<!-- + Copyright (C) Igor Sysoev + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE article SYSTEM "../../dtd/article.dtd"> <article name="nginx" link="/cn/" - lang="cn"> + lang="cn" + rev="3"> <section> <para> nginx [engine x]是<link url="http://sysoev.ru/en/">Igor Sysoev</link>编写的一个HTTP和反向代理服务器,另外它也可以作为邮件代理服务器。 -它从2004开始已经在众多流量很大的俄罗斯网站上使用,包括<link url="http://www.yandex.ru">Yandex</link>、<link url="http://www.mail.ru">Mail.Ru</link>、<link url="http://www.vkontakte.ru">VKontakte</link>,以及<link url="http://www.rambler.ru">Rambler</link>。据Netcraft统计,在2011年10月份,<link url="http://news.netcraft.com/archives/2011/10/06/september-2011-web-server-survey.htm">世界上最繁忙的网站中有7.84%</link>使用Nginx作为其服务器或者代理服务器。部分成功案例请见:<link url="http://blog.fastmail.fm/2007/01/04/webimappop-frontend-proxies-changed-to-nginx/">FastMail.FM</link>, -<link url="http://barry.wordpress.com/2008/04/28/load-balancer-update/">Wordpress.com</link>。 +它已经在众多流量很大的俄罗斯网站上使用了很长时间,这些网站包括<link url="http://www.yandex.ru">Yandex</link>、<link url="http://www.mail.ru">Mail.Ru</link>、<link url="http://www.vkontakte.ru">VKontakte</link>,以及<link url="http://www.rambler.ru">Rambler</link>。据Netcraft统计,在2012年8月份,<link url="http://news.netcraft.com/archives/2012/08/02/august-2012-web-server-survey.html">世界上最繁忙的网站中有11.48%</link>使用Nginx作为其服务器或者代理服务器。部分成功案例请见: +<link url="https://signup.netflix.com/openconnect/software">Netflix</link>, +<link url="http://barry.wordpress.com/2008/04/28/load-balancer-update/">Wordpress.com</link>, +<link url="http://blog.fastmail.fm/2007/01/04/webimappop-frontend-proxies-changed-to-nginx/">FastMail.FM</link>。 </para> <para> @@ -27,23 +35,23 @@ <list type="bullet"> <listitem> -处理静态文件,索引文件以及自动索引;打开文件描述符缓存; +处理静态文件,<link doc="docs/http/ngx_http_index_module.xml">索引</link>文件以及<link doc="docs/http/ngx_http_autoindex_module.xml">自动索引</link>;<link doc="docs/http/ngx_http_core_module.xml" id="open_file_cache">打开文件描述符缓存</link>; </listitem> <listitem> -使用缓存加速反向代理;简单负载均衡以及容错; +<link doc="docs/http/ngx_http_proxy_module.xml">使用缓存加速反向代理</link>;<link doc="docs/http/ngx_http_upstream_module.xml">简单负载均衡以及容错</link>; </listitem> <listitem> -远程FastCGI服务的缓存加速支持;简单的负载均衡以及容错; +远程<link doc="docs/http/ngx_http_fastcgi_module.xml">FastCGI</link>,uwsgi,SCGI,和<link doc="docs/http/ngx_http_memcached_module.xml">memcached</link>服务的缓存加速支持;<link doc="docs/http/ngx_http_upstream_module.xml">简单的负载均衡以及容错</link>; </listitem> <listitem> -模块化的架构。过滤器包括gzip压缩、ranges支持、chunked响应、XSLT,SSI以及图像缩放。在SSI 过滤器中,一个包含多个SSI的页面,如果经由FastCGI或反向代理处理,可被并行处理; +模块化的架构。过滤器包括<link doc="docs/http/ngx_http_gzip_module.xml">gzip压缩</link>、ranges支持、chunked响应、<link doc="docs/http/ngx_http_xslt_module.xml">XSLT</link>,<link doc="docs/http/ngx_http_ssi_module.xml">SSI</link>以及<link doc="docs/http/ngx_http_image_filter_module.xml">图像缩放</link>。在SSI 过滤器中,一个包含多个SSI的页面,如果经由FastCGI或反向代理处理,可被并行处理; </listitem> <listitem> -支持SSL,TLS SNI。 +<link doc="docs/http/ngx_http_ssl_module.xml">支持SSL,TLS SNI</link>。 </listitem> </list> @@ -59,11 +67,11 @@ <list type="bullet"> <listitem> -基于名字和IP的虚拟主机; +基于名字和IP的<link doc="docs/http/request_processing.xml">虚拟主机</link>; </listitem> <listitem> -Keep-alive和pipelined连接支持; +<link doc="docs/http/ngx_http_core_module.xml" id="keepalive_timeout">Keep-alive</link>和pipelined连接支持; </listitem> <listitem> @@ -71,43 +79,51 @@ </listitem> <listitem> -重新加载配置以及在线升级时,不需要中断正在处理的请求; +<link doc="docs/control.xml" id="reconfiguration">重新加载配置</link>以及<link doc="docs/control.xml" id="upgrade">在线升级</link>时,不需要中断正在处理的请求; +</listitem> + +<listitem> +<link doc="docs/http/ngx_http_log_module.xml" id="log_format">自定义访问日志格式</link>,<link doc="docs/http/ngx_http_log_module.xml" id="access_log">带缓存的日志写操作</link>以及<link doc="docs/control.xml" id="logs">快速日志轮转</link>; </listitem> <listitem> -自定义访问日志格式,带缓存的日志写操作以及快速日志轮转; +3xx-5xx错误代码<link doc="docs/http/ngx_http_core_module.xml" id="error_page">重定向</link>; </listitem> <listitem> -3xx-5xx错误代码重定向; +重写(rewrite)模块:<link doc="docs/http/ngx_http_rewrite_module.xml">使用正则表达式改变URI</link>; </listitem> <listitem> -重写(rewrite)模块; +根据<link doc="docs/http/ngx_http_geo_module.xml">客户端地址</link><link doc="docs/http/ngx_http_rewrite_module.xml" id="if">执行不同的功能</link>; </listitem> <listitem> -基于客户端IP地址和HTTP基本认证机制的访问控制; +基于<link doc="docs/http/ngx_http_access_module.xml">客户端IP地址</link>和<link doc="docs/http/ngx_http_auth_basic_module.xml">HTTP基本认证机制</link>的访问控制; </listitem> <listitem> -支持PUT、DELETE、MKCOL、COPY以及MOVE方法; +支持验证<link doc="docs/http/ngx_http_referer_module.xml">HTTP referer</link>; +</listitem> + +<listitem> +支持<link doc="docs/http/ngx_http_dav_module.xml">PUT、DELETE、MKCOL、COPY以及MOVE</link>方法; </listitem> <listitem> -支持FLV流和MP4流; +支持<link doc="docs/http/ngx_http_flv_module.xml">FLV流</link>和<link doc="docs/http/ngx_http_mp4_module.xml">MP4流</link>; </listitem> <listitem> -速度限制; +<link doc="docs/http/ngx_http_core_module.xml" id="limit_rate">速度限制</link>; </listitem> <listitem> -来自同一地址的同时连接数或请求数限制; +来自同一地址的同时<link doc="docs/http/ngx_http_limit_conn_module.xml">连接数</link>或<link doc="docs/http/ngx_http_limit_req_module.xml">请求数</link>限制; </listitem> <listitem> -嵌入Perl语言。 +<link doc="docs/http/ngx_http_perl_module.xml">嵌入Perl语言</link>。 </listitem> </list> @@ -123,11 +139,11 @@ <list type="bullet"> <listitem> -使用外部HTTP认证服务器重定向用户到IMAP/POP3后端; +使用外部HTTP<link doc="docs/mail/ngx_mail_auth_http_module.xml">认证</link>服务器重定向用户到<link doc="docs/mail/ngx_mail_imap_module.xml">IMAP</link>/<link doc="docs/mail/ngx_mail_pop3_module.xml">POP3</link>后端; </listitem> <listitem> -使用外部HTTP认证服务器认证用户后重定向连接到内部SMTP后端; +使用外部HTTP<link doc="docs/mail/ngx_mail_auth_http_module.xml">认证</link>服务器认证用户后重定向连接到内部<link doc="docs/mail/ngx_mail_smtp_module.xml">SMTP</link>后端; </listitem> <listitem> @@ -136,26 +152,26 @@ <list type="bullet"> <listitem> -POP3: USER/PASS, APOP, AUTH LOGIN/PLAIN/CRAM-MD5; +<link doc="docs/mail/ngx_mail_pop3_module.xml" id="pop3_auth">POP3</link>: USER/PASS, APOP, AUTH LOGIN/PLAIN/CRAM-MD5; </listitem> <listitem> -IMAP: LOGIN, AUTH LOGIN/PLAIN/CRAM-MD5; +<link doc="docs/mail/ngx_mail_imap_module.xml" id="imap_auth">IMAP</link>: LOGIN, AUTH LOGIN/PLAIN/CRAM-MD5; </listitem> <listitem> -SMTP: AUTH LOGIN/PLAIN/CRAM-MD5; +<link doc="docs/mail/ngx_mail_smtp_module.xml" id="smtp_auth">SMTP</link>: AUTH LOGIN/PLAIN/CRAM-MD5; </listitem> </list> </listitem> <listitem> -SSL支持; +<link doc="docs/mail/ngx_mail_ssl_module.xml">SSL</link>支持; </listitem> <listitem> -STARTTLS和STLS支持。 +<link doc="docs/mail/ngx_mail_ssl_module.xml" id="starttls">STARTTLS和STLS</link>支持。 </listitem> </list> @@ -175,7 +191,7 @@ </listitem> <listitem> -支持的事件机制:kqueue(FreeBSD 4.1+)、epoll(Linux 2.6+)、rt signals(Linux 2.2.19+)、/dev/poll(Solaris 7 11/99+)、event ports(Solaris 10)、select以及poll; +<link doc="docs/events.xml">支持</link>的事件机制:kqueue(FreeBSD 4.1+)、epoll(Linux 2.6+)、rt signals(Linux 2.2.19+)、/dev/poll(Solaris 7 11/99+)、event ports(Solaris 10)、select以及poll; </listitem> <listitem> @@ -183,15 +199,20 @@ </listitem> <listitem> -支持sendfile(FreeBSD 3.1+, Linux 2.2+, Mac OS X 10.5)、sendfile64(Linux 2.4.21+)和sendfilev(Solaris 8 7/01+); +支持sendfile(FreeBSD 3.1+, Linux 2.2+, Mac OS X 10.5+)、sendfile64(Linux 2.4.21+)和sendfilev(Solaris 8 7/01+); </listitem> <listitem> -文件AIO(FreeBSD 4.3+, Linux 2.6.22+); +<link doc="docs/http/ngx_http_core_module.xml" id="aio">文件AIO</link>(FreeBSD 4.3+, Linux 2.6.22+); </listitem> <listitem> -Accept-filters(FreeBSD 4.1+)和 TCP_DEFER_ACCEPT(Linux 2.4+); +<link doc="docs/http/ngx_http_core_module.xml" id="directio">DIRECTIO</link> +(FreeBSD 4.4+, Linux 2.4+, Solaris 2.6+, Mac OS X); +</listitem> + +<listitem> +<link doc="docs/http/ngx_http_core_module.xml" id="listen">支持</link>Accept-filters(FreeBSD 4.1+, NetBSD 5.0+)和 TCP_DEFER_ACCEPT(Linux 2.4+); </listitem> <listitem> @@ -215,11 +236,11 @@ <list type="bullet"> <listitem> -FreeBSD 3 — 8 / i386; FreeBSD 5 — 9 / amd64; +FreeBSD 3 — 10 / i386; FreeBSD 5 — 10 / amd64; </listitem> <listitem> -Linux 2.2 — 2.6 / i386; Linux 2.6 / amd64; +Linux 2.2 — 3 / i386; Linux 2.6 — 3 / amd64; </listitem> <listitem> @@ -227,6 +248,14 @@ </listitem> <listitem> +AIX 7.1 / powerpc; +</listitem> + +<listitem> +HP-UX 11.31 / ia64; +</listitem> + +<listitem> MacOS X / ppc, i386; </listitem> @@ -240,4 +269,4 @@ </section> -</article> +</article> \ No newline at end of file
--- a/xml/i18n.xml Thu Oct 11 08:19:38 2012 +0000 +++ b/xml/i18n.xml Thu Oct 11 10:23:05 2012 +0000 @@ -43,9 +43,9 @@ <text lang="cn"> <item id="and">和</item> -<item id="author">作者</item> -<item id="editor">编辑</item> -<item id="translator">翻译</item> +<item id="author">作者:</item> +<item id="editor">编辑:</item> +<item id="translator">翻译:</item> <item id="syntax">语法</item> <item id="default">默认值</item> <item id="context">上下文</item> @@ -53,6 +53,9 @@ <item id="directive.version">这个指令出现在版本</item> <item id="directive.versions">这个指令出现在版本</item> <item id="dirindex">指令目录</item> +<item id="outdated">翻译内容可能已经过旧。 +你可以通过 <origin>英文版本</origin> +查看最近的更新。</item> </text> <text lang="ja">