Forum OpenACS Q&A: Re: Multiple OpenACS instances in one configuration file

Dear Ann,

I've put together a configuration file for loading two OpenACS instances concurrently (see below)..... and I was able to reproduce the problem you are reporting. The actual problem was located in the PostgreSQL driver "nsdbpg", which defined its specific Tcl commands only when it was loaded the first time.

Please get a fresh version of the nsdbpg modules from bitbucket, recompile and install it, and it will work.

all the best -g

######################################################################
#
# Demo config file for loading two OpenACS instances into one
# NaviServer process. These servers are named "s1" and "s2" below.
#
# This configuration is in no way tuned, so don't use this in your
# production environment.
#
# Since the two servers are distinguished via virtual hosting, Define
# in your etc/hosts file a localhost entry like (names used below):
#
# 127.0.0.1       localhost localhost1 localhost2
#
######################################################################
set address     127.0.0.1  ;# listen on loopback via IPv4
set httpport        8100

set s1_hostname     localhost1
set s2_hostname     localhost2

set s1_serverroot   /usr/local/oacs-5-10/openacs-4/
set s2_serverroot   /usr/local/oacs-5-9/openacs-4/

set homedir     [file dirname [ns_info config]]
set bindir      [file dirname [ns_info nsd]]

set s1_db_name          "oacs-head"
set s2_db_name          "oacs-5-9"

set db_host             localhost
set db_port             ""
set db_user             nsadmin

#---------------------------------------------------------------------
# Set environment variables HOME and LANG. HOME is needed since
# otherwise some programs called via exec might try to write into the
# root home directory.
#
set env(HOME) $homedir
set env(LANG) en_US.UTF-8

#---------------------------------------------------------------------
# Global server parameters
#---------------------------------------------------------------------
ns_section ns/parameters {
    ns_param    serverlog   $s1_serverroot/log/error.log
    ns_param    pidfile     $s1_serverroot/log/nsd.pid
    ns_param    home        $homedir
}

#---------------------------------------------------------------------
# Definition of NaviServer servers 
#---------------------------------------------------------------------
ns_section ns/servers {
    ns_param s1 "Server 1"
    ns_param s2 "Server 2"  
}

#---------------------------------------------------------------------
# Global driver modules
#---------------------------------------------------------------------
ns_section "ns/modules" {
    ns_param nssock ${bindir}/nssock
}

#---------------------------------------------------------------------
# Configuration for plain HTTP interface  -- module nssock
#---------------------------------------------------------------------
ns_section ns/module/nssock {
    ns_param    defaultserver   s1
    ns_param    address     $address
    ns_param    port        $httpport
}
#
# Define, which "host" (as supplied by the "host:" header
# field) accepted over this driver should be associated with
# which server.
#
ns_section ns/module/nssock/servers {
    ns_param s1 localhost
    ns_param s1 $s1_hostname
    ns_param s2 $s2_hostname
}

ns_section ns/threads {
    ns_param    stacksize   1MB
}

#---------------------------------------------------------------------
# Database drivers
#---------------------------------------------------------------------
ns_section "ns/db/drivers" {
    ns_param    postgres       ${bindir}/nsdbpg
}

#---------------------------------------------------------------------
# Server-level configuration
#
#---------------------------------------------------------------------
# Server s1
#---------------------------------------------------------------------
ns_section ns/server/s1 {
    ns_param    minthreads  2   ;# 1; minimal number of connection threads
    ns_param    connsperthread  1000    ;# 10000; number of connections (requests) handled per thread
}

ns_section ns/server/s1/redirects {
    ns_param   404 /shared/404
    ns_param   403 /shared/403
    ns_param   503 /shared/503
    ns_param   500 /shared/500
}

ns_section ns/server/s1/tcl {
    ns_param    library     $s1_serverroot/tcl
}

ns_section "ns/server/s1/fastpath" {
    ns_param    serverdir   $homedir
    ns_param    pagedir     $s1_serverroot/www
}

