Trying to use FastCGI to run PHP as UID of file owner

"Henry C." <[email protected]> Thu, 5 May 2011 13:36:40 +0200
Newsgroups gmane.comp.web.fastcgi.devel
Message-ID <[email protected]>
Hi there,

PHP:  5.3.3
Apache: 2.2.17
mod_fastcgi: 2.4.6

I'm trying out FastCGI for the first time, so please forgive my ignorance.

Basically, I'm trying to use FastCGI to run PHP scripts as the UID/owner of
the script itself, not the default apache 'nobody'/etc.

I must be missing a few things because I'm running into a few problems and
would appreciate *any* pointers.

Here's my apache config for a virtual host:

<VirtualHost ...>
 <IfModule mod_fastcgi.c>
  FastCgiServer /www/virtual/abc.com/cgi-bin/php
  AddHandler php-fastcgi .php
  SetHandler fastcgi-script
  Action php-fastcgi /cgi-bin/php
  AddType application/x-httpd-php .php
  <Directory /www/virtual/abc.com/htdocs>
      Options +ExecCGI
  </Directory>
 </IfModule>
 php_flag engine off
 Options +IncludesNOEXEC -Indexes +FollowSymLinks
 ServerAdmin [email protected]
 DocumentRoot /www/virtual/abc.com/htdocs/index.html  # or without index.ht=
ml
 php_admin_value open_basedir /www/virtual/abc.com/htdocs:/tmp
 php_admin_value display_errors on
 ServerName www.abc.com
 ServerAlias abc.com
 ErrorLog /www/virtual/abc.com/logs/error_log
 TransferLog /www/virtual/abc.com/logs/access_log
 ScriptAlias /cgi-bin/ /www/virtual/abc.com/cgi-bin/
</VirtualHost>

/cgi-bin/php file:
------------------
#!/bin/sh

PHPRC=3D"/usr/local/php5/lib"
export PHPRC
PHP_FCGI_CHILDREN=3D4
export PHP_FCGI_CHILDREN
exec /usr/local/php5/bin/php

/cgi-bin/php is +x (executable) owned by root.

Test PHP script: /htdocs/1.php is owned by UID/GID 20964:2374 (ie, not the
apache user).  Perms are 775 (-rwxrwxr-x).

If I browse to abc.com/1.php it hangs for 30s, producing this error in the =
logs:

FastCGI: comm with (dynamic) server "/www/virtual/abc.com/htdocs/1.php"
aborted: (first read) idle timeout (30 sec)
FastCGI: incomplete headers (0 bytes) received from server
"/www/virtual/abc.com/htdocs/1.php"

It's almost as if /cgi-bin/php is not being fed the 1.php file and it's
waiting for input from stdin (which is what the php CLI binary does if you =
run
it without args).  It then times out waiting for input, producing the error
above.

I've configured/compiled PHP 5.3.3 with/without '--with-fastcgi' (even thou=
gh
./configure --help does not show --with-fastcgi as being available).

I used 'top_dir =3D /.../apache/httpd-2.2.17' in the Makefile for
mod_fastcgi-2.4.6.  Your site talks about a php binary version which talks =
the
FastCGI protocol, so I'm not sure whether my PHP binary is compiled correct=
ly
to work with FastCGI (the binary produced appears to be the same with/witho=
ut
'--with-fastcgi, so this might be a factor).

Also, since this setup is intended for a customer, and they only have FTP
access to update their site, with CHMOD disabled, is there any way to do th=
is
without having to make the PHP script executable?  If I turn off the
executable bit, then I get the "execute not allowed" (for uid 99, gid 99, i=
e,
the apache user) error which I suppose is expected.

A side-effect of all this is that I cannot even browse to an HTML file
(index.html) - it produces the error:

FastCGI: invalid (dynamic) server "/www/virtual/abc.com/htdocs/index.html":
access for server (uid 99, gid 99) not allowed: execute not allowed

Or it tries to execute the htdocs/ directory if I leave out the index.html =
for
DocumentRoot:

FastCGI: invalid (dynamic) server "/www/virtual/abc.com/htdocs/": script is=
 a
directory!

I hope I've made sense in the above.  Any assistance/pointers would be
appreciated.  btw, it's a pity this mailing list is not open to google, else
I'd be able to search it for suggestions...

regards
Henry