Serving a subdirectory
Francis Daly
francis at daoine.org
Fri Dec 6 20:47:43 UTC 2019
On Fri, Dec 06, 2019 at 04:47:08PM +0100, Thomas Schweikle wrote:
Hi there,
> OK. Trying with a completely different question:
>
> My server serves /var/www/html directory-content as static pages to http://
> <server>/
>
> How do I have to set it up to additionally serve http://<server>/chrony
> from /var/www/chrony?
location /chrony/ {
root /var/www;
}
Although I would probably really use "location ^~ /chrony/ {".
And that is all you need, in the "common" case.
Separate from that, since you want to do special handling of "index.sh"
within "/chrony/", I would suggest nesting the location, like so:
location ^~ /chrony/ {
root /var/www;
location ~ index\.sh$ {
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
}
You will want
index index.sh index.html;
somewhere. You probably will not want the try_files line that you have.
And you can put the
include /etc/nginx/fastcgi_params;
and fastcgi_param lines together somewhere -- inside this location{},
or in somewhere that will inherit in to it. The "best" place depends on
what else the server config is doing -- do you, for example, want to
handle /xxx/index.sh as well as /chrony/index.sh?
> I've tried with:
> root /var/www/chrony;
That will cause the request /chrony to look for /var/www/chrony/chrony.
> But this leads to error 404 - not found.
> root /var/www;
> index index.sh index.html;
>
> location /chrony {
> try_files $uri $uri/ $uri/index.sh;
> }
>
> location ~ "index\.sh$" {
> gzip off;
> fastcgi_pass unix:/var/run/fcgiwrap.socket;
> include /etc/nginx/fastcgi_params;
> fastcgi_param DOCUMENT_ROOT $document_root;
> fastcgi_param SCRIPT_FILENAME $request_filename;
> }
That looks to me like it probably should work. At least for the requests
/chrony and /chrony/ -- anything like /chrony/x will probably fail.
> But this also lead to error - 404 - not found.
> root /var/www/chrony;
Again, that will cause the request /chrony to look for /var/www/chrony/chrony.
> lead to 404 - not found.
> root /var/www/chrony;
Same.
> lead to 404 - not found.
> /var/www/chrony:
> insgesamt 16
> drwxr-xr-x 2 root root 4096 Dez 4 17:17 .
> drwxr-xr-x 4 root root 4096 Dez 2 16:25 ..
> -rw-r--r-- 1 root root 95 Dez 3 13:42 chrony.css
> -rwxr-xr-x 1 root root 1712 Dez 3 16:07 index.sh
Most of the above configs are looking for /var/www/chrony/chrony/index.sh.
> root /var/www/html;
> index index.html index.htm index.nginx-debian.html;
>
> location / {
> # First attempt to serve request as file, then
> # as directory, then fall back to displaying a 404.
> try_files $uri $uri/ =404;
As it happens, that description (and configuration) is pretty much
what happens when try_files is not used. So you can probably just omit
that line.
> location /chrony {
> root /var/www/chrony;
root /var/www;
> try_files $uri $uri/ $uri/index.sh;
The final argument to try_files is a url that must exist; it is not
a file to try. So if you request /chrony/x, this will do an internal
redirect to /chrony/x/index.sh.
You are probably better off including "index.sh" in the "index" directive,
and omitting this try_files line too.
> location ~ "index\.sh$" {
> gzip off;
> fastcgi_pass unix:/var/run/fcgiwrap.socket;
> include /etc/nginx/fastcgi_params;
> fastcgi_param DOCUMENT_ROOT $document_root;
> fastcgi_param SCRIPT_FILENAME $request_filename;
If the request here is /chrony/index.sh, then $document_root is
/var/www/html and $request_filename is /var/www/html/chrony/index.sh.
In nginx, one request is handled in one location{}. Only the config in,
or inherited into, that location matters.
You do not set "root" in this location; therefore the inherited value
is /var/www/html.
If this location is only intended to handle things below /chrony,
set root explicitly; or set root implicitly by nesting it inside the
location that does set root appropriately.
Good luck with it,
f
--
Francis Daly francis at daoine.org
More information about the nginx
mailing list