Forum: NGINX PHP via FastCGI in / and sub-directory location w/ different roots

1b2ee8b44150bcd86691b5361dabd24a?d=identicon&s=25 Thilo-Alexander Ginkel (Guest)
on 2013-11-07 11:38
(Received via mailing list)
Hi there,

I am currently somewhat stuck getting the following setup up and
running:

I have one PHP web application residing in /usr/share/a that I'd like to
have available at /. This works as expected.

I have a second PHP web app residing in /var/www/b/public, that I'd like
to
have available at /b.

My current ngnix (1.2.1) configuration looks like this:

-- 8< --
server {
  listen       *:443 ssl;
  listen [::]:443 ;

  [...]

  root /usr/share/a;
  index  index.php;

  location ~ ^/b/.*\.php$ {
    rewrite         ^/b(/.*) $1 break;
    root  /var/www/b/public;
    include /etc/nginx/fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
  }

  location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
  }

  location ~ ^/b/ {
    root  /var/www/b/public;
    index  index.php;
  }
}
-- 8< --

/etc/nginx/fastcgi_params:
-- 8< --
fastcgi_param   QUERY_STRING              $query_string;
fastcgi_param   REQUEST_METHOD    $request_method;
fastcgi_param   CONTENT_TYPE              $content_type;
fastcgi_param   CONTENT_LENGTH    $content_length;

fastcgi_param   SCRIPT_FILENAME   $request_filename;
fastcgi_param   SCRIPT_NAME                 $fastcgi_script_name;
fastcgi_param   REQUEST_URI                 $uri?$args;
fastcgi_param   DOCUMENT_URI              $document_uri;
fastcgi_param   DOCUMENT_ROOT             $document_root;
fastcgi_param   SERVER_PROTOCOL   $server_protocol;

fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR                 $remote_addr;
fastcgi_param   REMOTE_PORT                 $remote_port;
fastcgi_param   SERVER_ADDR                 $server_addr;
fastcgi_param   SERVER_PORT                 $server_port;
fastcgi_param   SERVER_NAME                 $server_name;

fastcgi_param   HTTPS                           $https;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS         200;
-- 8< --

I included the rewrite in location ~ ^/b/.*\.php$ because otherwise
nginx/php-fpm will look for the script /b/index.php in
/var/www/b/public/b/index.php, which has an extra "b/" in the path.

With the rewrite enabled, however, the PHP application guesses its own
path
incorrectly issuing redirects to locations that leave out "/b'.

I would like to avoid symlinking /var/www/b into /usr/share/a.

Any ideas?

Thanks,
Thilo
1266aa99d1601b47bbd3ec22affbb81c?d=identicon&s=25 B.R. (Guest)
on 2013-11-07 13:44
(Received via mailing list)
IMHO, using a rewrite in nginx to modify the way PHP processes the
request
looks strange to me. Maybe am I wrong.

Have you had a look in the content of the params you send to PHP through
CGI? Overloading some of the variables by removing the leading '/b'
there
might help PHP resolving correctly the filename while searching it on
disk.
I would personally look in that direction.

I would also use another PHP pool (thus another socket) to isolate both
applications.
---
*B. R.*
36a8284995fa0fb82e6aa2bede32adac?d=identicon&s=25 Francis Daly (Guest)
on 2013-11-08 23:24
(Received via mailing list)
On Thu, Nov 07, 2013 at 11:37:22AM +0100, Thilo-Alexander Ginkel wrote:

Hi there,

> I am currently somewhat stuck getting the following setup up and running:

I've tried to replicate what you're doing, and it turns out I'm unable
to work out what exactly you're doing.

> I have one PHP web application residing in /usr/share/a that I'd like to
> have available at /. This works as expected.

OK.

> I have a second PHP web app residing in /var/www/b/public, that I'd like to
> have available at /b.

OK.

So, when you ask for the url /b/file.txt, which file on the filesystem
do you want nginx to return? (And: which file does nginx return?)

And when you ask for the url /b/env.php, which file on the filesystem
do you want your fastcgi server to process?

(I would have expected the answers to these questions to be similar,
but using the config you provided, they look different. I suspect I'm
doing something wrong.)

>   location ~ ^/b/.*\.php$ {
>     rewrite         ^/b(/.*) $1 break;
>     root  /var/www/b/public;

The rewrite and root here look a bit odd to me; but if it works, it
works.

> fastcgi_param   REQUEST_URI                 $uri?$args;

Is there a reason that isn't just "$request_uri" at the end?

Maybe it's a default value from a distribution of nginx?

> I included the rewrite in location ~ ^/b/.*\.php$ because otherwise
> nginx/php-fpm will look for the script /b/index.php in
> /var/www/b/public/b/index.php, which has an extra "b/" in the path.

That kind-of answers one of the "which file?" questions, but leaves the
other one open.

> With the rewrite enabled, however, the PHP application guesses its own path
> incorrectly issuing redirects to locations that leave out "/b'.

Do you know which variable the application uses to guess its own path?

It could be REQUEST_URI or DOCUMENT_URI or maybe something else. (If it
is REQUEST_URI, then the change above may work for you.)

> I would like to avoid symlinking /var/www/b into /usr/share/a.
>
> Any ideas?

It should be possible; but I'm unclear on what you're trying to do,
so I can't suggest how to do it.

Maybe the REQUEST_URI change above is useful?

Depending on what else is in your config file, maybe replacing the two
/b/-related location blocks with the single nested

===
  location ^~ /b/ {
    alias  /var/www/b/public/;
    index  index.php;
    location ~ \.php$ {
      include /etc/nginx/fastcgi_params;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
  }
===

would do what you want?

(I've tested this with 1.2.6, not the 1.2.1 that you are using.)

  f
--
Francis Daly        francis@daoine.org
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.