You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Markus Schiegl <ms...@schiegl.com> on 2006/04/22 23:33:43 UTC

mod_proxy_fcgi and php

Hi,

i took some time and played with the latest mod_proxy_fcgi and PHP as
Backend.
It even works somehow :-)

I use trunk on Solaris 10x86 and PHP 5.1.2 configured as fastcgi server.
PHP has been configured with "doc_root = /opt/www/html" and
"cgi.fix_pathinfo = 0"
Omitting these settings when accessing /opt/www/html/i.php gives:

"No input file specified."

According to truss PHP tried to stat some weird files
(e.g. proxy:balancer://phpfiles/i.php) finds nothing and *bang*
In the working case SCRIPT_FILENAME is set to e.g.
"proxy:balancer://phpfiles/i.php"
My simple php apps work nevertheless. 

relevant lines from httpd.conf...
=================================

<Proxy balancer://phpfiles>
         BalancerMember fcgi://localhost:8000
</Proxy>

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f
# according to the docs REQUEST_FILENAME should contain the full
filename
# in this case its the same as REQUEST_URI (i.e. /i.php and not
/opt/www/html/i.php)
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} \.php$

#RewriteRule ^/(.*) balancer://phpfiles/$1
[E=SCRIPT_FILENAME:%{DOCUMENT_ROOT}%{REQUEST_FILENAME},P]
# tried to overwrite SCRIPT_FILENAME, rewrite.log confirms this, but it
didn't work ;-)
# RewriteRule ^/(.*) fcgi://localhost:8000/$1 [P]  # needs patch below
(1)
RewriteRule ^/(.*) balancer://phpfiles:8000/$1 [P]


error.log (Patch (1) applied and corresponding RewriteRule used)
==================================================================
...
mod_proxy_fcgi.c(88): proxy: FCGI: canonicalising URL
//localhost:8000/i.php
mod_proxy_fcgi.c(113): [client 192.168.210.20] proxy: FCGI: set
r->filename to proxy:fcgi://localhost:8000/i.php
mod_proxy_fcgi.c(118): [client 192.168.210.20] proxy: FCGI: set
r->path_info to /i.php
proxy_util.c(1397): [client 192.168.210.20] proxy: *: found reverse
proxy worker for fcgi://localhost:8000/i.php
mod_proxy.c(756): Running scheme fcgi handler (attempt 0)
...

>From my limited perspective r->filename should be set to
"/opt/www/html/i.php"
Any ideas?

While playing with mod_rewrite i realized it does not recognize fcgi as
scheme yet (1)
The following patch should solve this.

Index: httpd-trunk/modules/mappers/mod_rewrite.c
===================================================================
--- httpd-trunk/modules/mappers/mod_rewrite.c   (revision 396157)
+++ httpd-trunk/modules/mappers/mod_rewrite.c   (working copy)
@@ -577,6 +577,9 @@
         if (!strncasecmp(uri, "tp://", 5)) {        /* ftp://    */
             return 6;
         }
+        if (!strncasecmp(uri, "cgi://", 6)) {       /* fcgi://    */
+            return 7;
+        }
         break;
 
     case 'g':

--
Markus Schiegl  |  ms@schiegl.com  |  7159881@ICQ | PGP-KeyID:
0x21063504


Re: mod_proxy_fcgi and php

Posted by Garrett Rooney <ro...@electricjellyfish.net>.
On 4/22/06, Markus Schiegl <ms...@schiegl.com> wrote:

Sorry it took me so long to get back to this.  Got distracted with
other things, etc.

> From my limited perspective r->filename should be set to
> "/opt/www/html/i.php"
> Any ideas?

mod_proxy_fcgi is talking to an arbitrary socket that could correspond
to any file on disk, how would it figure out what to set r->filename
to?

The fact that PHP has settings you can tweak to make this work implies
to me that it's not a problem we need to fix...

> While playing with mod_rewrite i realized it does not recognize fcgi as
> scheme yet (1)
> The following patch should solve this.
>
> Index: httpd-trunk/modules/mappers/mod_rewrite.c
> ===================================================================
> --- httpd-trunk/modules/mappers/mod_rewrite.c   (revision 396157)
> +++ httpd-trunk/modules/mappers/mod_rewrite.c   (working copy)
> @@ -577,6 +577,9 @@
>          if (!strncasecmp(uri, "tp://", 5)) {        /* ftp://    */
>              return 6;
>          }
> +        if (!strncasecmp(uri, "cgi://", 6)) {       /* fcgi://    */
> +            return 7;
> +        }
>          break;
>
>      case 'g':

I'll look at getting this checked in, thanks!

-garrett