ns_section ns/server/s1/module/nslog {
    ns_param    file    $s1_serverroot/log/access.log
}

ns_section ns/server/s1/modules {
    ns_param    nslog       nslog
    ns_param    nsdb        nsdb
    ns_param    nsproxy     nsproxy
    set libthread [lindex [lsort [glob -nocomplain $homedir/lib/thread*/libthread*[info sharedlibextension]]] end]
    ns_param    libthread   $libthread
}

#
# DB setup
#
ns_section ns/db/pools {
    ns_param    s1_pool1        "S1 Pool 1"
    ns_param    s1_pool2        "S1 Pool 2"
    ns_param    s1_pool3        "S1 Pool 3"
}

ns_section ns/server/s1/db {
    ns_param    pools              s1_pool1,s1_pool2,s1_pool3
    ns_param    defaultpool        s1_pool1
}

ns_section ns/db/pool/s1_pool1 {
    ns_param    connections        15
    ns_param    driver             postgres
    ns_param    datasource         ${db_host}:${db_port}:dbname=${s1_db_name}
    ns_param    user               $db_user
}

ns_section ns/db/pool/s1_pool2 {
    ns_param    connections        5
    ns_param    driver             postgres
    ns_param    datasource         ${db_host}:${db_port}:dbname=${s1_db_name}
    ns_param    user               $db_user
}

ns_section ns/db/pool/s1_pool3 {
    ns_param    connections        2
    ns_param    driver             postgres
    ns_param    datasource         ${db_host}:${db_port}:dbname=${s1_db_name}
    ns_param    user               $db_user
}

#---------------------------------------------------------------------
# Server s2
#---------------------------------------------------------------------
ns_section ns/server/s2 {
    ns_param    minthreads  2   ;# 1; minimal number of connection threads
    ns_param    connsperthread  1000    ;# 10000; number of connections (requests) handled per thread
}

ns_section ns/server/s2/redirects {
    ns_param   404 /shared/404
    ns_param   403 /shared/403
    ns_param   503 /shared/503
    ns_param   500 /shared/500
}

ns_section ns/server/s2/tcl {
    ns_param    library     $s2_serverroot/tcl
}

ns_section "ns/server/s2/fastpath" {
    ns_param    serverdir   $homedir
    ns_param    pagedir     $s2_serverroot/www
}

ns_section ns/server/s2/module/nslog {
    ns_param    file        $s2_serverroot/log/access.log
}

ns_section ns/server/s2/modules {
    ns_param    nslog       nslog
    ns_param    nsdb        nsdb
    ns_param    nsproxy     nsproxy
    set libthread [lindex [lsort [glob -nocomplain $homedir/lib/thread*/libthread*[info sharedlibextension]]] end]
    ns_param    libthread   $libthread
}

#
# DB setup
#
ns_section ns/db/pools {
    ns_param    s2_pool1        "S2 Pool 1"
    ns_param    s2_pool2        "S2 Pool 2"
    ns_param    s2_pool3        "S2 Pool 3"
}

ns_section ns/server/s2/db {
    ns_param    pools           s2_pool1,s2_pool2,s2_pool3
    ns_param    defaultpool     s2_pool1
}

ns_section ns/db/pool/s2_pool1 {
    ns_param    connections        15
    ns_param    driver             postgres
    ns_param    datasource         ${db_host}:${db_port}:dbname=${s2_db_name}
    ns_param    user               $db_user
}

ns_section ns/db/pool/s2_pool2 {
    ns_param    connections        5
    ns_param    driver             postgres
    ns_param    datasource         ${db_host}:${db_port}:dbname=${s2_db_name}
    ns_param    user               $db_user
}

ns_section ns/db/pool/s2_pool3 {
    ns_param    connections        2
    ns_param    driver             postgres
    ns_param    datasource         ${db_host}:${db_port}:dbname=${s2_db_name}
    ns_param    user               $db_user
}
#---------------------------------------------------------------------
ns_log notice "nsd.tcl: finished reading config file."