blob: c9df6299c0485becaf83eec23e3dd4900c9e15d1 [file] [log] [blame]
刘洪青6266f992017-05-15 21:21:03 +08001<html><head><META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><title>Apache Tomcat 7 (7.0.77) - Proxy Support HOW-TO</title><meta name="author" content="Craig R. McClanahan"><style type="text/css" media="print">
2 .noPrint {display: none;}
3 td#mainBody {width: 100%;}
4</style><style type="text/css">
5code {background-color:rgb(224,255,255);padding:0 0.1em;}
6code.attributeName, code.propertyName {background-color:transparent;}
7
8
9table {
10 border-collapse: collapse;
11 text-align: left;
12}
13table *:not(table) {
14 /* Prevent border-collapsing for table child elements like <div> */
15 border-collapse: separate;
16}
17
18th {
19 text-align: left;
20}
21
22
23div.codeBox pre code, code.attributeName, code.propertyName, code.noHighlight, .noHighlight code {
24 background-color: transparent;
25}
26div.codeBox {
27 overflow: auto;
28 margin: 1em 0;
29}
30div.codeBox pre {
31 margin: 0;
32 padding: 4px;
33 border: 1px solid #999;
34 border-radius: 5px;
35 background-color: #eff8ff;
36 display: table; /* To prevent <pre>s from taking the complete available width. */
37 /*
38 When it is officially supported, use the following CSS instead of display: table
39 to prevent big <pre>s from exceeding the browser window:
40 max-width: available;
41 width: min-content;
42 */
43}
44
45div.codeBox pre.wrap {
46 white-space: pre-wrap;
47}
48
49
50table.defaultTable tr, table.detail-table tr {
51 border: 1px solid #CCC;
52}
53
54table.defaultTable tr:nth-child(even), table.detail-table tr:nth-child(even) {
55 background-color: #FAFBFF;
56}
57
58table.defaultTable tr:nth-child(odd), table.detail-table tr:nth-child(odd) {
59 background-color: #EEEFFF;
60}
61
62table.defaultTable th, table.detail-table th {
63 background-color: #88b;
64 color: #fff;
65}
66
67table.defaultTable th, table.defaultTable td, table.detail-table th, table.detail-table td {
68 padding: 5px 8px;
69}
70
71
72p.notice {
73 border: 1px solid rgb(255, 0, 0);
74 background-color: rgb(238, 238, 238);
75 color: rgb(0, 51, 102);
76 padding: 0.5em;
77 margin: 1em 2em 1em 1em;
78}
79</style></head><body bgcolor="#ffffff" text="#000000" link="#525D76" alink="#525D76" vlink="#525D76"><table border="0" width="100%" cellspacing="0"><!--PAGE HEADER--><tr><td><!--PROJECT LOGO--><a href="http://tomcat.apache.org/"><img src="./images/tomcat.gif" align="right" alt="
Hongqing Liufd5ee812014-05-10 16:32:51 +080080 The Apache Tomcat Servlet/JSP Container
刘洪青6266f992017-05-15 21:21:03 +080081 " border="0"></a></td><td><h1><font face="arial,helvetica,sanserif">Apache Tomcat 7</font></h1><font face="arial,helvetica,sanserif">Version 7.0.77, Mar 28 2017</font></td><td><!--APACHE LOGO--><a href="http://www.apache.org/"><img src="./images/asf-logo.svg" align="right" alt="Apache Logo" border="0" style="width: 266px;height: 83px;"></a></td></tr></table><table border="0" width="100%" cellspacing="4"><!--HEADER SEPARATOR--><tr><td colspan="2"><hr noshade size="1"></td></tr><tr><!--LEFT SIDE NAVIGATION--><td width="20%" valign="top" nowrap class="noPrint"><p><strong>Links</strong></p><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul><p><strong>User Guide</strong></p><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="realm-howto.html">6) Realms and AAA</a></li><li><a href="security-manager-howto.html">7) Security Manager</a></li><li><a href="jndi-resources-howto.html">8) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">9) JDBC DataSources</a></li><li><a href="class-loader-howto.html">10) Classloading</a></li><li><a href="jasper-howto.html">11) JSPs</a></li><li><a href="ssl-howto.html">12) SSL/TLS</a></li><li><a href="ssi-howto.html">13) SSI</a></li><li><a href="cgi-howto.html">14) CGI</a></li><li><a href="proxy-howto.html">15) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">16) MBeans Descriptors</a></li><li><a href="default-servlet.html">17) Default Servlet</a></li><li><a href="cluster-howto.html">18) Clustering</a></li><li><a href="balancer-howto.html">19) Load Balancer</a></li><li><a href="connectors.html">20) Connectors</a></li><li><a href="monitoring.html">21) Monitoring and Management</a></li><li><a href="logging.html">22) Logging</a></li><li><a href="apr.html">23) APR/Native</a></li><li><a href="virtual-hosting-howto.html">24) Virtual Hosting</a></li><li><a href="aio.html">25) Advanced IO</a></li><li><a href="extras.html">26) Additional Components</a></li><li><a href="maven-jars.html">27) Mavenized</a></li><li><a href="security-howto.html">28) Security Considerations</a></li><li><a href="windows-service-howto.html">29) Windows Service</a></li><li><a href="windows-auth-howto.html">30) Windows Authentication</a></li><li><a href="jdbc-pool.html">31) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">32) WebSocket</a></li></ul><p><strong>Reference</strong></p><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.2 Javadocs</a></li><li><a href="elapi/index.html">EL 2.2 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul><p><strong>Apache Tomcat Development</strong></p><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></td><!--RIGHT SIDE MAIN BODY--><td width="80%" valign="top" align="left" id="mainBody"><h1>Proxy Support HOW-TO</h1><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Table of Contents"><!--()--></a><a name="Table_of_Contents"><strong>Table of Contents</strong></a></font></td></tr><tr><td><blockquote>
Hongqing Liufd5ee812014-05-10 16:32:51 +080082<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Apache_1.3_Proxy_Support">Apache 1.3 Proxy Support</a></li><li><a href="#Apache_2.0_Proxy_Support">Apache 2.0 Proxy Support</a></li></ul>
83</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Introduction"><strong>Introduction</strong></a></font></td></tr><tr><td><blockquote>
84
85<p>Using standard configurations of Tomcat, web applications can ask for
86the server name and port number to which the request was directed for
87processing. When Tomcat is running standalone with the
88<a href="config/http.html">HTTP/1.1 Connector</a>, it will generally
89report the server name specified in the request, and the port number on
90which the <strong>Connector</strong> is listening. The servlet API
91calls of interest, for this purpose, are:</p>
92<ul>
93<li><code>ServletRequest.getServerName()</code>: Returns the host name of the server to which the request was sent.</li>
刘洪青6266f992017-05-15 21:21:03 +080094<li><code>ServletRequest.getServerPort()</code>: Returns the port number of the server to which the request was sent.</li>
Hongqing Liufd5ee812014-05-10 16:32:51 +080095<li><code>ServletRequest.getLocalName()</code>: Returns the host name of the Internet Protocol (IP) interface on which the request was received.</li>
96<li><code>ServletRequest.getLocalPort()</code>: Returns the Internet Protocol (IP) port number of the interface on which the request was received.</li>
97</ul>
98
99<p>When you are running behind a proxy server (or a web server that is
100configured to behave like a proxy server), you will sometimes prefer to
101manage the values returned by these calls. In particular, you will
102generally want the port number to reflect that specified in the original
103request, not the one on which the <strong>Connector</strong> itself is
104listening. You can use the <code>proxyName</code> and <code>proxyPort</code>
105attributes on the <code>&lt;Connector&gt;</code> element to configure
106these values.</p>
107
108<p>Proxy support can take many forms. The following sections describe
109proxy configurations for several common cases.</p>
110
111</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Apache 1.3 Proxy Support"><!--()--></a><a name="Apache_1.3_Proxy_Support"><strong>Apache 1.3 Proxy Support</strong></a></font></td></tr><tr><td><blockquote>
112
113<p>Apache 1.3 supports an optional module (<code>mod_proxy</code>) that
114configures the web server to act as a proxy server. This can be used to
刘洪青6266f992017-05-15 21:21:03 +0800115forward requests for a particular web application to a Tomcat instance,
Hongqing Liufd5ee812014-05-10 16:32:51 +0800116without having to configure a web connector such as <code>mod_jk</code>.
117To accomplish this, you need to perform the following tasks:</p>
118<ol>
119<li>Configure your copy of Apache so that it includes the
120 <code>mod_proxy</code> module. If you are building from source,
121 the easiest way to do this is to include the
122 <code>--enable-module=proxy</code> directive on the
123 <code>./configure</code> command line.</li>
124<li>If not already added for you, make sure that you are loading the
125 <code>mod_proxy</code> module at Apache startup time, by using the
126 following directives in your <code>httpd.conf</code> file:
刘洪青6266f992017-05-15 21:21:03 +0800127<div class="codeBox"><pre><code>
Hongqing Liufd5ee812014-05-10 16:32:51 +0800128LoadModule proxy_module {path-to-modules}/mod_proxy.so
129AddModule mod_proxy.c
刘洪青6266f992017-05-15 21:21:03 +0800130</code></pre></div></li>
Hongqing Liufd5ee812014-05-10 16:32:51 +0800131<li>Include two directives in your <code>httpd.conf</code> file for
刘洪青6266f992017-05-15 21:21:03 +0800132 each web application that you wish to forward to Tomcat. For
Hongqing Liufd5ee812014-05-10 16:32:51 +0800133 example, to forward an application at context path <code>/myapp</code>:
刘洪青6266f992017-05-15 21:21:03 +0800134<div class="codeBox"><pre><code>
Hongqing Liufd5ee812014-05-10 16:32:51 +0800135ProxyPass /myapp http://localhost:8081/myapp
136ProxyPassReverse /myapp http://localhost:8081/myapp
刘洪青6266f992017-05-15 21:21:03 +0800137</code></pre></div>
Hongqing Liufd5ee812014-05-10 16:32:51 +0800138 which tells Apache to forward URLs of the form
刘洪青6266f992017-05-15 21:21:03 +0800139 <code>http://localhost/myapp/*</code> to the Tomcat connector
Hongqing Liufd5ee812014-05-10 16:32:51 +0800140 listening on port 8081.</li>
刘洪青6266f992017-05-15 21:21:03 +0800141<li>Configure your copy of Tomcat to include a special
Hongqing Liufd5ee812014-05-10 16:32:51 +0800142 <code>&lt;Connector&gt;</code> element, with appropriate
143 proxy settings, for example:
刘洪青6266f992017-05-15 21:21:03 +0800144<div class="codeBox"><pre><code>
Hongqing Liufd5ee812014-05-10 16:32:51 +0800145&lt;Connector port="8081" ...
146 proxyName="www.mycompany.com"
147 proxyPort="80"/&gt;
刘洪青6266f992017-05-15 21:21:03 +0800148</code></pre></div>
Hongqing Liufd5ee812014-05-10 16:32:51 +0800149 which will cause servlets inside this web application to think that
150 all proxied requests were directed to <code>www.mycompany.com</code>
151 on port 80.</li>
152<li>It is legal to omit the <code>proxyName</code> attribute from the
153 <code>&lt;Connector&gt;</code> element. If you do so, the value
154 returned by <code>request.getServerName()</code> will by the host
155 name on which Tomcat is running. In the example above, it would be
156 <code>localhost</code>.</li>
157<li>If you also have a <code>&lt;Connector&gt;</code> listening on port
158 8080 (nested within the same <a href="config/service.html">Service</a>
159 element), the requests to either port will share the same set of
160 virtual hosts and web applications.</li>
161<li>You might wish to use the IP filtering features of your operating
162 system to restrict connections to port 8081 (in this example) to
163 be allowed <strong>only</strong> from the server that is running
164 Apache.</li>
165<li>Alternatively, you can set up a series of web applications that are
166 only available via proxying, as follows:
167 <ul>
168 <li>Configure another <code>&lt;Service&gt;</code> that contains
169 only a <code>&lt;Connector&gt;</code> for the proxy port.</li>
170 <li>Configure appropriate <a href="config/engine.html">Engine</a>,
171 <a href="config/host.html">Host</a>, and
172 <a href="config/context.html">Context</a> elements for the virtual hosts
173 and web applications accessible via proxying.</li>
174 <li>Optionally, protect port 8081 with IP filters as described
175 earlier.</li>
176 </ul></li>
177<li>When requests are proxied by Apache, the web server will be recording
178 these requests in its access log. Therefore, you will generally want to
179 disable any access logging performed by Tomcat itself.</li>
180</ol>
181
182<p>When requests are proxied in this manner, <strong>all</strong> requests
183for the configured web applications will be processed by Tomcat (including
184requests for static content). You can improve performance by using the
刘洪青6266f992017-05-15 21:21:03 +0800185<code>mod_jk</code> web connector instead of <code>mod_proxy</code>.
Hongqing Liufd5ee812014-05-10 16:32:51 +0800186<code>mod_jk</code> can be configured so that the web server serves static
187content that is not processed by filters or security constraints defined
188within the web application's deployment descriptor
189(<code>/WEB-INF/web.xml</code>).</p>
190
191</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Apache 2.0 Proxy Support"><!--()--></a><a name="Apache_2.0_Proxy_Support"><strong>Apache 2.0 Proxy Support</strong></a></font></td></tr><tr><td><blockquote>
192The same instructions hold true as for 1.3. (Except in Apache 2.0,
193you may omit <code>AddModule mod_proxy.c</code>)
刘洪青6266f992017-05-15 21:21:03 +0800194</blockquote></td></tr></table></td></tr><tr class="noPrint"><td width="20%" valign="top" nowrap class="noPrint"></td><td width="80%" valign="top" align="left"><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="comments_section" id="comments_section"><strong>Comments</strong></a></font></td></tr><tr><td><blockquote><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions
195 on improving documentation for Apache Tomcat.<br><br>
196 If you have trouble and need help, read
197 <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page
198 and ask your question on the tomcat-users
199 <a href="http://tomcat.apache.org/lists.html">mailing list</a>.
200 Do not ask such questions here. This is not a Q&amp;A section.<br><br>
201 The Apache Comments System is explained <a href="./comments.html">here</a>.
202 Comments may be removed by our moderators if they are either
203 implemented or considered invalid/off-topic.</p><script type="text/javascript"><!--//--><![CDATA[//><!--
204 var comments_shortname = 'tomcat';
205 var comments_identifier = 'http://tomcat.apache.org/tomcat-7.0-doc/proxy-howto.html';
206 (function(w, d) {
207 if (w.location.hostname.toLowerCase() == "tomcat.apache.org") {
208 d.write('<div id="comments_thread"><\/div>');
209 var s = d.createElement('script');
210 s.type = 'text/javascript';
211 s.async = true;
212 s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
213 (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
214 }
215 else {
216 d.write('<div id="comments_thread"><strong>Comments are disabled for this page at the moment.<\/strong><\/div>');
217 }
218 })(window, document);
219 //--><!]]></script></blockquote></td></tr></table></td></tr><!--FOOTER SEPARATOR--><tr><td colspan="2"><hr noshade size="1"></td></tr><!--PAGE FOOTER--><tr><td colspan="2"><div align="center"><font color="#525D76" size="-1"><em>
220 Copyright &copy; 1999-2017, Apache Software Foundation
Hongqing Liufd5ee812014-05-10 16:32:51 +0800221 </em></font></div></td></tr></table></body></html>