Mercurial > hg > nginx-site
changeset 953:aded7086e84f
Commercial version documentation.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Thu, 01 Aug 2013 16:31:02 +0400 |
parents | 417dc982362e |
children | d4fb95e6067c |
files | dtd/content.dtd dtd/module.dtd xml/en/GNUmakefile xml/en/docs/http/ngx_http_f4f_module.xml xml/en/docs/http/ngx_http_hls_module.xml xml/en/docs/http/ngx_http_log_module.xml xml/en/docs/http/ngx_http_mp4_module.xml xml/en/docs/http/ngx_http_session_log_module.xml xml/en/docs/http/ngx_http_status_module.xml xml/en/docs/http/ngx_http_upstream_module.xml xml/en/docs/index.xml xml/en/docs/ngx_core_module.xml xsls/versions.xsls xslt/versions.xslt |
diffstat | 14 files changed, 1644 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/dtd/content.dtd Wed Jul 31 23:46:04 2013 +0400 +++ b/dtd/content.dtd Thu Aug 01 16:31:02 2013 +0400 @@ -13,7 +13,8 @@ <!ELEMENT para (#PCDATA | link | links | br | list | note | i | b | nobr | table | literal | command | path | header | value | programlisting | - initial | mainline_version | stable_version | + initial | + mainline_version | stable_version | commercial_version | registered | c-func | http-status)* > <!ELEMENT links (link)+ > @@ -30,7 +31,8 @@ <!ELEMENT i (#PCDATA) > <!ELEMENT b (#PCDATA) > <!ELEMENT command (#PCDATA | value)* > -<!ELEMENT path (#PCDATA | value | mainline_version | stable_version)* > +<!ELEMENT path (#PCDATA | value | + mainline_version | stable_version | commercial_version)* > <!ELEMENT literal (#PCDATA | value)* > <!ELEMENT header (#PCDATA) > <!ELEMENT initial (#PCDATA) > @@ -47,7 +49,7 @@ > <!ELEMENT programlisting (#PCDATA | i | b | path | - mainline_version | stable_version)* > + mainline_version | stable_version | commercial_version)* > <!ELEMENT nobr (#PCDATA | b | command | i | literal | path)* > @@ -59,7 +61,8 @@ <!ELEMENT listitem (#PCDATA | para | br | nobr | list | i | b | path | literal | value | var | programlisting | - link | registered)* > + link | registered | + mainline_version | stable_version | commercial_version)* > <!ATTLIST listitem id ID #IMPLIED > @@ -67,7 +70,7 @@ <!ELEMENT note (#PCDATA | para | br | list | i | b | link | nobr | table | literal | command | path | header | programlisting | initial | paypal | - mainline_version | stable_version )* > + mainline_version | stable_version | commercial_version)* > <!ELEMENT table (tr+) > <!ATTLIST table @@ -83,8 +86,9 @@ <!ELEMENT paypal EMPTY > -<!ELEMENT mainline_version EMPTY > -<!ELEMENT stable_version EMPTY > +<!ELEMENT mainline_version EMPTY > +<!ELEMENT stable_version EMPTY > +<!ELEMENT commercial_version EMPTY > <!ELEMENT book EMPTY > <!ATTLIST book
--- a/dtd/module.dtd Wed Jul 31 23:46:04 2013 +0400 +++ b/dtd/module.dtd Thu Aug 01 16:31:02 2013 +0400 @@ -38,7 +38,8 @@ <!ELEMENT para (#PCDATA | c-def | c-func | command | emphasis | example | header | http-status | link | - list | literal | note | path | value | var)* > + list | literal | note | path | value | var | + mainline_version | stable_version | commercial_version)* > <!ELEMENT c-def (#PCDATA)* > @@ -95,3 +96,7 @@ <!ENTITY nbsp " " > <!ENTITY mdash " - " > + +<!ELEMENT mainline_version EMPTY > +<!ELEMENT stable_version EMPTY > +<!ELEMENT commercial_version EMPTY >
--- a/xml/en/GNUmakefile Wed Jul 31 23:46:04 2013 +0400 +++ b/xml/en/GNUmakefile Thu Aug 01 16:31:02 2013 +0400 @@ -42,6 +42,7 @@ http/ngx_http_dav_module \ http/ngx_http_empty_gif_module \ http/ngx_http_fastcgi_module \ + http/ngx_http_f4f_module \ http/ngx_http_flv_module \ http/ngx_http_geo_module \ http/ngx_http_geoip_module \ @@ -49,6 +50,7 @@ http/ngx_http_gzip_module \ http/ngx_http_gzip_static_module \ http/ngx_http_headers_module \ + http/ngx_http_hls_module \ http/ngx_http_image_filter_module \ http/ngx_http_index_module \ http/ngx_http_limit_conn_module \ @@ -65,9 +67,11 @@ http/ngx_http_rewrite_module \ http/ngx_http_secure_link_module \ http/ngx_http_spdy_module \ + http/ngx_http_session_log_module \ http/ngx_http_split_clients_module \ http/ngx_http_ssi_module \ http/ngx_http_ssl_module \ + http/ngx_http_status_module \ http/ngx_http_sub_module \ http/ngx_http_upstream_module \ http/ngx_http_userid_module \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/en/docs/http/ngx_http_f4f_module.xml Thu Aug 01 16:31:02 2013 +0400 @@ -0,0 +1,87 @@ +<?xml version="1.0"?> + +<!-- + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> + +<module name="Module ngx_http_f4f_module" + link="/en/docs/http/ngx_http_f4f_module.html" + lang="en" + rev="1"> + +<section id="summary"> + +<para> +The module <literal>ngx_http_f4f_module</literal> provides +server-side support for Adobe HTTP Dynamic Streaming (HDS). +</para> + +<para> +This module implements handling of HTTP Dynamic Streaming requests in a +“<literal>/videoSeg1-Frag1</literal>” form, extracting needed fragment +from the <path>videoSeg1.f4f</path> file using the <path>videoSeg1.f4x</path> +index file. +This module is an alternative to the Adobe’s f4f module (HTTP Origin Module) +for Apache. +</para> + +<para> +Usual pre-processing with Adobe’s f4fpackager is required, see relevant +documentation for details. +</para> + +<para> +<note> +This module is available as part of our <commercial_version/> only. +</note> +</para> + +</section> + + +<section id="example" name="Example Configuration"> + +<para> +<example> +location /video/ { + f4f; + ... +} +</example> +</para> + +</section> + + +<section id="directives" name="Directives"> + +<directive name="f4f"> +<syntax/> +<default/> +<context>location</context> + +<para> +Turns on module processing in a surrounding location. +</para> + +</directive> + + +<directive name="f4f_buffer_size"> +<syntax><value>size</value></syntax> +<default>512k</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +Sets the size of a memory buffer used for reading <path>.f4x</path> index file. +</para> + +</directive> + +</section> + +</module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/en/docs/http/ngx_http_hls_module.xml Thu Aug 01 16:31:02 2013 +0400 @@ -0,0 +1,156 @@ +<?xml version="1.0"?> + +<!-- + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> + +<module name="Module ngx_http_hls_module" + link="/en/docs/http/ngx_http_hls_module.html" + lang="en" + rev="1"> + +<section id="summary"> + +<para> +The module <literal>ngx_http_hls_module</literal> provides HTTP Live Streaming +(HLS) server-side support for H.264/AAC files typically having filename +extensions <path>.mp4</path>, <path>.m4v</path>, and <path>.m4a</path>. +</para> + +<para> +Two URIs are supported for each MP4 file: +<list type="bullet"> + +<listitem> +The playlist URI that ends with “<literal>.m3u8</literal>” and accepts +the optional “<literal>len</literal>” argument that defines fragment length +in seconds; +</listitem> + +<listitem> +The fragment URI that ends with “<literal>.ts</literal>” and accepts +“<literal>start</literal>” and “<literal>end</literal>” arguments that +define fragment boundaries in seconds. +</listitem> + +</list> +</para> + +<para> +<note> +This module is available as part of our <commercial_version/> only. +</note> +</para> + +</section> + + +<section id="example" name="Example Configuration"> + +<para> +<example> +location /video/ { + hls; + hls_fragment 5s; + hls_buffers 10 10m; + hls_mp4_buffer_size 1m; + hls_mp4_max_buffer_size 5m; + alias /var/video/; +} +</example> +For example, the following URIs are supported for +the “<path>/var/video/test.mp4</path>” file: +<example> +http://hls.example.com/video/test.mp4.m3u8?len=8.000 +http://hls.example.com/video/test.mp4.ts?start=1.000&end=2.200 +</example> +</para> + +</section> + + +<section id="directives" name="Directives"> + +<directive name="hls"> +<syntax/> +<default/> +<context>location</context> + +<para> +Turns on HLS streaming in a surrounding location. +</para> + +</directive> + + +<directive name="hls_buffers"> +<syntax><value>number</value> <value>size</value></syntax> +<default>8 2m</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +Sets the maximum <value>number</value> and <value>size</value> of buffers +for reading and writing data frames. +</para> + +</directive> + + +<directive name="hls_fragment"> +<syntax><value>time</value></syntax> +<default>5s</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +Defines fragment length for playlist URIs requested without the +“<literal>len</literal>” argument. +</para> + +</directive> + + +<directive name="hls_mp4_buffer_size"> +<syntax><value>size</value></syntax> +<default>512k</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +Sets the initial <value>size</value> of a memory buffer used to +process MP4 files. +</para> + +</directive> + + +<directive name="hls_mp4_max_buffer_size"> +<syntax><value>size</value></syntax> +<default>10m</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +During metadata processing, a larger buffer may become necessary. +Its size cannot exceed the specified <value>size</value>, +or else nginx will return the server error +<http-status code="500" text="Internal Server Error"/>, +and log the following: +<example> +"/some/movie/file.mp4" mp4 moov atom is too large: +12583268, you may want to increase hls_mp4_max_buffer_size +</example> +</para> + +</directive> + +</section> + +</module>
--- a/xml/en/docs/http/ngx_http_log_module.xml Wed Jul 31 23:46:04 2013 +0400 +++ b/xml/en/docs/http/ngx_http_log_module.xml Thu Aug 01 16:31:02 2013 +0400 @@ -10,7 +10,7 @@ <module name="Module ngx_http_log_module" link="/en/docs/http/ngx_http_log_module.html" lang="en" - rev="9"> + rev="10"> <section id="summary"> @@ -58,6 +58,9 @@ <literal>gzip[=<value>level</value>]</literal> [<literal>buffer</literal>=<value>size</value>] [<literal>flush</literal>=<value>time</value>]</syntax> +<syntax> + <literal>syslog:</literal><literal>server</literal>=<value>address</value>[,<value>parameter</value>=<value>value</value>] + [<value>format</value>]</syntax> <syntax><literal>off</literal></syntax> <default>logs/access.log combined</default> <context>http</context> @@ -69,6 +72,8 @@ <para> Sets the path, format, and configuration of the buffered log writes. Several logs can be specified on the same level. +Logging to syslog can be configured by specifying +the “<literal>syslog:</literal>” prefix in the first parameter. The special value <literal>off</literal> cancels all <literal>access_log</literal> directives on the current level. If format is not specified then the predefined format @@ -174,6 +179,75 @@ </list> </para> +<para> +The following parameters configure logging to syslog: +<list type="tag"> + +<tag-name><literal>server=</literal><value>address</value></tag-name> +<tag-desc> +Defines an address of a syslog server. +An address can be specified as a domain name or IP address, +and an optional port, or as a UNIX-domain socket path +specified after the “<literal>unix:</literal>” prefix. +If port is not specified, the port 514 is used. +If a domain name resolves to several IP addresses, the first resolved +address is used. +</tag-desc> + +<tag-name><literal>facility=</literal><value>string</value></tag-name> +<tag-desc> +Sets facility of syslog messages, as defined in +<link url="http://tools.ietf.org/html/rfc3164#section-4.1.1">RFC 3164</link>. +Facility can be one of “<literal>kern</literal>”, “<literal>user</literal>”, +“<literal>mail</literal>”, “<literal>daemon</literal>”, +“<literal>auth</literal>”, “<literal>intern</literal>”, +“<literal>lpr</literal>”, “<literal>news</literal>”, “<literal>uucp</literal>”, +“<literal>clock</literal>”, “<literal>authpriv</literal>”, +“<literal>ftp</literal>”, “<literal>ntp</literal>”, “<literal>audit</literal>”, +“<literal>alert</literal>”, “<literal>cron</literal>”, +“<literal>local0</literal>”..“<literal>local7</literal>”. +Default is “<literal>local7</literal>”. +</tag-desc> + +<tag-name><literal>severity=</literal><value>string</value></tag-name> +<tag-desc> +Sets severity of syslog messages, as defined in +<link url="http://tools.ietf.org/html/rfc3164#section-4.1.1">RFC 3164</link>. +Possible values are the same as for the second parameter (level) of the +<link doc="../ngx_core_module.xml" id="error_log"/> directive. +Default is “<literal>info</literal>”. +</tag-desc> + +<tag-name><literal>tag=</literal><value>string</value></tag-name> +<tag-desc> +Sets tag of syslog messages. +Default is “<literal>nginx</literal>”. +</tag-desc> + +<!-- +<tag-name><literal>bare=</literal><literal>on</literal> | +<literal>off</literal></tag-name> +<tag-desc> +If enabled, messages are sent without syslog headers. +Default is <literal>off</literal>. +</tag-desc> +--> + +</list> +Example syslog configuration: +<example> +access_log syslog:server=192.168.1.1; +access_log syslog:server=unix:/var/log/nginx.sock; +access_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx,severity=info combined; +</example> +</para> + +<para> +<note> +Logging to syslog is available as part of our <commercial_version/> only. +</note> +</para> + </directive>
--- a/xml/en/docs/http/ngx_http_mp4_module.xml Wed Jul 31 23:46:04 2013 +0400 +++ b/xml/en/docs/http/ngx_http_mp4_module.xml Thu Aug 01 16:31:02 2013 +0400 @@ -9,7 +9,7 @@ <module name="Module ngx_http_mp4_module" link="/en/docs/http/ngx_http_mp4_module.html" lang="en" - rev="1"> + rev="2"> <section id="summary"> @@ -100,8 +100,10 @@ <example> location /video/ { mp4; - mp4_buffer_size 1m; - mp4_max_buffer_size 5m; + mp4_buffer_size 1m; + mp4_max_buffer_size 5m; + mp4_limit_rate on; + mp4_limit_rate_after 30s; } </example> </para> @@ -158,6 +160,53 @@ </directive> + +<directive name="mp4_limit_rate"> +<syntax> + <literal>on</literal> | + <literal>off</literal> | + <value>factor</value></syntax> +<default>off</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +Enables or disables rate limiting based on an average bitrate of the +MP4 file served. +To calculate the rate, bitrate is multiplied by the specified +<value>factor</value>. +The special value “<literal>on</literal>” corresponds to a factor of 1.1. +</para> + +<para> +<note> +This directive is available as part of our <commercial_version/> only. +</note> +</para> + +</directive> + + +<directive name="mp4_limit_rate_after"> +<syntax><value>time</value></syntax> +<default>1m</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +Limits rate after sending the specified amount of media data. +</para> + +<para> +<note> +This directive is available as part of our <commercial_version/> only. +</note> +</para> + +</directive> + </section> </module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/en/docs/http/ngx_http_session_log_module.xml Thu Aug 01 16:31:02 2013 +0400 @@ -0,0 +1,155 @@ +<?xml version="1.0"?> + +<!-- + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> + +<module name="Module ngx_http_session_log_module" + link="/en/docs/http/ngx_http_session_log_module.html" + lang="en" + rev="1"> + +<section id="summary"> + +<para> +The module <literal>ngx_http_session_log_module</literal> allows to log +sessions (i.e. aggregates of multiple HTTP requests) instead of +individual HTTP requests. +</para> + +<para> +<note> +This module is available as part of our <commercial_version/> only. +</note> +</para> + +</section> + + +<section id="example" name="Example Configuration"> + +<para> +Log sessions based on client address and <header>User-Agent</header> +request header field: +<example> + session_log_zone /path/to/log format=combined + zone=one:1m timeout=30s + md5=$binary_remote_addr$http_user_agent; + + location /media/ { + session_log one; + } +</example> +</para> + +</section> + + +<section id="directives" name="Directives"> + +<directive name="session_log_format"> +<syntax> + <value>name</value> + <value>string</value> ...</syntax> +<default>combined "..."</default> +<context>http</context> + +<para> +Specifies format of a log. +Value of the <var>$body_bytes_sent</var> variable is aggregated across +all requests in the session. +Everything else corresponds to the first request that started a session. +</para> + +</directive> + + +<directive name="session_log_zone"> +<syntax> + <value>path</value> + <literal>zone</literal>=<value>name</value>:<value>size</value> + [<literal>format</literal>=<value>format</value>] + [<literal>timeout</literal>=<value>time</value>] + [<literal>id</literal>=<value>id</value>] + [<literal>md5</literal>=<value>md5</value>] +</syntax> +<default/> +<context>http</context> + +<para> +Sets path to log file and shared memory zone used to store currently active +sessions. +</para> + +<para> +Sessions are considered active for as long as the time elapsed since +the last request in the session does not exceed a specified +<literal>timeout</literal> (by default, 30 seconds). +Session is logged once it is no longer active. +</para> + +<para> +Requests are mapped into sessions based on the value of the +<literal>id</literal> parameter. +If <literal>id</literal> is not specified or does not represent the valid +MD5 hash, a new session is created using MD5 hash computed from the value +of the <literal>md5</literal> parameter. +Both <literal>id</literal> and <literal>md5</literal> parameters +can contain variables. +</para> + +<para> +The <literal>format</literal> parameter can be used to set custom session log +format. +If <literal>format</literal> is not specified then the predefined format +“<literal>combined</literal>” is used. +</para> + +</directive> + + +<directive name="session_log"> +<syntax><value>name</value> | <literal>off</literal></syntax> +<default>off</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +Use the specified session log. +The special value <literal>off</literal> cancels all +<literal>session_log</literal> directives inherited from the previous +configuration level. +</para> + +</directive> + +</section> + + +<section id="variables" name="Embedded Variables"> + +<para> +The <literal>ngx_http_session_log_module</literal> module supports +two embedded variables: + +<list type="tag"> + +<tag-name><var>$session_log_id</var></tag-name> +<tag-desc> +current session ID; +</tag-desc> + +<tag-name><var>$session_log_binary_id</var></tag-name> +<tag-desc> +current session ID in binary form (16 bytes). +</tag-desc> + +</list> +</para> + +</section> + +</module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/en/docs/http/ngx_http_status_module.xml Thu Aug 01 16:31:02 2013 +0400 @@ -0,0 +1,314 @@ +<?xml version="1.0"?> + +<!-- + Copyright (C) Nginx, Inc. + --> + +<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> + +<module name="Module ngx_http_status_module" + link="/en/docs/http/ngx_http_status_module.html" + lang="en" + rev="1"> + +<section id="summary"> + +<para> +The module <literal>ngx_http_status_module</literal> provides +access to various status information. +</para> + +<para> +<note> +This module is available as part of our <commercial_version/> only. +</note> +</para> + +</section> + + +<section id="example" name="Example Configuration"> + +<para> +<example> +location = /status { + status; +} +</example> +</para> + +<para> +The simple monitoring page is shipped with this distribution, +accessible as “<literal>/status.html</literal>” in the default configuration. +It requires the location “<literal>/status</literal>” to be configured +as shown above. +</para> + +</section> + + +<section id="directives" name="Directives"> + +<directive name="status"> +<syntax/> +<default/> +<context>location</context> + +<para> +The status information will be accessible from the surrounding location. +</para> + +</directive> + + +<directive name="status_format"> +<syntax><literal>json</literal></syntax> +<syntax><literal>jsonp</literal> [<value>callback</value>]</syntax> +<default>json</default> +<context>http</context> +<context>server</context> +<context>location</context> + +<para> +By default, status information is output in the JSON format. +</para> + +<para> +Alternatively, data may be output as JSONP. +The <value>callback</value> parameter specifies the name of a callback function. +The value can contain variables. +If parameter is omitted, or the computed value is an empty string, +then “<literal>ngx_status_jsonp_callback</literal>” is used. +</para> + +</directive> + +</section> + + +<section id="data" name="Data"> + +<para> +The following status information is provided: +<list type="tag"> + +<tag-name><literal>version</literal></tag-name> +<tag-desc> +Version of the provided data set. +The current version is 1. +</tag-desc> + +<tag-name><literal>nginx_version</literal></tag-name> +<tag-desc> +Version of nginx. +</tag-desc> + +<tag-name><literal>address</literal></tag-name> +<tag-desc> +An address of the server that accepted status request. +</tag-desc> + +<tag-name><literal>timestamp</literal></tag-name> +<tag-desc> +Current time in milliseconds since Epoch. +</tag-desc> + +<tag-name><literal>connections</literal></tag-name> +<tag-desc> +<list type="tag"> + +<tag-name><literal>accepted</literal></tag-name> +<tag-desc> +The total number of accepted client connections. +</tag-desc> + +<tag-name><literal>dropped</literal></tag-name> +<tag-desc> +The total number of dropped client connections. +</tag-desc> + +<tag-name><literal>active</literal></tag-name> +<tag-desc> +The current number of active client connections. +</tag-desc> + +<tag-name><literal>idle</literal></tag-name> +<tag-desc> +The current number of idle client connections. +</tag-desc> + +</list> +</tag-desc> + +<tag-name><literal>requests</literal></tag-name> +<tag-desc> +<list type="tag"> + +<tag-name><literal>total</literal></tag-name> +<tag-desc> +The total number of client requests. +</tag-desc> + +<tag-name><literal>current</literal></tag-name> +<tag-desc> +The current number of client requests. +</tag-desc> + +</list> +</tag-desc> + +<tag-name><literal>upstreams</literal></tag-name> +<tag-desc> +For each +<link doc="ngx_http_upstream_module.xml" id="server"/> +in the +<link doc="ngx_http_upstream_module.xml" id="zone">dynamically +configurable</link> +<link doc="ngx_http_upstream_module.xml" id="upstream">group</link>, +the following data are provided: +<list type="tag"> + +<tag-name><literal>server</literal></tag-name> +<tag-desc> +An address of the +<link doc="ngx_http_upstream_module.xml" id="server"/>. +</tag-desc> + +<tag-name><literal>weight</literal></tag-name> +<tag-desc> +Weight of the +<link doc="ngx_http_upstream_module.xml" id="server"/>. +</tag-desc> + +<tag-name><literal>state</literal></tag-name> +<tag-desc> +Current state, which may be one of +“<literal>up</literal>”, +“<literal>down</literal>”, +“<literal>unavail</literal>”, +or +“<literal>unhealthy</literal>”. +</tag-desc> + +<tag-name><literal>active</literal></tag-name> +<tag-desc> +The current number of active connections. +</tag-desc> + +<tag-name><literal>keepalive</literal></tag-name> +<tag-desc> +The current number of +idle <link doc="ngx_http_upstream_module.xml" id="keepalive"/> connections. +</tag-desc> + +<tag-name><literal>requests</literal></tag-name> +<tag-desc> +The total number of +client requests forwarded to this server. +</tag-desc> + +<tag-name><literal>responses</literal></tag-name> +<tag-desc> +<list type="tag"> + +<tag-name><literal>total</literal></tag-name> +<tag-desc> +The total number of +responses obtained from this server. +</tag-desc> + +<tag-name> +<literal>1xx</literal>, +<literal>2xx</literal>, +<literal>3xx</literal>, +<literal>4xx</literal>, +<literal>5xx</literal> +</tag-name> +<tag-desc> +The number of responses with status codes 1xx, 2xx, 3xx, 4xx, and 5xx. +</tag-desc> + +</list> +</tag-desc> + +<tag-name><literal>sent</literal></tag-name> +<tag-desc> +The total bytes sent to this server. +</tag-desc> + +<tag-name><literal>received</literal></tag-name> +<tag-desc> +The total bytes received from this server. +</tag-desc> + +<tag-name><literal>fails</literal></tag-name> +<tag-desc> +The total number of +unsuccessful attempts to communicate with the server. +</tag-desc> + +<tag-name><literal>unavail</literal></tag-name> +<tag-desc> +How many times +the server became unavailable for client requests +(state “<literal>unavail</literal>”) +due to the number of unsuccessful attempts reaching +the <literal>max_fails</literal> threshold. +</tag-desc> + +<tag-name><literal>health_checks</literal></tag-name> +<tag-desc> +<list type="tag"> + +<tag-name><literal>checks</literal></tag-name> +<tag-desc> +The total number of +<link doc="ngx_http_upstream_module.xml" id="health_check">health check</link> +requests made. +</tag-desc> + +<tag-name><literal>fails</literal></tag-name> +<tag-desc> +The number of failed health checks. +</tag-desc> + +<tag-name><literal>unhealthy</literal></tag-name> +<tag-desc> +How many times +the server became unhealthy (state “<literal>unhealthy</literal>”). +</tag-desc> + +<tag-name><literal>last_passed</literal></tag-name> +<tag-desc> +Boolean indicating +if the last health check request was successful and passed +<link doc="ngx_http_upstream_module.xml" id="match">tests</link>. +</tag-desc> + +</list> +</tag-desc> + +</list> +</tag-desc> + +<tag-name><literal>downtime</literal></tag-name> +<tag-desc> +Total time +the server was in the “<literal>unavail</literal>” +and “<literal>unhealthy</literal>” states. +</tag-desc> + +<tag-name><literal>downstart</literal></tag-name> +<tag-desc> +The time (in milliseconds since Epoch) +when the server became +“<literal>unavail</literal>” +or “<literal>unhealthy</literal>”. +</tag-desc> + +</list> +</para> + +</section> + +</module>
--- a/xml/en/docs/http/ngx_http_upstream_module.xml Wed Jul 31 23:46:04 2013 +0400 +++ b/xml/en/docs/http/ngx_http_upstream_module.xml Thu Aug 01 16:31:02 2013 +0400 @@ -10,7 +10,7 @@ <module name="Module ngx_http_upstream_module" link="/en/docs/http/ngx_http_upstream_module.html" lang="en" - rev="4"> + rev="5"> <section id="summary"> @@ -46,6 +46,36 @@ </example> </para> +<para> +Dynamically configurable group, +available as part of our <commercial_version/> only: +<example> +upstream <emphasis>appservers</emphasis> { + zone appservers 64k; + + server appserv1.example.com weight=5; + server appserv2.example.com:8080 fail_timeout=5s; + server 192.0.2.1 max_fails=3; + + server reserve1.example.com:8080 backup; + server reserve2.example.com:8080 backup; +} + +server { + location / { + proxy_pass http://<emphasis>appservers</emphasis>; + health_check; + } + + location /upstream_conf { + upstream_conf; + allow 127.0.0.1; + deny all; + } +} +</example> +</para> + </section> @@ -180,6 +210,30 @@ </directive> +<directive name="zone"> +<syntax><value>name</value> <value>size</value></syntax> +<default/> +<context>upstream</context> + +<para> +Makes the group dynamically configurable. +Defines the <value>name</value> and <value>size</value> of a shared +memory zone that keeps group’s configuration and run-time state that are +shared between worker processes. +Such groups allow to add, remove, and modify servers at run time. +The configuration is accessible via a special location handled by +<link id="upstream_conf"/>. +</para> + +<para> +<note> +This directive is available as part of our <commercial_version/> only. +</note> +</para> + +</directive> + + <directive name="ip_hash"> <syntax/> <default/> @@ -364,6 +418,640 @@ </directive> + +<directive name="health_check"> +<syntax> + [<literal>interval=</literal><value>time</value>] +<!-- + [<literal>jitter=</literal><value>time</value>] +--> + [<literal>fails=</literal><value>number</value>] + [<literal>passes=</literal><value>number</value>] + [<literal>uri=</literal><value>uri</value>] + [<literal>match=</literal><value>name</value>]</syntax> + +<default/> +<context>location</context> + +<para> +Enables periodic health checks of servers in a +<link id="upstream">group</link> referenced in the surrounding location. +</para> + +<para> +The following optional parameters are supported: +<list type="bullet"> + +<listitem> +<literal>interval</literal> +sets interval between two consecutive health checks, +defaults to five seconds; +</listitem> + +<listitem> +<literal>fails</literal> +sets a number of consecutive failed health checks +after which the server will be considered unhealthy, +defaults to 1; +</listitem> + +<listitem> +<literal>passes</literal> +sets a number of consecutive passed health checks +after which the server will be considered healthy, +defaults to 1; +</listitem> + +<listitem> +<literal>uri</literal> +defines the URI used in health check requests, +defaults to “<literal>/</literal>”; +</listitem> + +<listitem> +<literal>match</literal> +names tests that a response should +pass in order for a health check to pass, +defaults to responses with status codes 2xx and 3xx. +</listitem> + +</list> +</para> + +<para> +For example, +<example> +location / { + proxy_pass http://backend; + health_check; +} +</example> +will send “<literal>/</literal>” requests to each +server in the group <literal>backend</literal> every five seconds. +If any communication errors or timeouts occur, or if a +proxied server responds with the status code other than +2xx or 3xx, health check will fail, and the server will +become unhealthy. +Client requests will not be passed to unhealthy servers. +</para> + +<para> +Health checks can be configured to test status code of a response, +presence of certain header fields and their values, +and/or the body contents. +Tests are configured separately with the <link id="match"/> directives +and referenced in the <literal>match</literal> parameter. +For example, +<example> +http { + server { + ... + location / { + proxy_pass http://backend; + health_check match=welcome; + } + } + + match welcome { + status 200; + header Content-Type = text/html; + body ~ "Welcome to nginx!"; + } +} +</example> +tells that for a health check to pass, a response should succeed, +have status 200, content type “<literal>text/html</literal>”, +and contain “<literal>Welcome to nginx!</literal>” in the body. +</para> + +<para> +It is required that a group be in <link id="zone">shared memory</link>. +</para> + +<para> +If several health checks are defined for the same group of servers, +a single failure of any check will make the corresponding server +to become unhealthy. +</para> + +<para> +<note> +This directive is available as part of our <commercial_version/> only. +</note> +</para> + +</directive> + + +<directive name="match"> +<syntax block="yes"><value>name</value></syntax> +<default/> +<context>http</context> + +<para> +Defines the named test set used to verify responses to health check requests. +</para> + +<para> +The following can be tested in a response: +<list type="tag"> + +<tag-name><literal>status 200;</literal></tag-name> +<tag-desc>status is 200</tag-desc> + +<tag-name><literal>status ! 500;</literal></tag-name> +<tag-desc>status is not 500</tag-desc> + +<tag-name><literal>status 200 204;</literal></tag-name> +<tag-desc>status is 200 or 204</tag-desc> + +<tag-name><literal>status ! 301 302;</literal></tag-name> +<tag-desc>status is neither 301 nor 302</tag-desc> + +<tag-name><literal>status 200-399;</literal></tag-name> +<tag-desc>status is in the 200..399 range</tag-desc> + +<tag-name><literal>status ! 400-599;</literal></tag-name> +<tag-desc>status is not in the 400..599 range</tag-desc> + +<tag-name><literal>status 301-303 307;</literal></tag-name> +<tag-desc>status is one of 301, 302, 303, or 307</tag-desc> + +</list> + +<list type="tag"> + +<tag-name><literal>header Content-Type = text/html;</literal></tag-name> +<tag-desc> +header contains <header>Content-Type</header> +with value <literal>text/html</literal> +</tag-desc> + +<tag-name><literal>header Content-Type != text/html;</literal></tag-name> +<tag-desc> +header contains <header>Content-Type</header> +with value other than <literal>text/html</literal> +</tag-desc> + +<tag-name><literal>header Connection ~ close;</literal></tag-name> +<tag-desc> +header contains <header>Connection</header> +with value matching regular expression <literal>close</literal> +</tag-desc> + +<tag-name><literal>header Connection !~ close;</literal></tag-name> +<tag-desc> +header contains <header>Connection</header> +with value not matching regular expression <literal>close</literal> +</tag-desc> + +<tag-name><literal>header Host;</literal></tag-name> +<tag-desc>header contains <header>Host</header></tag-desc> + +<tag-name><literal>header ! X-Accel-Redirect;</literal></tag-name> +<tag-desc>header lacks <header>X-Accel-Redirect</header></tag-desc> + +</list> + +<list type="tag"> + +<tag-name><literal>body ~ "Welcome to nginx!";</literal></tag-name> +<tag-desc> +body matches regular expression “<literal>Welcome to nginx!</literal>” +</tag-desc> + +<tag-name><literal>body !~ "Welcome to nginx!";</literal></tag-name> +<tag-desc> +body does not match regular expression “<literal>Welcome to nginx!</literal>” +</tag-desc> + +</list> +</para> + +<para> +If several tests are specified, +the response matches only if it passes all tests. +<note> +Only the first 256k of body are examined. +</note> +</para> + +<para> +Examples: +<example> +# status is 200, content type is "text/html", +# and body contains "Welcome to nginx!" +match welcome { + status 200; + header Content-Type = text/html; + body ~ "Welcome to nginx!"; +} +</example> + +<example> +# status is not one of 301, 302, 303, or 307, and header does not have "Refresh:" +match not_redirect { + status ! 301-303 307; + header ! Refresh; +} +</example> + +<example> +# status ok and not in maintenance mode +match server_ok { + status 200-399; + body !~ "maintenance mode"; +} +</example> + +</para> + +<para> +<note> +This directive is available as part of our <commercial_version/> only. +</note> +</para> + +</directive> + + +<directive name="sticky"> +<syntax/> +<default/> +<context>upstream</context> + +<para> +Enables session affinity support. +The session is an object that is used to uniquely identify and maintain the +state of a client during a given period of time. +If session affinity is enabled, a client’s requests are always passed to the +same server (in a group of servers) once a session has been created. +Method used to create and track sessions must be specified by a separate +directive, for example, <link id="sticky_cookie_insert"/>. +<example> +upstream backend { + server backend1.example.com; + server backend2.example.com; + + sticky; + sticky_cookie_insert "sticky"; +} + +server { + location / { + proxy_pass http://backend; + } +} +</example> +The directive must be specified after the <link id="ip_hash"/> or the +<link id="least_conn"/> directives. +</para> + +<para> +Requests are processed as follows with the session affinity enabled: +<list type="enum"> + +<listitem> +The lookup of session corresponding to request is performed. +If the session is found, server identification data is extracted from it. +This data is used by the server selection algorithm. +</listitem> + +<listitem> +The server to process the request is chosen according to the configured +balancing method, server information from session and the real state of +servers in a group (up or down, failed, etc.). +</listitem> + +<listitem> +The request is passed to the chosen server for processing. +If the chosen server does not match specified in the session +(due to being down, for example), the session is cleared +and the request is processed as it had no session. +</listitem> + +<listitem> +The server returns the response. +</listitem> + +<listitem> +If there was no session for the request, new session +is created and server identification data is stored in it. +</listitem> + +</list> +</para> + +<para> +<note> +This directive is available as part of our <commercial_version/> only. +</note> +</para> + +</directive> + + +<directive name="sticky_cookie_insert"> +<syntax><value>name</value> +[<literal>expires=</literal><value>time</value>] +[<literal>domain=</literal><value>host</value>] +[<literal>path=</literal><value>path</value>]</syntax> +<default/> +<context>upstream</context> + +<para> +Enables and configures the session tracking method, based on keeping +session information in HTTP cookies. +The directive must be specified after the <link id="ip_hash"/> or the +<link id="least_conn"/> directives. +Example: +<example> +sticky_cookie_insert "srv_id" "expires=1h 7m" domain=example.com path=/; +</example> +The first parameter sets the name of the cookie to be inserted or inspected. +Additional parameters may be as follows: +<list type="tag"> + +<tag-name><literal>expires</literal></tag-name> +<tag-desc> +Sets a time during which a browser should keep the cookie. +The parameter “<literal>max</literal>” sets the time to +“<literal>31 Dec 2037 23:55:55 GMT</literal>”. +This is the maximum time understood by old browsers. +</tag-desc> + +<tag-name><literal>domain</literal></tag-name> +<tag-desc> +Defines a domain for which the cookie is set. +</tag-desc> + +<tag-name><literal>path</literal></tag-name> +<tag-desc> +Defines a path for which the cookie is set. +</tag-desc> + +</list> +If some parameter is omitted, then the corresponding cookie field is not set. +</para> + +<para> +<note> +This directive is available as part of our <commercial_version/> only. +</note> +</para> + +</directive> + + +<directive name="sticky_log_requests"> +<syntax><literal>debug</literal> | +<literal>info</literal> | +<literal>notice</literal> | +<literal>warn</literal> | +<literal>error</literal></syntax> +<default/> +<context>upstream</context> + +<para> +Enables logging of session-related operations and sets the desired +logging level. +</para> + +<para> +<note> +This directive is available as part of our <commercial_version/> only. +</note> +</para> + +</directive> + + +<directive name="upstream_conf"> +<syntax/> +<default/> +<context>location</context> + +<para> +Turns on upstream configuration HTTP interface in a surrounding location. +Access to this location should be +<link doc="ngx_http_core_module.xml" id="satisfy">limited</link>. +</para> + +<para> +Configuration commands allow to: +<list type="bullet"> + +<listitem>view all primary or backup servers in a group;</listitem> + +<listitem>view an individual server;</listitem> + +<listitem>modify an individual server;</listitem> + +<listitem>add a new server (see note below);</listitem> + +<listitem>remove an individual server.</listitem> + +</list> +<note> +As noted in the <link id="server"/> directive, adding a server specified +as a domain name may result in several servers being added. +Since addresses in a group are not required to be unique, individual +servers in a group can be uniquely referenced to only by their ID. +IDs are assigned automatically and shown when viewing group configuration. +</note> +</para> + +<para> +A command consists of parameters passed as request arguments, for example: +<example> +http://127.0.0.1/upstream_conf?upstream=appservers +</example> +</para> + +<para> +The following parameters are supported: + +<list type="tag" compact="no"> + +<tag-name> +<literal>upstream=</literal><value>name</value></tag-name> +<tag-desc> +Selects a group. +This parameter is mandatory. +</tag-desc> + +<tag-name> +<literal>backup=</literal> +</tag-name> +<tag-desc> +If unset, selects primary servers in the group. +If set, selects backup servers in the group. +</tag-desc> + +<tag-name> +<literal>id=</literal><value>number</value></tag-name> +<tag-desc> +Selects an individual primary or backup server in the group. +</tag-desc> + +<tag-name> +<literal>remove=</literal></tag-name> +<tag-desc> +Removes an individual primary or backup server from the group. +</tag-desc> + +<tag-name> +<literal>add=</literal></tag-name> +<tag-desc> +Adds a new primary or backup server to the group. +</tag-desc> + +<tag-name> +<literal>server=</literal><value>address</value></tag-name> +<tag-desc> +Same as the “<literal>address</literal>” parameter +of the <link id="server"/> directive. +</tag-desc> + +<tag-name> +<literal>weight=</literal><value>number</value></tag-name> +<tag-desc> +Same as the “<literal>weight</literal>” parameter +of the <link id="server"/> directive. +</tag-desc> + +<tag-name> +<literal>max_fails=</literal><value>number</value></tag-name> +<tag-desc> +Same as the “<literal>max_fails</literal>” parameter +of the <link id="server"/> directive. +</tag-desc> + +<tag-name> +<literal>fail_timeout=</literal><value>time</value></tag-name> +<tag-desc> +Same as the “<literal>fail_timeout</literal>” parameter +of the <link id="server"/> directive. +</tag-desc> + +<tag-name> +<literal>down=</literal></tag-name> +<tag-desc> +Same as the “<literal>down</literal>” parameter +of the <link id="server"/> directive. +</tag-desc> + +<tag-name> +<literal>up=</literal></tag-name> +<tag-desc> +The opposite of the “<literal>down</literal>” parameter +of the <link id="server"/> directive. +</tag-desc> + +</list> + +The first three parameters select a target the command applies to. +Without other parameters, configuration of the selected target +is shown. +</para> + +<para> +For example, to view the primary servers in the group: +<example> +http://127.0.0.1/upstream_conf?upstream=appservers +</example> + +To view the backup servers in the group: +<example> +http://127.0.0.1/upstream_conf?upstream=appservers&backup= +</example> + +To view an individual primary server in the group: +<example> +http://127.0.0.1/upstream_conf?upstream=appservers&id=42 +</example> + +To view an individual backup server in the group: +<example> +http://127.0.0.1/upstream_conf?upstream=appservers&backup=&id=42 +</example> +</para> + +<para> +To add a new primary or backup server to the group, +its address should be specified in the “<literal>server=</literal>” parameter. +Without other parameters specified, a server will be added with other +parameters set to their default values (see the <link id="server"/> directive). +</para> + +<para> +For example, to add a new primary server to the group: +<example> +http://127.0.0.1/upstream_conf?add=&upstream=appservers&server=127.0.0.1:8080 +</example> + +To add a new backup server to the group: +<example> +http://127.0.0.1/upstream_conf?add=&upstream=appservers&backup=&server=127.0.0.1:8080 +</example> + +To add a new primary server to the group, +set its parameters to non-default values +and mark it “<literal>down</literal>”: +<example> +http://127.0.0.1/upstream_conf?add=&upstream=appservers&server=127.0.0.1:8080&weight=2&max_fails=3&fail_timeout=3s&down= +</example> +</para> + +<para> +To remove an individual primary or backup server from the group, +it should be selected with the <literal>id=</literal> parameter. +</para> + +<para> +For example, to remove an individual primary server from the group: +<example> +http://127.0.0.1/upstream_conf?remove=&upstream=appservers&id=42 +</example> + +To remove an individual backup server from the group: +<example> +http://127.0.0.1/upstream_conf?remove=&upstream=appservers&backup=&id=42 +</example> +</para> + +<para> +To modify an individual primary or backup server in the group, +it should be selected with the <literal>id=</literal> parameter. +</para> + +<para> +For example, to modify an individual primary server in the group +by marking it “<literal>down</literal>”: +<example> +http://127.0.0.1/upstream_conf?upstream=appservers&id=42&down= +</example> + +To modify address of an individual backup server in the group: +<example> +http://127.0.0.1/upstream_conf?upstream=appservers&backup=&id=42&server=192.0.2.3:8123 +</example> + +To modify other parameters of an individual primary server in the group: +<example> +http://127.0.0.1/upstream_conf?upstream=appservers&id=42&max_fails=3&weight=4 +</example> + +</para> + +<para> +<note> +This directive is available as part of our <commercial_version/> only. +</note> +</para> + +</directive> + </section>
--- a/xml/en/docs/index.xml Wed Jul 31 23:46:04 2013 +0400 +++ b/xml/en/docs/index.xml Thu Aug 01 16:31:02 2013 +0400 @@ -8,7 +8,7 @@ <article name="nginx documentation" link="/en/docs/" lang="en" - rev="8" + rev="9" toc="no"> @@ -196,6 +196,11 @@ </listitem> <listitem> +<link doc="http/ngx_http_f4f_module.xml"> +ngx_http_f4f_module</link> +</listitem> + +<listitem> <link doc="http/ngx_http_fastcgi_module.xml"> ngx_http_fastcgi_module</link> </listitem> @@ -236,6 +241,11 @@ </listitem> <listitem> +<link doc="http/ngx_http_hls_module.xml"> +ngx_http_hls_module</link> +</listitem> + +<listitem> <link doc="http/ngx_http_image_filter_module.xml"> ngx_http_image_filter_module</link> </listitem> @@ -311,6 +321,11 @@ </listitem> <listitem> +<link doc="http/ngx_http_session_log_module.xml"> +ngx_http_session_log_module</link> +</listitem> + +<listitem> <link doc="http/ngx_http_spdy_module.xml"> ngx_http_spdy_module</link> </listitem> @@ -331,6 +346,11 @@ </listitem> <listitem> +<link doc="http/ngx_http_status_module.xml"> +ngx_http_status_module</link> +</listitem> + +<listitem> <link doc="http/ngx_http_sub_module.xml"> ngx_http_sub_module</link> </listitem>
--- a/xml/en/docs/ngx_core_module.xml Wed Jul 31 23:46:04 2013 +0400 +++ b/xml/en/docs/ngx_core_module.xml Thu Aug 01 16:31:02 2013 +0400 @@ -10,7 +10,7 @@ <module name="Core functionality" link="/en/docs/ngx_core_module.html" lang="en" - rev="8"> + rev="9"> <section id="example" name="Example Configuration"> @@ -144,7 +144,8 @@ <directive name="error_log"> <syntax> -<value>file</value> | <literal>stderr</literal> +<value>file</value> | <literal>stderr</literal> | +<literal>syslog:</literal><literal>server</literal>=<value>address</value>[,<value>parameter</value>=<value>value</value>] [<literal>debug</literal> | <literal>info</literal> | <literal>notice</literal> | @@ -170,6 +171,8 @@ If filename is not absolute, it is prefixed with the prefix path. --> The special value <literal>stderr</literal> selects the standard error file. +Logging to syslog can be configured by specifying +the “<literal>syslog:</literal>” prefix. </para> <para> @@ -189,6 +192,66 @@ </note> </para> +<para> +The following parameters configure logging to syslog: +<list type="tag"> + +<tag-name><literal>server=</literal><value>address</value></tag-name> +<tag-desc> +Defines an address of a syslog server. +An address can be specified as a domain name or IP address, +and an optional port, or as a UNIX-domain socket path +specified after the “<literal>unix:</literal>” prefix. +If port is not specified, the port 514 is used. +If a domain name resolves to several IP addresses, the first resolved +address is used. +</tag-desc> + +<tag-name><literal>facility=</literal><value>string</value></tag-name> +<tag-desc> +Sets facility of syslog messages, as defined in +<link url="http://tools.ietf.org/html/rfc3164#section-4.1.1">RFC 3164</link>. +Facility can be one of “<literal>kern</literal>”, “<literal>user</literal>”, +“<literal>mail</literal>”, “<literal>daemon</literal>”, +“<literal>auth</literal>”, “<literal>intern</literal>”, +“<literal>lpr</literal>”, “<literal>news</literal>”, “<literal>uucp</literal>”, +“<literal>clock</literal>”, “<literal>authpriv</literal>”, +“<literal>ftp</literal>”, “<literal>ntp</literal>”, “<literal>audit</literal>”, +“<literal>alert</literal>”, “<literal>cron</literal>”, +“<literal>local0</literal>”..“<literal>local7</literal>”. +Default is “<literal>local7</literal>”. +</tag-desc> + +<tag-name><literal>tag=</literal><value>string</value></tag-name> +<tag-desc> +Sets tag of syslog messages. +Default is “<literal>nginx</literal>”. +</tag-desc> + +<!-- +<tag-name><literal>bare=</literal><literal>on</literal> | +<literal>off</literal></tag-name> +<tag-desc> +If enabled, messages are sent without syslog headers. +Default is <literal>off</literal>. +</tag-desc> +--> + +</list> +Example syslog configuration: +<example> +error_log syslog:server=192.168.1.1 debug; +error_log syslog:server=unix:/var/log/nginx.sock; +error_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx error; +</example> +</para> + +<para> +<note> +Logging to syslog is available as part of our <commercial_version/> only. +</note> +</para> + </directive>
--- a/xsls/versions.xsls Wed Jul 31 23:46:04 2013 +0400 +++ b/xsls/versions.xsls Thu Aug 01 16:31:02 2013 +0400 @@ -15,4 +15,8 @@ /versions/download[@tag='stable'][1]/item[1]/@ver"; } +X:template = "commercial_version" { + <a href="http://nginx.com/products/">commercial subscription</a> } + +}
--- a/xslt/versions.xslt Wed Jul 31 23:46:04 2013 +0400 +++ b/xslt/versions.xslt Thu Aug 01 16:31:02 2013 +0400 @@ -11,4 +11,9 @@ <xsl:apply-templates select="document(concat($XML, '/versions.xml')) /versions/download[@tag='stable'][1]/item[1]/@ver"/> </xsl:template> + <xsl:template match="commercial_version"> + + <a href="http://nginx.com/products/">commercial subscription</a> + </xsl:template> + </xsl:stylesheet>