This file is generated from xml source: DO NOT EDIT
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-->
-<title>mod_proxy_ajp - Apache HTTP Server</title>
+<title>mod_proxy_ajp - Apache HTTP Server Version 2.5</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" />
-<script src="../style/scripts/prettify.js" type="text/javascript">
+<script src="../style/scripts/prettify.min.js" type="text/javascript">
</script>
<link href="../images/favicon.ico" rel="shortcut icon" /></head>
(e.g. Apache Tomcat) using the AJP13 protocol. The usage is similar to
an HTTP reverse proxy, but uses the <code>ajp://</code> prefix:</p>
- <div class="example"><h3>Simple Reverse Proxy</h3><pre class="prettyprint lang-config">
- ProxyPass /app ajp://backend.example.com:8009/app
- </pre>
+ <div class="example"><h3>Simple Reverse Proxy</h3><pre class="prettyprint lang-config">ProxyPass /app ajp://backend.example.com:8009/app</pre>
</div>
<p>Balancers may also be used:</p>
- <div class="example"><h3>Balancer Reverse Proxy</h3><pre class="prettyprint lang-config">
-<Proxy balancer://cluster>
+ <div class="example"><h3>Balancer Reverse Proxy</h3><pre class="prettyprint lang-config"><Proxy balancer://cluster>
BalancerMember ajp://app1.example.com:8009 loadfactor=1
BalancerMember ajp://app2.example.com:8009 loadfactor=2
ProxySet lbmethod=bytraffic
</Proxy>
-ProxyPass /app balancer://cluster/app
- </pre>
+ProxyPass /app balancer://cluster/app</pre>
</div>
<p>Note that usually no
backend. In this case, a redirect header can be rewritten relative to the
original host URL (not the backend <code>ajp://</code> URL), for
example:</p>
- <div class="example"><h3>Rewriting Proxied Path</h3><pre class="prettyprint lang-config">
-ProxyPass /apps/foo ajp://backend.example.com:8009/foo
-ProxyPassReverse /apps/foo http://www.example.com/foo
- </pre>
+ <div class="example"><h3>Rewriting Proxied Path</h3><pre class="prettyprint lang-config">ProxyPass /apps/foo ajp://backend.example.com:8009/foo
+ProxyPassReverse /apps/foo http://www.example.com/foo</pre>
</div>
<p>However, it is usually better to deploy the application on the backend
server at the same path as the proxy rather than to take this approach.
<h2><a name="basppacketstruct" id="basppacketstruct">Basic Packet Structure</a></h2>
<p>There is a bit of an XDR heritage to this protocol, but it differs
in lots of ways (no 4 byte alignment, for example).</p>
- <p>Byte order: I am not clear about the endian-ness of the individual
- bytes. I'm guessing the bytes are little-endian, because that's what
- XDR specifies, and I'm guessing that sys/socket library is magically
- making that so (on the C side). If anyone with a better knowledge of
- socket calls can step in, that would be great.</p>
+ <p>AJP13 uses network byte order for all data types.</p>
<p>There are four data types in the protocol: bytes, booleans,
integers and strings.</p>
<dl>
suggest that the maximum payload could be as large as 2^16, in fact, the
code sets the maximum to be 8K.</p>
<table>
+
<tr>
- <td colspan="6"><em>Packet Format (Server->Container)</em></td>
+ <th colspan="6"><em>Packet Format (Server->Container)</em></th>
</tr>
<tr>
- <td>Byte</td>
+ <th>Byte</th>
<td>0</td>
<td>1</td>
<td>2</td>
<td>4...(n+3)</td>
</tr>
<tr>
- <td>Contents</td>
+ <th>Contents</th>
<td>0x12</td>
<td>0x34</td>
<td colspan="2">Data Length (n)</td>
</tr>
</table>
<table>
+
<tr>
- <td colspan="6"><em>Packet Format (Container->Server)</em></td>
+ <th colspan="6"><em>Packet Format (Container->Server)</em></th>
</tr>
<tr>
- <td>Byte</td>
+ <th>Byte</th>
<td>0</td>
<td>1</td>
<td>2</td>
<td>4...(n+3)</td>
</tr>
<tr>
- <td>Contents</td>
+ <th>Contents</th>
<td>A</td>
<td>B</td>
<td colspan="2">Data Length (n)</td>
<p>The web server can send the following messages to the servlet
container:</p>
<table>
+
<tr>
<td>Code</td>
<td>Type of Packet</td>
<p>The servlet container can send the following types of messages to the
webserver:</p>
<table>
+
<tr>
<td>Code</td>
<td>Type of Packet</td>
<h2><a name="rpacetstruct" id="rpacetstruct">Request Packet Structure</a></h2>
<p>For messages from the server to the container of type
<em>Forward Request</em>:</p>
- <div class="example"><pre>
-AJP13_FORWARD_REQUEST :=
+ <div class="example"><pre>AJP13_FORWARD_REQUEST :=
prefix_code (byte) 0x02 = JK_AJP13_FORWARD_REQUEST
method (byte)
protocol (string)
num_headers (integer)
request_headers *(req_header_name req_header_value)
attributes *(attribut_name attribute_value)
- request_terminator (byte) OxFF
- </pre></div>
+ request_terminator (byte) OxFF</pre></div>
<p>The <code>request_headers</code> have the following structure:
- </p><div class="example"><pre>
-req_header_name :=
+ </p><div class="example"><pre>req_header_name :=
sc_req_header_name | (string) [see below for how this is parsed]
sc_req_header_name := 0xA0xx (integer)
-req_header_value := (string)
-</pre></div>
+req_header_value := (string)</pre></div>
<p>The <code>attributes</code> are optional and have the following
structure:</p>
- <div class="example"><pre>
-attribute_name := sc_a_name | (sc_a_req_attribute string)
+ <div class="example"><pre>attribute_name := sc_a_name | (sc_a_req_attribute string)
-attribute_value := (string)
-
- </pre></div>
+attribute_value := (string)</pre></div>
<p>Not that the all-important header is <code>content-length</code>,
because it determines whether or not the container looks for another
packet immediately.</p>
header names. If the first byte is not <code>0xA0</code>, it assumes that
the two-byte integer is the length of a string, which is then read in.</p>
<p>This works on the assumption that no header names will have length
- greater than <code>0x9999 (==0xA000 - 1)</code>, which is perfectly
+ greater than <code>0x9FFF (==0xA000 - 1)</code>, which is perfectly
reasonable, though somewhat arbitrary.</p>
<div class="note"><h3>Note:</h3>
The <code>content-length</code> header is extremely
<div class="section">
<h2><a name="resppacketstruct" id="resppacketstruct">Response Packet Structure</a></h2>
<p>for messages which the container can send back to the server.</p>
- <div class="example"><pre>
-AJP13_SEND_BODY_CHUNK :=
+ <div class="example"><pre>AJP13_SEND_BODY_CHUNK :=
prefix_code 3
chunk_length (integer)
chunk *(byte)
AJP13_GET_BODY_CHUNK :=
prefix_code 6
- requested_length (integer)
- </pre></div>
+ requested_length (integer)</pre></div>
<h3>Details:</h3>
<h3>Send Body Chunk</h3>
<p>The chunk is basically binary data, and is sent directly back to the
<h3>End Response</h3>
<p>Signals the end of this request-handling cycle. If the
- <code>reuse</code> flag is true <code>(==1)</code>, this TCP connection can
- now be used to handle new incoming requests. If <code>reuse</code> is false
- (anything other than 1 in the actual C code), the connection should
+ <code>reuse</code> flag is true <code>(anything other than 0 in the actual
+ C code)</code>, this TCP connection can now be used to handle new incoming
+ requests. If <code>reuse</code> is false (==0), the connection should
be closed.</p>
<h3>Get Body Chunk</h3>
}
})(window, document);
//--><!]]></script></div><div id="footer">
-<p class="apache">Copyright 2014 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
+<p class="apache">Copyright 2015 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
prettyPrint();