Maybe to avoid further meandering in what should or should not work, here is a short tutorial of how all this stuff works.

At the end of the chain, you have a Tomcat Engine. This engine processes HTTP requests which it receives in some internal Tomcat format. The requests are processed by forwarding them to "web applications" within Tomcat, who process the request and generate a response.

On top of the Tomcat engine are sitting one or more <Connector>'s.
Each of these Connector's is at the same time a TCP socket listening on some port, and a sophisticated translation engine. Each Connector translates the requests received on its port, from the external communications protocol format used (e.g. HTTP or HTTPS or AJP) into the common internal Tomcat request format, and then passes it to the Tomcat engine.

Graphically, it looks like this :


Connector 1           Connector 2        Connector 3
  HTTP                   AJP                HTTPS

    \                     |                   /


                    Tomcat engine

                   /       |       \
             webapp1     webapp2   webapp3

You can send a request (using the appropriate format) through any of the enabled Connector's. For Tomcat in the end it does not matter. It will send the response via the same Connector, which will perform the appropriate reverse translation according to its protocol.


Now imagine a front-end server, like IIS.
For reasons of your own, you want to send the request to IIS first, and would like IIS to determine if this request is to handle locally by itself, or to be forwarded to a back-end Tomcat, and to do that if needed.

That is where the IIS add-on module isapi_redirect comes into play.
IIS gives it the URL of a request just received. isapi_redirect, in function of its configuration, decides if this request is for a back-end Tomcat or not.
(That is what uriworkermap helps in doing).
If it decides that this URL is not for Tomcat, it returns to IIS saying "sorry, not for me", and IIS looks for other ways to satisfy this request.

If isapi_redirect decides that this request is for a back-end Tomcat, then it checks for which one. For isapi_redirect, each back-end Tomcat to which it can redirect requests is called a "worker". (In a simple case, there is only one.).
(Here is where the workers.properties settings matter)

When isapi_redirect has determined to which "worker" it should pass the request, it tries to set up a TCP channel with this worker (Tomcat), on a port which understands the AJP protocol (aka, an AJP Connector of that Tomcat). If this does not work (because the worker is not configured properly or the corresponding Tomcat is simply not running), isapi_redirect will return an error to IIS. If it works, then isapi_redirect encodes the request according to the requirements of the AJP protocol, and sends it to Tomcat through this TCP channel.
isapi_redirect then waits for the response, on the same TCP channel.
When it gets the response, it returns it to IIS, which returns it to the 
browser.

So the full graphic now looks like this :

                       browser
                         |
                       TCP channel (SSL/HTTPS)
                         |
                        IIS
                         |
                   isapi_redirector
                         |
                       TCP channel (non-SSL)
                         |

Connector 1           Connector 2        Connector 3
  HTTP                   AJP                HTTPS

    \                     |                   /


                    Tomcat engine

                   /       |       \
             webapp1     webapp2   webapp3


Of course, Tomcat can deal with HTTPS all on its own, so you do not necessarily need an IIS in front for that. You could also have the browsers use HTTPS to talk directly to Tomcat.
Then the configuration would be this :

                                           browser
                                              |
                                         TCP channel (SSL/HTTPS)
                                              |

Connector 1           Connector 2        Connector 3
  HTTP                   AJP                HTTPS

    \                     |                   /


                    Tomcat engine

                   /       |       \
             webapp1     webapp2   webapp3

and as far as Tomcat is concerned, it will not make much difference (except that now the Tomcat HTTPS Connector will be doing more work, and the AJP Connector less work).

There are good reasons to use a front-end Apache httpd, or IIS, in front of 
Tomcat.
There are also bad reasons, such as a simple lack of information.
If your only reason to put IIS/isapi_redirect in front of Tomcat is to handle HTTPS connections, then it is not a very good reason, and it makes the setup more complicated than it could be.



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to