http://wiki.codemongers.com/NginxHttpUpstreamRequestHashModule
[nginx.git] / nginx_upstream_hash / NginxHttpUpstreamRequestHashModule,html
diff --git a/nginx_upstream_hash/NginxHttpUpstreamRequestHashModule,html b/nginx_upstream_hash/NginxHttpUpstreamRequestHashModule,html
new file mode 100644 (file)
index 0000000..8d2c3f9
--- /dev/null
@@ -0,0 +1,173 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+<meta name="robots" content="index,nofollow">
+
+<title>NginxHttpUpstreamRequestHashModule - Nginx Wiki</title>
+<script type="text/javascript" src="/htdocs/common/js/common.js"></script>
+
+<script type="text/javascript">
+<!--// common functions
+
+// We keep here the state of the search box
+searchIsDisabled = false;
+
+function searchChange(e) {
+    // Update search buttons status according to search box content.
+    // Ignore empty or whitespace search term.
+    var value = e.value.replace(/\s+/, '');
+    if (value == '' || searchIsDisabled) { 
+        searchSetDisabled(true);
+    } else {
+        searchSetDisabled(false);
+    }
+}
+
+function searchSetDisabled(flag) {
+    // Enable or disable search
+    document.getElementById('fullsearch').disabled = flag;
+    document.getElementById('titlesearch').disabled = flag;
+}
+
+function searchFocus(e) {
+    // Update search input content on focus
+    if (e.value == 'Search') {
+        e.value = '';
+        e.className = '';
+        searchIsDisabled = false;
+    }
+}
+
+function searchBlur(e) {
+    // Update search input content on blur
+    if (e.value == '') {
+        e.value = 'Search';
+        e.className = 'disabled';
+        searchIsDisabled = true;
+    }
+}
+
+function actionsMenuInit(title) {
+    // Initialize action menu
+    for (i = 0; i < document.forms.length; i++) {
+        var form = document.forms[i];
+        if (form.className == 'actionsmenu') {
+            // Check if this form needs update
+            var div = form.getElementsByTagName('div')[0];
+            var label = div.getElementsByTagName('label')[0];
+            if (label) {
+                // This is the first time: remove label and do buton.
+                div.removeChild(label);
+                var dobutton = div.getElementsByTagName('input')[0];
+                div.removeChild(dobutton);
+                // and add menu title
+                var select = div.getElementsByTagName('select')[0];
+                var item = document.createElement('option');
+                item.appendChild(document.createTextNode(title));
+                item.value = 'show';
+                select.insertBefore(item, select.options[0]);
+                select.selectedIndex = 0;
+            }
+        }
+    }
+}
+//-->
+</script>
+
+
+<link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="/htdocs/mentalwealth/css/common.css">
+<link rel="stylesheet" type="text/css" charset="utf-8" media="screen" href="/htdocs/mentalwealth/css/screen.css">
+<link rel="stylesheet" type="text/css" charset="utf-8" media="print" href="/htdocs/mentalwealth/css/print.css">
+<link rel="stylesheet" type="text/css" charset="utf-8" media="projection" href="/htdocs/mentalwealth/css/projection.css">
+
+
+<link rel="Start" href="/Main">
+<link rel="Alternate" title="Wiki Markup" href="/NginxHttpUpstreamRequestHashModule?action=raw">
+<link rel="Alternate" media="print" title="Print View" href="/NginxHttpUpstreamRequestHashModule?action=print">
+<link rel="Appendix" title="nginx_request_hash-0.1.tar.gz" href="/NginxHttpUpstreamRequestHashModule?action=AttachFile&amp;do=view&amp;target=nginx_request_hash-0.1.tar.gz">
+<link rel="Appendix" title="nginx_upstream_hash-0.2.tar.gz" href="/NginxHttpUpstreamRequestHashModule?action=AttachFile&amp;do=view&amp;target=nginx_upstream_hash-0.2.tar.gz">
+<link rel="Appendix" title="nginx_upstream_hash-0.3.tar.gz" href="/NginxHttpUpstreamRequestHashModule?action=AttachFile&amp;do=view&amp;target=nginx_upstream_hash-0.3.tar.gz">
+<link rel="Search" href="/FindPage">
+<link rel="Index" href="/TitleIndex">
+<link rel="Glossary" href="/WordIndex">
+<link rel="Help" href="/HelpOnFormatting">
+</head>
+
+<body  lang="en" dir="ltr">
+
+<div id="header"><div id="searchform">
+<form id="searchform" method="get" action="">
+<div>
+<input type="hidden" name="action" value="fullsearch">
+<input type="hidden" name="context" value="180">
+<label for="searchinput">Search:</label>
+<input id="searchinput" type="text" name="value" value="" size="20"
+    onfocus="searchFocus(this)" onblur="searchBlur(this)"
+    onkeyup="searchChange(this)" onchange="searchChange(this)" alt="Search">
+<br><input id="titlesearch" name="titlesearch" type="submit"
+    value="Titles" alt="Search Titles">
+<input id="fullsearch" name="fullsearch" type="submit"
+    value="Text" alt="Search Full Text">
+</div>
+</form>
+<script type="text/javascript">
+<!--// Initialize search form
+var f = document.getElementById('searchform');
+f.getElementsByTagName('label')[0].style.display = 'none';
+var e = document.getElementById('searchinput');
+searchChange(e);
+searchBlur(e);
+//-->
+</script>
+</div><div id="logo"><a href="/Main"><img src="/images/nginx-black-logo.jpg" alt="Nginx Wiki"></a></div></div>
+
+<div id="sidebar">
+<div class="sidepanel"><h1>Navigation</h1>
+<ul id="navibar">
+<li class="wikilink"><a href="/Main">Main</a></li><li class="wikilink"><a href="/FindPage">FindPage</a></li><li class="wikilink"><a href="/HelpContents">HelpContents</a></li><li class="current"><a href="/NginxHttpUpstreamRequestHashModule">NginxHttpUp...tHashModule</a></li>
+</ul>
+</div>
+<div class="sidepanel"><h1>User</h1><ul id="username"><li><a href="/NginxHttpUpstreamRequestHashModule?action=login" id="login">Login</a></li></ul></div>
+<ul id="credits">
+<li><a href="http://moinmoin.wikiwikiweb.de/">MoinMoin Powered</a></li><li><a href="http://www.python.org/">Python Powered</a></li><li><a href="http://validator.w3.org/check?uri=referer">Valid HTML 4.01</a></li>
+</ul>
+
+</div>
+
+<div id="page" lang="en" dir="ltr">
+<div dir="ltr" id="content" lang="en"><span class="anchor" id="top"></span>
+<span class="anchor" id="line-2"></span><p class="line867">
+<h1 id="head-46349e4051ab58f9d43b4e4cbe75a22812583dc1">ngx_http_upstream_hash_module</h1>
+<span class="anchor" id="line-3"></span><span class="anchor" id="line-4"></span><p class="line867"><em>This module is not distributed with the Nginx source. Installation instructions are <a href="#installation">below</a>.</em> <span class="anchor" id="line-5"></span><span class="anchor" id="line-6"></span><p class="line874">The upstream_hash module provides simple upstream load distribution by hashing a configurable variable (e.g., the request URI, incoming HTTP headers, or some combination). Example usage: <span class="anchor" id="line-7"></span><span class="anchor" id="line-8"></span><p class="line867"><span class="anchor" id="line-9"></span><pre>upstream backend {
+<span class="anchor" id="line-10"></span>    server server1;
+<span class="anchor" id="line-11"></span>    server server2;
+<span class="anchor" id="line-12"></span>    hash   $request_uri;
+<span class="anchor" id="line-13"></span>}
+<span class="anchor" id="line-14"></span></pre><span class="anchor" id="line-15"></span><span class="anchor" id="line-16"></span><p class="line874">Here, Nginx will choose server1 or server2 by hashing the request URI ($request_uri). <span class="anchor" id="line-17"></span><span class="anchor" id="line-18"></span><p class="line867">
+<h2 id="head-e447c504fe73e1912886e3cfd5b335eb8a90a5a0">Directives</h2>
+<span class="anchor" id="line-19"></span><span class="anchor" id="line-20"></span><ul><li><p class="line891"><a href="#hash">hash</a> <span class="anchor" id="line-21"></span></li><li><p class="line891"><a href="#hash_again">hash_again</a> <span class="anchor" id="line-22"></span><span class="anchor" id="line-23"></span></li></ul><p class="line867"><span class="anchor" id="hash"></span> <span class="anchor" id="line-24"></span><span class="anchor" id="line-25"></span><p class="line867">
+<h2 id="head-3a857993d71a23ea824e238814ca4583265bc97d">hash</h2>
+<span class="anchor" id="line-26"></span><p class="line867"><strong>syntax</strong> <em>hash $variable</em> <span class="anchor" id="line-27"></span><span class="anchor" id="line-28"></span><p class="line867"><strong>context</strong> <em>upstream</em> <span class="anchor" id="line-29"></span><span class="anchor" id="line-30"></span><p class="line874">Enables upstream hashing of $variable. <span class="anchor" id="line-31"></span><span class="anchor" id="line-32"></span><p class="line874">When present, the "server" directives cannot take any arguments ("weight", "max_fails", etc.). <span class="anchor" id="line-33"></span><span class="anchor" id="line-34"></span><p class="line867"><span class="anchor" id="hash_again"></span> <span class="anchor" id="line-35"></span>
+<h2 id="head-36e090dc2c1cb75051fdd971bed7a8c6e8ce3cac">hash_again</h2>
+<span class="anchor" id="line-36"></span><p class="line867"><strong>syntax</strong> <em>hash_again number</em> <span class="anchor" id="line-37"></span><span class="anchor" id="line-38"></span><p class="line867"><strong>default</strong> <em>0</em> <span class="anchor" id="line-39"></span><span class="anchor" id="line-40"></span><p class="line867"><strong>context</strong> <em>upstream</em> <span class="anchor" id="line-41"></span><span class="anchor" id="line-42"></span><p class="line874">Number of times to rehash the value and choose a different server if the backend connection fails. Increase this number to provide high availability. <span class="anchor" id="line-43"></span><span class="anchor" id="line-44"></span><p class="line867"><span class="anchor" id="installation"></span> <span class="anchor" id="line-45"></span>
+<h2 id="head-f853b6cf504ff6af886bbf45b2dc09a3031f03d9">Installation</h2>
+<span class="anchor" id="line-46"></span><span class="anchor" id="line-47"></span><p class="line862">This module is not distributed with the Nginx source. You can download the request_hash module here: <a class="http" href="http://wiki.codemongers.com/NginxHttpUpstreamRequestHashModule?action=AttachFile&amp;do=get&amp;target=nginx_upstream_hash-0.3.tar.gz">nginx_upstream_hash-0.3.tar.gz</a> <span class="anchor" id="line-48"></span><span class="anchor" id="line-49"></span><p class="line874">After extracting, you will need to patch the latest Nginx source (0.7.11 as of this writing). Run patch like this: <span class="anchor" id="line-50"></span><span class="anchor" id="line-51"></span><p class="line867"><span class="anchor" id="line-52"></span><pre>    cd nginx-0.7.11
+<span class="anchor" id="line-53"></span>    patch -p0 &lt; /path/to/upstream/hash/directory/nginx.patch
+<span class="anchor" id="line-54"></span></pre><span class="anchor" id="line-55"></span><span class="anchor" id="line-56"></span><p class="line874">Then add the following option to your Nginx ./configure command: <span class="anchor" id="line-57"></span><span class="anchor" id="line-58"></span><p class="line867"><span class="anchor" id="line-59"></span><pre>    --add-module=path/to/upstream/hash/directory
+<span class="anchor" id="line-60"></span></pre><span class="anchor" id="line-61"></span><span class="anchor" id="line-62"></span><p class="line874">Then "make" and "make install" as usual. <span class="anchor" id="line-63"></span><span class="anchor" id="line-64"></span><p class="line867"><span class="anchor" id="hash-algorithm"></span> <span class="anchor" id="line-65"></span>
+<h2 id="head-3c1201d51559ba07821752cd31e80902ed33cc95">The hash algorithm</h2>
+<span class="anchor" id="line-66"></span><span class="anchor" id="line-67"></span><p class="line874">As of 0.3, the hash algorithm and the failover algorithm use a CRC-32 computation compatible with PECL Memcache. <span class="anchor" id="line-68"></span><span class="anchor" id="line-69"></span><p class="line867">
+<h2 id="head-1468300db9cf366d94eec4f28e55a85a3d500e58">Changes</h2>
+<span class="anchor" id="line-70"></span><span class="anchor" id="line-71"></span><ul><li style="list-style-type:none">* 0.3: Feature: PECL Memcache compatibility. Change: Removed "hash_method" directive. <span class="anchor" id="line-72"></span><span class="anchor" id="line-73"></span></li></ul><p class="line867">
+<h2 id="head-5ff00a181108bf241a00b91bf8b7b9344eb005b5">Bugs</h2>
+<span class="anchor" id="line-74"></span><span class="anchor" id="line-75"></span><p class="line862">Send bug reports to <a class="http" href="http://emiller.info">Evan Miller</a>. <span class="anchor" id="line-76"></span><span class="anchor" id="bottom"></span></div><div id="pagebottom"></div>
+<p id="pageinfo" class="info" lang="en" dir="ltr">NginxHttpUpstreamRequestHashModule  (last edited 2008-08-25 02:18:43 by <span title="Emiller @ 127.0.0.25[127.0.0.25]"><a href="/Emiller" title="Emiller @ 127.0.0.25[127.0.0.25]">Emiller</a></span>)</p>
+
+<div id="pagebottom"></div>
+</div>
+
+
+</body>
+</html>
+