Re: Appclass/Virtual Host Configuration Problem
Stanley Gambarin (stanleyg@cs.bu.edu)
Wed, 24 Sep 1997 22:15:39 -0400 (EDT)
Date: Wed, 24 Sep 1997 22:15:39 -0400 (EDT)
From: Stanley Gambarin <stanleyg@cs.bu.edu>
To: Jim Boutcher <jimb@novia.net>
Subject: Re: Appclass/Virtual Host Configuration Problem
In-Reply-To: <199709242139.QAA27791@oasis.novia.net>
Message-Id: <Pine.GSO.3.96.970924214935.20884A-100000@csa>
On Wed, 24 Sep 1997, Jim Boutcher wrote:
> It's just with fastcgi.. I created a symbolic link to the cgi-bin directory
> (where the fast cgi apps are located).. I configured Apache to
> followsymlinks, and I have absolutely no problems accessing regular
> cgi's/programs using the symbolic link.. But, when I access the fastcgi
> application, I get an error, and the error log states something along the
> lines of:
>
> No AppClass directive for
> /usr/local/etc/httpd/symboliclinktocgidir/fastcgiapp.fcgi
>
I don't know why I had not thought of this first...
probably because I was too busy... so, the following setup will
NOT work:
AppClass /path1/myfcgi.app
Symbolic link from /document_root/fcgi-bin/myfcgi.app to
/path1/myfcgi.app
HTTP request made to /fcgi-bin/myfcgi.app --- NOT
Why ?
The fastcgi works a bit differently from CGI,
so it need to maintain certain data structures about each
configured application class (AppClass). In order to
distinguish them, mod_fastcgi module uses their PATHNAME
is a uniqe identifier (thus, not allowing definition of the
multiple application classes with the name executable). This,
however constitues a problem: when access to the fastcgi
application is made, the mod_fastcgi module will try to
find a data structure with the identifier
/document_root/fcgi-bin/myfcgi.app, and not /path1/myfcgi.app
and voila.. you get NOT_FOUND error return from the server.
QuickFix:
use AppClass /document_root/fcgi-bin/myfcgi.app
in the config files and it should work (i think)....but
There are 2 things to consider here.. first of all
current implementation should work with the dynamically
started applications (since they create data structures
at first invokation and will contain symbolic pathname,
which is good). However, it will not work if you have multiple
symbolic links to the same executable (actually, it will
create a copy of the data structure for each one, which
is not what we want, since it is the same executable).
Now, the solution (i am not going to implement it
due to the lack of time, however, i am more than willing to
apply patches :))
- introduce another field into FcgiServerInfo data
structure, call it uniqId (char * or DString)
- change the LookupFcgiServerInfo function to use
uniqId field instead of execPath field it uses now.
- change [External]AppClassCmd routines to do the
following: stat execPath, then readlink execPath to obtain
a full pathname to executable, then compute md5 hash of it
(use GetHashedPath()) and stick it into uniqId. People familiar
with the code will immediately realize that that is what we
are doing to provide unique lockfile names, so common code
can be reused.
- change FcgiHandler to do the following: when request
is recieved, do a stat/readlink/GetHashedPath() on the filename
and then do your search. We do incur a a couple of system
calls per each request, but the whole thing has to be optimized
anyways, so if you can come up with some performance enhancements
then great.
- that's about all that needs to be modified.
Stanley.