You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by cr...@apache.org on 2001/04/12 03:06:14 UTC

cvs commit: jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http10 HttpConnector.java HttpProcessor.java

craigmcc    01/04/11 18:06:14

  Modified:    catalina/docs/config http11.html
               catalina/src/conf server.xml
               catalina/src/share/org/apache/catalina/connector/http
                        HttpConnector.java HttpProcessor.java
               catalina/src/share/org/apache/catalina/connector/http10
                        HttpConnector.java HttpProcessor.java
  Log:
  Improve support for running Tomcat 4.0 behind a proxy server.  You can now
  configure a Connector so that it reports configured values for the
  request.getServerName() and request.getServerPort(), instead of the values
  that the Connector itself is already running on.  Note that, when a webapp
  is proxied in this manner, Tomcat handles *all* requests for this webapp
  (rather than having Apache serve the static content).
  
  User documentation for setting up Apache's mod_proxy module for use with
  Tomcat is on the "catalina/docs/config/http11.html" page.
  
  Revision  Changes    Path
  1.3       +96 -0     jakarta-tomcat-4.0/catalina/docs/config/http11.html
  
  Index: http11.html
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/docs/config/http11.html,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- http11.html	2001/01/14 04:17:05	1.2
  +++ http11.html	2001/04/12 01:06:11	1.3
  @@ -134,6 +134,31 @@
       </td>
     </tr>
   
  +  <tr>
  +    <td><code>proxyName</code></td>
  +    <td>
  +      If specified, this value will be used as the value returned by
  +      <code>request.getServerName()</code>, instead of the value included
  +      on the <code>Host</code> header.  This is useful when running Tomcat
  +      behind a proxy server (or a web server acting as a proxy server)
  +      on a different host.  See
  +      <a href="#Proxy Support">Proxy Support</a>, below, for more
  +      information on running behind a proxy server.
  +    </td>
  +  </tr>
  +
  +  <tr>
  +    <td><code>proxyPort</code></td>
  +    <td>
  +      If specified, this value will be used as the value returned by
  +      <code>request.getServerPort()</code>, instead of the value specified
  +      by the <code>port</code> attribute.  This is useful when running
  +      Tomcat behind a proxy server (or a web server acting as a proxy server).
  +      See <a href="#Proxy Support">Proxy Support</a>, below, for more
  +      information about running behind a proxy server.
  +    </td>
  +  </tr>
  +
   </table>
   
   <br>
  @@ -237,6 +262,77 @@
   <p>Successful use of SSL support requires that you have installed the JAR
   files from the Java Secure Sockets Extension (JSSE) package into your
   <code>conf/server</code> directory.</p>
  +
  +<a name="Proxy Support"></a>
  +<h3>Proxy Support</h3>
  +
  +<p>The <code>proxyName</code> and <code>proxyPort</code> attributes can be used
  +when Tomcat is run behind a proxy server.  These attributes modify the values
  +returned to web applications by the <code>request.getServerName()</code> and
  +<code>request.getServerPort()</code> methods, which are often used to construct
  +absolute URLs for redirects.  Using the modified values will cause redirected
  +requests to be flowed through the proxy server as well, instead of directly to
  +the port on which Tomcat is listening.</p>
  +
  +<p>Proxy support can take many forms.  The following outline assumes that you
  +are running Tomcat behind an Apache web server (listening to port 80) on the
  +same server that Tomcat is running on, and you wish to have all requests flow
  +through Apache, but forward requests for a particular web application to
  +Tomcat for processing.</p>
  +<ul>
  +<li>Configure your copy of Apache so that it includes the
  +    <code>mod_proxy</code> module.  If you are building from source, the
  +    easiest way to do this is to include the <code>--enable-module=proxy</code>
  +    directive on the <code>./configure</code> command line.</li>
  +<li>Include two directives in your <code>httpd.conf</code> file for each
  +    web application that you wish to forward to Tomcat.  For example:
  +    <pre>
  +        ProxyPass         /myapp  http://localhost:8081/myapp
  +        ProxyPassReverse  /myapp  http://localhost:8081/myapp
  +    </pre>
  +    tells Apache to forward all requests sent to URLs like
  +    <code>http://localhost/myapp/*</code> to be forwarded the Tomcat
  +    connector listening on port 8081.</li>
  +<li>Configure your copy of Tomcat to have a special Connector listening
  +    on port 8081, with appropriate proxy settings as shown below:
  +    <pre>
  +        &lt;Connector className="org.apache.catalina.connector.http.HttpConnector"
  +         port="8081" ... proxyPort="80" proxyName="www.mycompany.com"/&gt;
  +    </pre>
  +    which will cause servlets in this web app to think that the request
  +    was directed to <code>www.mycompany.com</code> on port <code>80</code>.
  +    </li>
  +<li>It is legal to omit the <code>proxyName</code> attribute from the
  +    <code>&lt;Connector&gt;</code> element.  If you do so, the value
  +    reported by the <code>request.getServerName()</code> method will be
  +    the hostname to which Apache forwards (in the configuration described
  +    above, it would be "localhost").</li>
  +<li>If you also have a Tomcat connector listening on port 8080 (within the
  +    same <code>&lt;Service&gt;</code>, the requests to either port will be
  +    processed by exactly the same set of web applications.  You might want
  +    to use the IP filtering features of your operating system to restrict
  +    connections for port 8081 to come from <em>only</em> the local host
  +    (which is presumably the Apache web server).</li>
  +<li>Alternatively, you can set up a series of web applications that are
  +    <em>only</em> available via proxying as follows:
  +    <ul>
  +    <li>Configure another <code>&lt;Service&gt;</code> that contains a
  +        <code>&lt;Connector&gt;</code> configured for proxying, as above.</li>
  +    <li>Configure appropriate <code>&lt;Engine&gt;</code>,
  +        <code>&lt;Host&gt;</code>, and <code>&lt;Context&gt;</code>
  +        entries for the web applications accessible via proxying.</li>
  +    <li>Optionally, protect port 8081 with IP filters as described earlier.
  +        </li>
  +    </ul>
  +<li>When requests are proxied from Apache, the web server will be recording
  +    these requests in its access log.  Therefore, you will generally want to
  +    disable any access logging done by Tomcat (by removing or commenting out
  +    the <code>&lt;Valve&gt;</code> line).</li>
  +</ul>
  +
  +<p><strong>NOTE</strong> - Unlike the usual situation when Tomcat is used
  +behind a web connector, Tomcat will serve <em>all</em> requests (including
  +static files) for the specified web application.</p>
   
   <br>
   
  
  
  
  1.20      +11 -2     jakarta-tomcat-4.0/catalina/src/conf/server.xml
  
  Index: server.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/conf/server.xml,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- server.xml	2001/04/07 10:22:39	1.19
  +++ server.xml	2001/04/12 01:06:11	1.20
  @@ -59,10 +59,19 @@
       </Connector>
       -->
   
  -    <!-- Define a non-SSL HTTP/1.0 Test Connector on port 8081 -->
  +    <!-- Define a Proxied HTTP/1.1 Connector on port 8081 -->
  +    <!-- See proxy documentation for more information about using this. -->
       <!--
  -    <Connector className="org.apache.catalina.connector.http10.HttpConnector"
  +    <Connector className="org.apache.catalina.connector.http.HttpConnector"
                  port="8081" minProcessors="5" maxProcessors="75"
  +               acceptCount="10" debug="0" connectionTimeout="60000"
  +               proxyPort="80"/>
  +    -->
  +
  +    <!-- Define a non-SSL HTTP/1.0 Test Connector on port 8082 -->
  +    <!--
  +    <Connector className="org.apache.catalina.connector.http10.HttpConnector"
  +               port="8082" minProcessors="5" maxProcessors="75"
                  acceptCount="10" debug="0"/>
       -->
   
  
  
  
  1.12      +66 -4     jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpConnector.java
  
  Index: HttpConnector.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpConnector.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- HttpConnector.java	2001/04/09 22:59:29	1.11
  +++ HttpConnector.java	2001/04/12 01:06:12	1.12
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpConnector.java,v 1.11 2001/04/09 22:59:29 craigmcc Exp $
  - * $Revision: 1.11 $
  - * $Date: 2001/04/09 22:59:29 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpConnector.java,v 1.12 2001/04/12 01:06:12 craigmcc Exp $
  + * $Revision: 1.12 $
  + * $Date: 2001/04/12 01:06:12 $
    *
    * ====================================================================
    *
  @@ -95,7 +95,7 @@
    *
    * @author Craig R. McClanahan
    * @author Remy Maucherat
  - * @version $Revision: 1.11 $ $Date: 2001/04/09 22:59:29 $
  + * @version $Revision: 1.12 $ $Date: 2001/04/12 01:06:12 $
    */
   
   
  @@ -201,6 +201,24 @@
   
   
       /**
  +     * The server name to which we should pretend requests to this Connector
  +     * were directed.  This is useful when operating Tomcat behind a proxy
  +     * server, so that redirects get constructed accurately.  If not specified,
  +     * the server name included in the <code>Host</code> header is used.
  +     */
  +    private String proxyName = null;
  +
  +
  +    /**
  +     * The server port to which we should pretent requests to this Connector
  +     * were directed.  This is useful when operating Tomcat behind a proxy
  +     * server, so that redirects get constructed accurately.  If not specified,
  +     * the port number specified by the <code>port</code> property is used.
  +     */
  +    private int proxyPort = 0;
  +
  +
  +    /**
        * The request scheme that will be set on all requests received
        * through this connector.
        */
  @@ -541,6 +559,50 @@
       public void setPort(int port) {
   
   	this.port = port;
  +
  +    }
  +
  +
  +    /**
  +     * Return the proxy server name for this Connector.
  +     */
  +    public String getProxyName() {
  +
  +        return (this.proxyName);
  +
  +    }
  +
  +
  +    /**
  +     * Set the proxy server name for this Connector.
  +     *
  +     * @param proxyName The new proxy server name
  +     */
  +    public void setProxyName(String proxyName) {
  +
  +        this.proxyName = proxyName;
  +
  +    }
  +
  +
  +    /**
  +     * Return the proxy server port for this Connector.
  +     */
  +    public int getProxyPort() {
  +
  +        return (this.proxyPort);
  +
  +    }
  +
  +
  +    /**
  +     * Set the proxy server port for this Connector.
  +     *
  +     * @param proxyPort The new proxy server port
  +     */
  +    public void setProxyPort(int proxyPort) {
  +
  +        this.proxyPort = proxyPort;
   
       }
   
  
  
  
  1.24      +53 -18    jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpProcessor.java
  
  Index: HttpProcessor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpProcessor.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- HttpProcessor.java	2001/04/09 22:59:29	1.23
  +++ HttpProcessor.java	2001/04/12 01:06:12	1.24
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpProcessor.java,v 1.23 2001/04/09 22:59:29 craigmcc Exp $
  - * $Revision: 1.23 $
  - * $Date: 2001/04/09 22:59:29 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpProcessor.java,v 1.24 2001/04/12 01:06:12 craigmcc Exp $
  + * $Revision: 1.24 $
  + * $Date: 2001/04/12 01:06:12 $
    *
    * ====================================================================
    *
  @@ -107,7 +107,7 @@
    *
    * @author Craig R. McClanahan
    * @author Remy Maucherat
  - * @version $Revision: 1.23 $ $Date: 2001/04/09 22:59:29 $
  + * @version $Revision: 1.24 $ $Date: 2001/04/12 01:06:12 $
    */
   
   final class HttpProcessor
  @@ -129,8 +129,11 @@
   	this.connector = connector;
   	this.debug = connector.getDebug();
   	this.id = id;
  +        this.proxyName = connector.getProxyName();
  +        this.proxyPort = connector.getProxyPort();
   	this.request = (HttpRequestImpl) connector.createRequest();
   	this.response = (HttpResponseImpl) connector.createResponse();
  +        this.serverPort = connector.getPort();
   	this.threadName =
   	  "HttpProcessor[" + connector.getPort() + "][" + id + "]";
   
  @@ -190,6 +193,18 @@
   
   
       /**
  +     * The proxy server name for our Connector.
  +     */
  +    private String proxyName = null;
  +
  +
  +    /**
  +     * The proxy server port for our Connector.
  +     */
  +    private int proxyPort = 0;
  +
  +
  +    /**
        * The HTTP request object we will pass to our associated container.
        */
       private HttpRequestImpl request = null;
  @@ -202,6 +217,12 @@
   
   
       /**
  +     * The actual server port for our Connector.
  +     */
  +    private int serverPort = 0;
  +
  +
  +    /**
        * The string manager for this package.
        */
       protected StringManager sm =
  @@ -514,7 +535,10 @@
   	    log("  parseConnection: address=" + socket.getInetAddress() +
   		", port=" + connector.getPort());
   	((HttpRequestImpl) request).setInet(socket.getInetAddress());
  -	request.setServerPort(connector.getPort());
  +        if (proxyPort != 0)
  +            request.setServerPort(proxyPort);
  +        else
  +            request.setServerPort(serverPort);
           request.setSocket(socket);
   
       }
  @@ -594,19 +618,30 @@
   		request.setContentType(value);
   	    } else if (header.equals(DefaultHeaders.HOST_NAME)) {
   		int n = value.indexOf(":");
  -		if (n < 0)
  -		    request.setServerName(value);
  -		else {
  -		    request.setServerName(value.substring(0, n).trim());
  -		    int port = 80;
  -		    try {
  -			port = Integer.parseInt(value.substring(n+1).trim());
  -		    } catch (Exception e) {
  -			throw new ServletException
  -			    (sm.getString
  -                             ("httpProcessor.parseHeaders.portNumber"));
  -		    }
  -		    request.setServerPort(port);
  +		if (n < 0) {
  +                    if (proxyName != null)
  +                        request.setServerName(proxyName);
  +                    else
  +                        request.setServerName(value);
  +		} else {
  +                    if (proxyName != null)
  +                        request.setServerName(proxyName);
  +                    else
  +                        request.setServerName(value.substring(0, n).trim());
  +                    if (proxyPort != 0)
  +                        request.setServerPort(proxyPort);
  +                    else {
  +                        int port = 80;
  +                        try {
  +                            port =
  +                                Integer.parseInt(value.substring(n+1).trim());
  +                        } catch (Exception e) {
  +                            throw new ServletException
  +                                (sm.getString
  +                                 ("httpProcessor.parseHeaders.portNumber"));
  +                        }
  +                        request.setServerPort(port);
  +                    }
   		}
   	    } else if (header.equals(DefaultHeaders.CONNECTION_NAME)) {
                   if (header.valueEquals
  
  
  
  1.3       +66 -4     jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http10/HttpConnector.java
  
  Index: HttpConnector.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http10/HttpConnector.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- HttpConnector.java	2001/03/31 15:22:20	1.2
  +++ HttpConnector.java	2001/04/12 01:06:13	1.3
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http10/HttpConnector.java,v 1.2 2001/03/31 15:22:20 glenn Exp $
  - * $Revision: 1.2 $
  - * $Date: 2001/03/31 15:22:20 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http10/HttpConnector.java,v 1.3 2001/04/12 01:06:13 craigmcc Exp $
  + * $Revision: 1.3 $
  + * $Date: 2001/04/12 01:06:13 $
    *
    * ====================================================================
    *
  @@ -94,7 +94,7 @@
    * purposes.  Not intended to be the final solution.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.2 $ $Date: 2001/03/31 15:22:20 $
  + * @version $Revision: 1.3 $ $Date: 2001/04/12 01:06:13 $
    */
   
   
  @@ -200,6 +200,24 @@
   
   
       /**
  +     * The server name to which we should pretend requests to this Connector
  +     * were directed.  This is useful when operating Tomcat behind a proxy
  +     * server, so that redirects get constructed accurately.  If not specified,
  +     * the server name included in the <code>Host</code> header is used.
  +     */
  +    private String proxyName = null;
  +
  +
  +    /**
  +     * The server port to which we should pretent requests to this Connector
  +     * were directed.  This is useful when operating Tomcat behind a proxy
  +     * server, so that redirects get constructed accurately.  If not specified,
  +     * the port number specified by the <code>port</code> property is used.
  +     */
  +    private int proxyPort = 0;
  +
  +
  +    /**
        * The request scheme that will be set on all requests received
        * through this connector.
        */
  @@ -512,6 +530,50 @@
       public void setPort(int port) {
   
   	this.port = port;
  +
  +    }
  +
  +
  +    /**
  +     * Return the proxy server name for this Connector.
  +     */
  +    public String getProxyName() {
  +
  +        return (this.proxyName);
  +
  +    }
  +
  +
  +    /**
  +     * Set the proxy server name for this Connector.
  +     *
  +     * @param proxyName The new proxy server name
  +     */
  +    public void setProxyName(String proxyName) {
  +
  +        this.proxyName = proxyName;
  +
  +    }
  +
  +
  +    /**
  +     * Return the proxy server port for this Connector.
  +     */
  +    public int getProxyPort() {
  +
  +        return (this.proxyPort);
  +
  +    }
  +
  +
  +    /**
  +     * Set the proxy server port for this Connector.
  +     *
  +     * @param proxyPort The new proxy server port
  +     */
  +    public void setProxyPort(int proxyPort) {
  +
  +        this.proxyPort = proxyPort;
   
       }
   
  
  
  
  1.2       +29 -5     jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http10/HttpProcessor.java
  
  Index: HttpProcessor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http10/HttpProcessor.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- HttpProcessor.java	2001/01/23 03:55:54	1.1
  +++ HttpProcessor.java	2001/04/12 01:06:13	1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http10/HttpProcessor.java,v 1.1 2001/01/23 03:55:54 remm Exp $
  - * $Revision: 1.1 $
  - * $Date: 2001/01/23 03:55:54 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http10/HttpProcessor.java,v 1.2 2001/04/12 01:06:13 craigmcc Exp $
  + * $Revision: 1.2 $
  + * $Date: 2001/04/12 01:06:13 $
    *
    * ====================================================================
    *
  @@ -104,7 +104,7 @@
    * the request.  When the processor is completed, it will recycle itself.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.1 $ $Date: 2001/01/23 03:55:54 $
  + * @version $Revision: 1.2 $ $Date: 2001/04/12 01:06:13 $
    */
   
   final class HttpProcessor
  @@ -126,8 +126,11 @@
   	this.connector = connector;
   	this.debug = connector.getDebug();
   	this.id = id;
  +        this.proxyName = connector.getProxyName();
  +        this.proxyPort = connector.getProxyPort();
   	this.request = (HttpRequest) connector.createRequest();
   	this.response = (HttpResponse) connector.createResponse();
  +        this.serverPort = connector.getPort();
   	this.threadName =
   	  "HttpProcessor[" + connector.getPort() + "][" + id + "]";
   
  @@ -175,6 +178,18 @@
   
   
       /**
  +     * The proxy server name for our Connector.
  +     */
  +    private String proxyName = null;
  +
  +
  +    /**
  +     * The proxy server port for our Connector.
  +     */
  +    private int proxyPort = 0;
  +
  +
  +    /**
        * The HTTP request object we will pass to our associated container.
        */
       private HttpRequest request = null;
  @@ -187,6 +202,12 @@
   
   
       /**
  +     * The actual server port for our Connector.
  +     */
  +    private int serverPort = 0;
  +
  +
  +    /**
        * The string manager for this package.
        */
       protected StringManager sm =
  @@ -338,7 +359,10 @@
   	    log("  parseConnection: address=" + socket.getInetAddress() +
   		", port=" + connector.getPort());
   	((HttpRequestImpl) request).setInet(socket.getInetAddress());
  -	request.setServerPort(connector.getPort());
  +        if (proxyPort != 0)
  +            request.setServerPort(proxyPort);
  +        else
  +            request.setServerPort(serverPort);
           request.setSocket(socket);
   
       }