| <?xml version="1.0"?> |
| <!DOCTYPE document [ |
| <!ENTITY project SYSTEM "project.xml"> |
| ]> |
| <document url="uriworkermap.html"> |
| |
| &project; |
| |
| <properties> |
| <author email="rjung@apache.org">Rainer Jung</author> |
| <author email="mturk@apache.org">Mladen Turk</author> |
| <title>uriworkermap.properties configuration</title> |
| </properties> |
| |
| <body> |
| |
| <section name="Introduction"> |
| <br/> |
| <p> |
| The forwarding of requests from the web server to tomcat gets configured by defining mapping rules. |
| Such a rule maps requests to workers. The request part of the map is described by a URI pattern, |
| the worker by it's worker name. |
| </p> |
| <p> |
| The so-called <b>uriworkermap</b> file is a mechanism of defining rules, |
| which works for all web servers. There exist also other web server specific configuration |
| options for defining rules, which will be mostly discussed on the reference pages for |
| configuring tomcat connectors for the individual web servers. |
| </p> |
| <p> |
| The name of the file is usually uriworkermap.properties, |
| although this is configurable in the web server. |
| Please consult the web server specific documentation pages on |
| how to enable the uriworkermap file. |
| </p> |
| <p> |
| The main features supported by the uriworkermap file are |
| <ul> |
| <li> |
| Exact and wildchar matches, shortcuts to map a directory and all including content. |
| </li> |
| <li> |
| Exclusion rules, disabling of rules an defined preferences behaviour. |
| </li> |
| <li> |
| Virtual host integration: uri mapping rules can be expressed per virtual host. |
| The details are web server specific though. |
| </li> |
| <li> |
| Dynamic reloading: The file gets checked periodically for changes. |
| New versions are automatically reloaded without web server restarts. |
| </li> |
| <li> |
| Integration with the status worker. |
| </li> |
| <li> |
| Support for comments in the rule file. |
| </li> |
| </ul> |
| The following sections describe these aspects in more detail. |
| </p> |
| </section> |
| |
| <section name="Syntax"> |
| <br/> |
| <subsection name="Line format"> |
| <br/> |
| <p> |
| The file has a line based format. There are no continuation characters, |
| so each rule needs to be defined on a single line. Each rule is a pair consisting |
| of a URI pattern and a worker name, combined by an equals sign '=': |
| <source> |
| /myapp=myworker |
| </source> |
| The URI pattern is case sensitive. |
| </p> |
| </subsection> |
| <subsection name="Comments, white space"> |
| <br/> |
| <p> |
| All text after and including the character '#' gets ignored and can be used for comments. |
| Leading and trailing white space gets trimmed around the URI pattern and also around the worker name. |
| The following definitions are all equivalent: |
| <source> |
| # This is a white space example |
| /myapp=myworker |
| /myapp=myworker |
| /myapp = myworker |
| </source> |
| </p> |
| </subsection> |
| |
| <subsection name="URI patterns"> |
| <br/> |
| <p> |
| Inside the URI pattern three special characters can be used, '*', '?' and '|'. |
| The character '*' is a wildchar that matches any number of arbitrary characters |
| in the URI, '?' matches exactly one character. |
| Each URI pattern has to start with the character '/', or with '*' or with '?', |
| optionally prefixed by any combination of the modifiers '!' and '-' (see next section). |
| <source> |
| # Mapping the URI /myapp1 and everything under /myapp1/: |
| /myapp1=myworker-a |
| /myapp1/*=myworker-a |
| # Mapping all URI which end with a common suffix: |
| *.jsp=myworker |
| *.do=myworker |
| </source> |
| Since the first case of mapping a certain location and everything inside |
| it is very common, the character '|' gives a handy shortcut: |
| <source> |
| # Mapping the URI /myapp1 and everything under /myapp1/: |
| /myapp1|/*=myworker-a |
| </source> |
| The pattern 'X|Y' is exactly equivalent to the two maps 'X' and 'XY'. |
| </p> |
| </subsection> |
| </section> |
| |
| <section name="Exclusion, Disabling and Preferences"> |
| <br/> |
| |
| <subsection name="Exclusions and rule disabling"> |
| <br/> |
| <p> |
| Exclusion rules allows to define exclusions from URI rules, which would forward |
| requests to tomcat. If the exclusion rule matches, the request will not be forwarded. |
| This is usually used to serve static content by the web server. |
| An rule is an exclusion rule, if it is suffixed with '!': |
| <source> |
| # Mapping the URI /myapp and everything under /myapp/: |
| /myapp|/*=myworker |
| # Exclude the subdirectory static: |
| !/myapp/static|/*=myworker |
| # Exclude some suffixes: |
| !*.html=myworker |
| </source> |
| </p> |
| <p> |
| Rule disabling comes into play, if your web server merges rules from various sources, |
| and you want to disable any rule defined previously. Since the uriworkermap file gets |
| reloaded dynamically, you can use this to temporarily disable request forwarding: |
| An rule gets disabled, if it is suffixed with '-': |
| <source> |
| # We are not in maintenance. |
| # The maintenance rule got defined someahere else. |
| -/*=maintenance |
| </source> |
| Exclusion rules can get disabled as well, then the rule starts with '-!'. |
| </p> |
| </subsection> |
| |
| <subsection name="Mapping preferences"> |
| <br/> |
| <p> |
| The most restrictive URI pattern is applied first. More precisely the URI patterns are |
| sorted by the number of '/' characters in the pattern (highest number first), and |
| rules with equal numbers are sorted by their string length (longest first). |
| </p> |
| <p> |
| If both distinctions still do not suffice, then the defining source of the rule is considered. |
| Rules defined in uriworkermap.properties come first, before rules defined by JkMount (Apache) |
| and inside workers.properties using the mount attribute. |
| </p> |
| <p> |
| All disabled rules are ignored. Exclusion rules are applied after all normal rules |
| have been applied. |
| </p> |
| <p> |
| There is no defined behaviour, for the following configuration conflict: |
| using literally the same URI pattern in the same defining source but with |
| different worker targets. |
| </p> |
| </subsection> |
| </section> |
| |
| <section name="Virtual host integration"> |
| <br/> |
| |
| <subsection name="IIS"> |
| <br/> |
| <p> |
| When using IIS you can restrict individual rules to special virtual hosts |
| by prefixing the URI pattern with the virtual host information. |
| The rules is that the url must be prefixed with the host name. |
| <source> |
| # Use www.foo.org as virtual host |
| /www.foo.org/myapp/*=myworker |
| # Use www.bar.org as virtual host |
| /www.bar.org/myapp/*=myworker |
| # Normal mapping |
| /mysecondapp/*=myworker |
| </source> |
| </p> |
| <p> |
| Note that /mysecondapp/* will be mapped to all virtual hosts present. |
| In case one needs to prevent the mappings to some particular virual host then |
| the exclusion rule must be used |
| <source> |
| # Make sure the myapp is accessible by all virtual hosts |
| /myapp/*=myworker |
| # Disable mapping myapp for www.foo.org virtual host |
| !/www.foo.org/myapp/*=myworker |
| </source> |
| </p> |
| </subsection> |
| |
| <subsection name="Apache httpd"> |
| <br/> |
| <p> |
| For Apache you can define individual uriworkermap files per virtual host. |
| The directive JkMountFile can be used in the main server and in each virtual host. |
| If a virtual host does not use JkMountfile, but JkMountCopy is set to 'On', |
| then it inhertis the JkMountFile from the main server. |
| </p> |
| </subsection> |
| </section> |
| |
| <section name="Dynamic reloading"> |
| <br/> |
| <p> |
| When a request is being processed, tomcat connectors check the file modification time |
| of the uriworkermap file. To keep the performance penalty low, this happens only, |
| if the last check happened at least n seconds ago. |
| </p> |
| <p> |
| For Apache you can configure the interval "n" using the directive JkMountFile, |
| for IIS you would use the attribute worker_mount_reload. |
| The default value is 60 seconds. A value of "0" turns off the reloading. |
| </p> |
| <p> |
| If the file changed, it gets reloaded completely. If there exist rules coming |
| from other sources than the uriworkermap file (e.g. the workers.properties mount |
| attribute or JkMount with Apache httpd), the new uriworkermap file gets dynamically |
| merged with these ones exactly like when you do a web server restart. |
| </p> |
| <p> |
| Until version 1.2.19 reloading behaved slightly differently: it continuously added |
| the full contents of the uriworkermap file to the rule mapping. The merging rules |
| were, that duplicated got eliminated and old rules could be disabled, by defining the |
| rule as disabled in the new file. Rules never got deleted. |
| </p> |
| </section> |
| |
| <section name="Status worker integration"> |
| <br/> |
| <p> |
| The configuration view of the status worker also shows the various mapping rules. |
| After each worker's configuration, the rules are listed, that forward to this worker. |
| The list contains three columns: |
| <ul> |
| <li> |
| the type of the rule: Exact or Wildchar, eventually prefixed with Disabled or Unmount (for exclusion rules) |
| </li> |
| <li> |
| the URI pattern |
| </li> |
| <li> |
| and the source of the rule definition: 'worker definition' for the workers.properties file (mount attribute), |
| 'JkMount' for Apache httpd JkMount and it's relatives and finally 'uriworkermap' for the uriworkermap file. |
| </li> |
| </ul> |
| For Apache httpd, there is an important subtlety: the request going to the status worker |
| gets executed in the context of some server (main or virtual). The status worker will only show the |
| mapping rules, that are defined for this server (main or virtual). |
| </p> |
| </section> |
| |
| </body> |
| </document> |