Search code examples
apachetrac

Multiple Trac sites on one domain using Apache2


How do I get one domain to serve up multiple sites under Apache2. What I would like is something like this:
trac.mysite.net/project1
trac.mysite.net/project2

What I have working now, is this:
project1.mysite.net/
project2.mysite.net/
using two separate virtual hosts, which works great. However, every time I create a new project, I have to update the DNS.

What I would like is to have one virtual host configuration that points to a different directory for each project.

What I have tried is creating a 'trac' virtual host with different sections for each site. According to the error log, it tries to access the directory, but gets an access denied.

[Sun Sep 14 16:50:59.022354 2014] [autoindex:error] [pid 9811] [client 10.1.1.112:58207] AH01276: Cannot serve directory /usr/share/trac/projects/project1/htdocs/: No matching DirectoryIndex (index.html,index.cgi,index.pl,index.php,index.xhtml,index.htm) found, and server-generated directory index forbidden by Options directive

I tried removing indexes with Options -Indexes but that didn't get rid of the error above.

Here is my virtual host configuration:

<VirtualHost *:80>
    ServerName trac.mysite.net
    ServerAlias trac
    ServerAdmin vv@mysite.net

    # trac ####################################################################
    DocumentRoot /usr/share/trac/htdocs

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    <Directory /usr/share/trac/cgi-bin/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        AuthType Digest
        AuthName login
        AuthUserFile /etc/apache2/loginpasswd
        Require valid-user
        Order allow,deny
        allow from all
    </Directory>

    Alias /chrome/common /usr/share/trac/htdocs/common
    Alias /chrome/site /usr/share/trac/htdocs/site

    <Directory /usr/share/trac/htdocs/>
        Order allow,deny
        allow from all
    </Directory>

    WSGIScriptAlias / /usr/share/trac/cgi-bin/trac.wsgi

    # project1 ###############################################################
    Alias /project1 /usr/share/trac/projects/project1/htdocs

    <Directory /usr/share/trac/projects/project1/htdocs/>
        Order allow,deny
        allow from all
    </Directory>

    <Directory /usr/share/trac/projects/project1/cgi-bin/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        AuthType Digest
        AuthName login
        AuthUserFile /etc/apache2/loginpasswd
        Require valid-user
        Order allow,deny
        allow from all
    </Directory>

    Alias /project1/chrome/common /usr/share/trac/projects/project1/htdocs/common
    Alias /project1/chrome/site /usr/share/trac/projects/project1/htdocs/site

    WSGIScriptAlias /project1 /usr/share/trac/projects/project1/cgi-bin/trac.wsgi

    # project2 ################################################################
    Alias /project2 /usr/share/trac/projects/project2/htdocs
    <Directory /usr/share/trac/projects/project2/htdocs/>
        Options FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

    <Directory /usr/share/trac/projects/project2/cgi-bin/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        AuthType Digest
        AuthName login
        AuthUserFile /etc/apache2/loginpasswd
        Require valid-user
        Order allow,deny
        Allow from all
    </Directory>

    Alias /project2/chrome/common /usr/share/trac/projects/project2/htdocs/common
    Alias /project2/chrome/site /usr/share/trac/projects/project2/htdocs/site

    WSGIScriptAlias /project2/ /usr/share/trac/projects/project2/cgi-bin/trac.wsgi

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    ErrorLog ${APACHE_LOG_DIR}/trac_error.log
    CustomLog ${APACHE_LOG_DIR}/trac_access.log combined
</VirtualHost>

I know this is possible, I'm just not sure how. Any suggestions would be appreciated.


Solution

  • Ah. I figured out what I was doing wrong. I was using an Alias for each project directory. The Alias was overriding the WSGIScriptAlias. And it was this WSGIScriptAlias that was necessary for everything to work. It allows urls with /projectX/ in them to be an alias for the trac.wsgi script.

    My new vhost config is given below. I cleaned it up a bit by removing the directives for the trac vhost and only left the DocumentRoot.

    <VirtualHost *:80>
        ServerName trac.mysite.net
        ServerAlias trac
        ServerAdmin vv@mysite.net
    
        # trac ####################################################################
        DocumentRoot /usr/share/trac/htdocs
    
        # project1 ###############################################################
        <Directory /usr/share/trac/projects/project1/htdocs/>
            Order allow,deny
            allow from all
        </Directory>
    
        <Directory /usr/share/trac/projects/project1/cgi-bin/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            AuthType Digest
            AuthName login
            AuthUserFile /etc/apache2/loginpasswd
            Require valid-user
            Order allow,deny
            allow from all
        </Directory>
    
        Alias /project1/chrome/common /usr/share/trac/projects/project1/htdocs/common
        Alias /project1/chrome/site /usr/share/trac/projects/project1/htdocs/site
    
        WSGIScriptAlias /project1 /usr/share/trac/projects/project1/cgi-bin/trac.wsgi
    
        # project2 ################################################################
        <Directory /usr/share/trac/projects/project2/htdocs/>
            Options FollowSymLinks
            AllowOverride None
            Order allow,deny
            Allow from all
        </Directory>
    
        <Directory /usr/share/trac/projects/project2/cgi-bin/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            AuthType Digest
            AuthName login
            AuthUserFile /etc/apache2/loginpasswd
            Require valid-user
            Order allow,deny
            Allow from all
        </Directory>
    
        Alias /project2/chrome/common /usr/share/trac/projects/project2/htdocs/common
        Alias /project2/chrome/site /usr/share/trac/projects/project2/htdocs/site
    
        WSGIScriptAlias /project2/ /usr/share/trac/projects/project2/cgi-bin/trac.wsgi
    
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
    
        ErrorLog ${APACHE_LOG_DIR}/trac_error.log
        CustomLog ${APACHE_LOG_DIR}/trac_access.log combined
    </VirtualHost>
    

    Thanks for listening.