CINXE.COM
Scripting — NGINX Unit
<!DOCTYPE html> <html> <head> <!-- TrustArc handles cookie consent and is a prerequisite for loading Tealium --> <script async="async" src="https://consent.trustarc.com/notice?domain=f5.com&c=teconsent&js=nj¬iceType=bb&text=true>m=1" crossorigin=""></script> <!-- Tealium profile utag.sync.js script --> <script src="https://mktg.tags.f5.com/nginx-unit/prod/utag.sync.js"></script> <!-- End TrustArc/Tealium --> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <!-- Open Graph / Facebook --> <meta property="og:type" content="website"> <meta property="og:url" content="https://unit.nginx.org/scripting/"> <meta property="og:title" content="NGINX Unit: Scripting"> <meta property="og:image" content="http://unit.nginx.org/_static/logo.png?e39b3bbae06cd8bdb5a7814270161b52"> <meta property="og:image:secure_url" content="https://unit.nginx.org/_static/logo.png?e39b3bbae06cd8bdb5a7814270161b52"> <meta property="og:image:width" content="988"> <meta property="og:image:height" content="357"> <meta property="og:image:alt" content="NGINX Unit logo" /> <!-- Twitter --> <meta property="twitter:card" content="summary_large_image"> <style> /* open-sans-regular - latin_latin-ext */ @font-face { font-display: swap; font-family: 'Open Sans'; font-style: normal; font-weight: 400; src: local('OpenSans'), local('Open Sans'), local('Open Sans Regular'), local('OpenSans-Regular'), url('../_static/open-sans-v40-latin_latin-ext-regular.woff2?058e68d126ca347a4db54933db4738db') format('woff2'); } /* open-sans-italic - latin_latin-ext */ @font-face { font-display: swap; font-family: 'Open Sans'; font-style: italic; font-weight: 400; src: local('OpenSansItalic'), local('Open Sans Italic'), local('OpenSans Italic'), local('OpenSans-Italic'), url('../_static/open-sans-v40-latin_latin-ext-italic.woff2?86b58c2ae26455092651312b8582674f') format('woff2'); } /* open-sans-700 - latin_latin-ext */ @font-face { font-display: swap; font-family: 'Open Sans'; font-style: normal; font-weight: 700; src: local('OpenSansBold'), local('Open Sans Bold'), local('OpenSans Bold'), local('OpenSans-Bold'), url('../_static/open-sans-v40-latin_latin-ext-700.woff2?40654e941d643aead74c5d6a56a38c6b') format('woff2'); } /* open-sans-700italic - latin_latin-ext */ @font-face { font-display: swap; font-family: 'Open Sans'; font-style: italic; font-weight: 700; src: local('OpenSansBoldItalic'), local('Open Sans Bold Italic'), local('OpenSans Bold Italic'), local('OpenSans-BoldItalic'), local('OpenSans-Bold-Italic'), url('../_static/open-sans-v40-latin_latin-ext-700italic.woff2?e4fada57efe79e0fb447a7dc076a568b') format('woff2'); } </style> <link rel="stylesheet" href="../_static/style.css?02b1052daea25a810283ecaa29bc2462" /> <link rel="icon" href="../_static/icon.png?26255dfe9094cf47412c8b5d3757467b" /> <link rel="alternate" type="application/rss+xml" title="Subscribe to NGINX Unit News" href="https://unit.nginx.org/rss.xml" /> <script async src="../_static/script.js?8dc8ff30c396ce882326156b1581000a"></script> <link rel="next" title="SSL/TLS certificates" href="../certificates/" /> <link rel="prev" title="Configuration" href="../configuration/" /> <title>Scripting — NGINX Unit</title> </head> <body> <!-- Tealium Universal Tag --> <script type="text/javascript"> (function(a,b,c,d) { a='//mktg.tags.f5.com/nginx-unit/prod/utag.js'; b=document;c='script';d=b.createElement(c);d.src=a; d.type='text/java'+c;d.async=true; a=b.getElementsByTagName(c)[0];a.parentNode.insertBefore(d,a)})(); </script> <!-- End Tealium Universal Tag --> <!-- Global banner goes here <div id="rennab"><a href="BANNER LINK">BANNER TEXT</a></div> --> <div id="main"> <div id="side"> <h1> <a href="../"> <img src="../_static/logo.svg?ea753eb2210f855447af3b2367898f85" alt="NGINX Unit" /> </a> <div id="version_link" title="Released on Feb 26, 2025"> <a style="text-decoration:none;" href="../news/2025/unit-1.34.2-released/">v. 1.34.2</a> </div> </h1> <ul class="current"> <li class="toctree-l1"><a class="reference internal" href="../">About</a></li> <li class="toctree-l1"><a class="reference internal" href="../keyfeatures/">Key features</a></li> <li class="toctree-l1"><a class="reference internal" href="../news/">News</a></li> <li class="toctree-l1"><a class="reference internal" href="../installation/">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="../controlapi/">Control API</a></li> <li class="toctree-l1"><a class="reference internal" href="../configuration/">Configuration</a></li> <li class="toctree-l1 current"><a class="current reference internal" href="#">Scripting</a><ul> <li class="toctree-l2"><a class="reference internal" href="#examples">Examples</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="../certificates/">SSL/TLS certificates</a></li> <li class="toctree-l1"><a class="reference internal" href="../statusapi/">Status API</a></li> <li class="toctree-l1"><a class="reference internal" href="../unitctl/">CLI (unitctl)</a></li> <li class="toctree-l1"><a class="reference internal" href="../howto/">How-to</a></li> <li class="toctree-l1"><a class="reference internal" href="../troubleshooting/">Troubleshooting</a></li> <li class="toctree-l1"><a class="reference internal" href="../community/">Community</a></li> </ul> </div> <div id="content"> <div class="section" id="scripting"> <h1>Scripting<a class="headerlink" href="#scripting" title="Permalink to this heading">§</a></h1> <p>NGINX Unit’s <a class="reference internal" href="../controlapi/"><span class="doc">control API</span></a> supports JavaScript expressions, including function calls, in the form of <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals">template literals</a> written in <a class="reference external" href="https://nginx.org/en/docs/njs/">NGINX JavaScript</a> ( <strong class="program">njs</strong> ). They can be used with these <a class="reference internal" href="../configuration/"><span class="doc">configuration</span></a> options:</p> <ul class="simple"> <li><strong>pass</strong> in <a class="reference internal" href="../configuration/#configuration-listeners"><span class="std std-ref">listeners</span></a> and <a class="reference internal" href="../configuration/#configuration-routes-action"><span class="std std-ref">actions</span></a> to choose between routes, applications, app targets, or upstreams.</li> <li><strong>response_headers</strong> values in <a class="reference internal" href="../configuration/#configuration-routes-action"><span class="std std-ref">actions</span></a> to manipulate response header fields.</li> <li><strong>rewrite</strong> in <a class="reference internal" href="../configuration/#configuration-routes-action"><span class="std std-ref">actions</span></a> to enable <a class="reference internal" href="../configuration/#configuration-rewrite"><span class="std std-ref">URI rewriting</span></a>.</li> <li><strong>share</strong> and <strong>chroot</strong> in <a class="reference internal" href="../configuration/#configuration-routes-action"><span class="std std-ref">actions</span></a> to control <a class="reference internal" href="../configuration/#configuration-static"><span class="std std-ref">static content serving</span></a>.</li> <li><strong>location</strong> in <strong>return</strong> <a class="reference internal" href="../configuration/#configuration-return"><span class="std std-ref">actions</span></a> to enable HTTP redirects.</li> <li><strong>format</strong> in the <a class="reference internal" href="../configuration/#custom-log-format"><span class="std std-ref">access log</span></a> to customize Unit’s log output.</li> <li><strong>if</strong> in the <a class="reference internal" href="../configuration/#id2"><span class="std std-ref">access log</span></a> to dynamically turn Unit’s logging on and off.</li> </ul> <p>As its JavaScript engine, Unit uses the <strong class="program">njs</strong> library, shipped with the <a class="reference internal" href="../installation/#installation-precomp-pkgs"><span class="std std-ref">official packages</span></a> or <a class="reference internal" href="../howto/source/#source-njs"><span class="std std-ref">built from source</span></a>.</p> <div class="admonition warning"> <p class="first admonition-title">Warning</p> <p class="last">Unit 1.32.0 and later require <a class="reference external" href="https://nginx.org/en/docs/njs/changes.html">njs 0.8.2</a>.</p> </div> <p>Some request properties are exposed as <strong class="program">njs</strong> objects or scalars:</p> <table border="1" class="docutils align-default"> <colgroup> <col width="33%" /> <col width="33%" /> <col width="33%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">Name</th> <th class="head">Type</th> <th class="head">Description</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td><strong>args</strong></td> <td>Object</td> <td>Query string arguments; <strong>Color=Blue</strong> is <strong>args.Color</strong>; can be used with <strong>Object.keys()</strong>.</td> </tr> <tr class="row-odd"><td><strong>cookies</strong></td> <td>Object</td> <td>Request cookies; an <strong>authID</strong> cookie is <strong>cookies.authID</strong>; can be used with <strong>Object.keys()</strong>.</td> </tr> <tr class="row-even"><td><strong>headers</strong></td> <td>Object</td> <td>Request header fields; <strong>Accept</strong> is <strong>headers.Accept</strong>, <strong>Content-Encoding</strong> is <strong>headers[‘Content-Encoding’]</strong> (hyphen requires an array property accessor); can be used with <strong>Object.keys()</strong>.</td> </tr> <tr class="row-odd"><td><strong>host</strong></td> <td>Scalar</td> <td><strong>Host</strong> <a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc7230#section-5.4">header field</a>, converted to lower case and normalized by removing the port number and the trailing period (if any).</td> </tr> <tr class="row-even"><td><strong>remoteAddr</strong></td> <td>Scalar</td> <td>Remote IP address of the request.</td> </tr> <tr class="row-odd"><td><strong>uri</strong></td> <td>Scalar</td> <td><a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc7230#section-5.3">Request target</a>, <a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc3986#section-2.1">percent decoded</a> and normalized by removing the <a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4">query string</a> and resolving <a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc3986#section-4.2">relative references</a> (“.” and “..”, “//”).</td> </tr> <tr class="row-even"><td><strong>vars</strong></td> <td>Object</td> <td>Unit <a class="reference internal" href="../configuration/#configuration-variables"><span class="std std-ref">variables</span></a>; vars.method is <strong>$method</strong>.</td> </tr> </tbody> </table> <p>Template literals are wrapped in backticks. To use a literal backtick in a string, escape it: <strong>\\`</strong> (escaping backslashes is a <a class="reference external" href="https://www.json.org/json-en.html">JSON requirement</a>). The <strong class="program">njs</strong> snippets should be enclosed in curly brackets: <strong>${…}</strong>.</p> <p>Next, you can upload and use custom JavaScript modules with your configuration. Consider this <strong>http.js</strong> script that distinguishes requests by their <strong>Authorization</strong> header field values:</p> <div class="highlight-javascript notranslate"><div class="highlight"><pre><span></span><span class="kd">var</span><span class="w"> </span><span class="nx">http</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{}</span> <span class="nx">http</span><span class="p">.</span><span class="nx">route</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kd">function</span><span class="p">(</span><span class="nx">headers</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nx">authorization</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">headers</span><span class="p">[</span><span class="s1">'Authorization'</span><span class="p">];</span> <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">authorization</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nx">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">atob</span><span class="p">(</span><span class="nx">authorization</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">' '</span><span class="p">)[</span><span class="mf">1</span><span class="p">]);</span> <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nb">String</span><span class="p">(</span><span class="nx">user</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'user:password'</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s1">'accept'</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s1">'forbidden'</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s1">'unauthorized'</span><span class="p">;</span> <span class="p">}</span> <span class="k">export</span><span class="w"> </span><span class="k">default</span><span class="w"> </span><span class="nx">http</span> </pre></div> </div> <p>To upload it to Unit’s JavaScript module storage as <strong>http</strong>, run the following command as root:</p> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp"># </span>curl<span class="w"> </span>-X<span class="w"> </span>PUT<span class="w"> </span>--data-binary<span class="w"> </span>@http.js<span class="w"> </span>--unix-socket<span class="w"> </span><span class=nxt_ph title="Path to the remote control socket">/path/to/control.unit.sock</span><span class="w"> </span><span class="se">\</span> <span class="w"> </span>http://localhost/js_modules/<span class=nxt_ph title="Module name in Unit's configuration">http</span> </pre></div> </div> <p>Unit doesn’t enable the uploaded modules by default, so add the module’s name to <strong>settings/js_module</strong> running the following command as root:</p> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp"># </span>curl<span class="w"> </span>-X<span class="w"> </span>PUT<span class="w"> </span>-d<span class="w"> </span><span class="s1">'"<span class=nxt_ph title="Module name to be enabled">http</span>"'</span><span class="w"> </span><span class=nxt_ph title="Path to the remote control socket">/path/to/control.unit.sock</span><span class="w"> </span><span class="se">\</span> <span class="w"> </span>http://localhost/config/settings/js_module </pre></div> </div> <div class="admonition note"> <p class="first admonition-title">Note</p> <p class="last">Please note that the <strong>js_module</strong> option can be a string or an array; choose the appropriate HTTP method.</p> </div> <p>Now, the <strong>http.route()</strong> function can be used with Unit-supplied header field values:</p> <div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> <span class="w"> </span><span class="nt">"routes"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"entry"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"action"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"pass"</span><span class="p">:</span><span class="w"> </span><span class="s2">"<span class="sb">`routes/</span><span class="si">${</span><span class="nx">http</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="nx">headers</span><span class="p">)</span><span class="si">}</span><span class="sb">`</span>"</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">],</span> <span class="w"> </span><span class="nt">"unauthorized"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"action"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"return"</span><span class="p">:</span><span class="w"> </span><span class="mi">401</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">],</span> <span class="w"> </span><span class="nt">"forbidden"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"action"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"return"</span><span class="p">:</span><span class="w"> </span><span class="mi">403</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">],</span> <span class="w"> </span><span class="nt">"accept"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"action"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"return"</span><span class="p">:</span><span class="w"> </span><span class="mi">204</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">]</span> <span class="w"> </span><span class="p">}</span> <span class="p">}</span> </pre></div> </div> <div class="section" id="examples"> <span id="njs-examples"></span><h2>Examples<a class="headerlink" href="#examples" title="Permalink to this heading">§</a></h2> <p>This example adds simple routing logic that extracts the agent name from the <strong>User-Agent</strong> header field to reject requests issued by <strong class="program">curl</strong>:</p> <div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="nt">"routes"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"parse"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"action"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"pass"</span><span class="p">:</span><span class="w"> </span><span class="s2">"<span class="sb">`routes/</span><span class="si">${</span><span class="w"> </span><span class="nx">headers</span><span class="p">[</span><span class="s1">'User-Agent'</span><span class="p">].</span><span class="nx">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="mf">0</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'curl'</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="s1">'reject'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="s1">'default'</span><span class="w"> </span><span class="si">}</span><span class="sb">`</span>"</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">],</span> <span class="w"> </span><span class="nt">"reject"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"action"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"return"</span><span class="p">:</span><span class="w"> </span><span class="mi">400</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">],</span> <span class="w"> </span><span class="nt">"default"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"action"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"return"</span><span class="p">:</span><span class="w"> </span><span class="mi">204</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">]</span> <span class="p">}</span> </pre></div> </div> <p>This example uses a series of transformations to log the request’s date, IP, URI, and all its headers:</p> <div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> <span class="w"> </span><span class="nt">"path"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/var/log/unit/access_kv.log"</span><span class="p">,</span> <span class="w"> </span><span class="nt">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"<span class="sb">`@timestamp=</span><span class="si">${</span><span class="ow">new</span><span class="w"> </span><span class="nb">Date</span><span class="p">().</span><span class="nx">toISOString</span><span class="p">()</span><span class="si">}</span><span class="sb"> ip=</span><span class="si">${</span><span class="nx">remoteAddr</span><span class="si">}</span><span class="sb"> uri=</span><span class="si">${</span><span class="nx">uri</span><span class="si">}</span><span class="sb"> </span><span class="si">${</span><span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">headers</span><span class="p">).</span><span class="nx">map</span><span class="p">(</span><span class="nx">k</span><span class="w"> </span><span class="p">=></span><span class="w"> </span><span class="s1">'req.'</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">k</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'=\"'</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">headers</span><span class="p">[</span><span class="nx">k</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'\"'</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">)</span><span class="si">}</span><span class="sb">\n`</span>"</span> <span class="p">}</span> </pre></div> </div> <p>The next example will add the <strong>Cache-Control</strong> Header based on the HTTP Request method:</p> <div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> <span class="w"> </span><span class="nt">"action"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"pass"</span><span class="p">:</span><span class="w"> </span><span class="s2">"applications/my_app"</span><span class="p">,</span> <span class="w"> </span><span class="nt">"response_headers"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">"Cache-Control"</span><span class="p">:</span><span class="w"> </span><span class="s2">"<span class="sb">`</span><span class="si">${</span><span class="nx">vars</span><span class="p">.</span><span class="nx">method</span><span class="p">.</span><span class="nx">startsWith</span><span class="p">(</span><span class="s1">'P'</span><span class="p">)</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="s1">'no-cache'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="s1">'max-age=3600'</span><span class="si">}</span><span class="sb">`</span>"</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="p">}</span> </pre></div> </div> <p>For further reference, see the <a class="reference external" href="https://nginx.org/en/docs/njs/">njs documentation</a>.</p> </div> </div> <div class="nxt_edit_link"><a href="https://github.com/nginx/unit-docs/edit/main/source/scripting.rst"><div></div>Edit this page</a></div> <div class="nxt_discuss_link"><a href="https://github.com/nginx/unit/discussions/"><div></div>Discuss on GitHub</a></div> <p id="footer"> © 2017-2025 <a href="https://www.nginx.com/">NGINX, Inc.</a> </p> <p id="tecookie"> <!-- TrustArc cookie preferences link --> <span id="teconsent"></span> <!-- End TrustArc cookie preferences link --> </p> </div> </div> <!-- TrustArc cookie consent --> <div id="consent_blackbar" style="position:fixed;top:0px;width:100%"> <!-- End TrustArc cookie consent --> </body> </html>