<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: production_web_proxying.xml 17299 2012-10-10 23:47:33Z joewiz $ --><book><bookinfo><productname>eXist-db – Open Source Native XML Database</productname><title>Proxying eXist-db behind a Web Server</title><orgname>The eXist-db Project</orgname><date>September 2009</date><author><firstname>Adam</firstname><surname>Retter</surname></author></bookinfo><chapter><title>Production use - Proxying eXist-db behind a Web Server</title><abstract><para>From a security perspective, it is recognised best practice to proxy Web Application Servers behind dedicated Web Servers, and eXist-db is no exception.</para><para>Some other nice side-effects of proxying eXist-db behind a Web Server include -</para><variablelist><varlistentry><term>Unified web namespace</term><listitem><para>You can map eXist-db or an application build atop eXist-db into an existing web namespace. If your website is - http://www.mywebsite.com, then your eXist-db application could be mapped into http://www.mywebsite.com/myapplication/.</para></listitem></varlistentry><varlistentry><term>Virtual Hosting</term><listitem>Providing your Web Server supports Virtual Hosting, then you should be able to proxy many URLs from different domains onto different eXist-db REST URLs which may belong to one or more eXist-db instances. This in effect allows a single eXist-db instance to perform virtual hosting.</listitem></varlistentry></variablelist><para>Examples are provided for -</para><variablelist><varlistentry><term><ulink url="http://wiki.nginx.org/Main">Nginx</ulink></term><listitem><para>A very small but extremely poweful Web Server which is also very simple to configure. It powers some of the biggest sites on the Web.</para></listitem></varlistentry><varlistentry><term><ulink url="http://httpd.apache.org/">Apache HTTPD</ulink></term><listitem>The most prolific Web Server used on the web.</listitem></varlistentry></variablelist></abstract><section><title>Example 1 - Proxying a Web Domain Name to an eXist-db Collection</title><para>In this example we look at how to proxy a web domain name onto an eXist-db Collection. We make the following assumptions -</para><orderedlist><listitem>http://www.mywebsite.com is our website domain name address</listitem><listitem>eXist-db is running in standalone mode (i.e. http://localhost:8088/) on the same host as the Web Server (i.e. http://localhost:80/)</listitem><listitem>/db/mywebsite.com is the eXist-db collection we want to proxy</listitem><listitem>Web Server access logging will be written to /srv/www/vhosts/mywebsite.com/logs/access.log</listitem></orderedlist><section><title>Nginx</title><para>This needs to be added to the http section of the nginx.conf file -</para><programlisting language="nginx">


# header helpers for reverse proxied servers
proxy_set_header        Host                    $host;                          # Ensures the actual hostname is sent to eXist-db and not 'localhost' (needed in eXist-db for server-name in controller-config.xml)
proxy_set_header        X-Real-IP               $remote_addr;                   # The Real IP of the client and not the IP of nginx proxy
proxy_set_header        X-Forwarded-For         $proxy_add_x_forwarded_for;
proxy_set_header        nginx-request-uri       $request_uri;                   # The original URI before proxying

# virtual host configuration, reverse proxy to eXist-db
server {
    listen 80;
    server_name *.mywebsite.com;
    charset utf-8;
    access_log /srv/www/vhosts/mywebsite.com/logs/access.log;

    location / {
        proxy_pass http://localhost:8088/db/mywebsite.com/;
    }
}
                </programlisting></section><section><title>Apache HTTPD</title><para>This needs to be added to your httpd.conf -</para><programlisting language="xml">
		  &lt;VirtualHost *:80&gt;
		    ProxyRequests	    off
		    ServerName	    www.mywebsite.com
		    ServerAlias     *.mywebsite.com
		    ProxyPass	    /	http://localhost:8088/db/mywebsite.com/
		    ProxyPassReverse	/	http://localhost:8088/db/mywebsite.com
	        ProxyPassReverseCookieDomain localhost mywebsite.com
		    ProxyPassReverseCookiePath / /exist

		    RewriteEngine       on
		    RewriteRule         ^/(.*)$     /$1   [PT]
		  &lt;/VirtualHost&gt;
		  </programlisting></section></section></chapter></book>