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

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

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.

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 D. [email protected]