[PATCH] ngx_conf_file: "include ./" acts relative to currently parsed file
Guillaume Outters
guillaume-nginx at outters.eu
Tue Sep 3 16:21:47 UTC 2019
Le 2019-09-03 16:39, Maxim Dounin a écrit :
>> include @example.conf;
>> include example.conf local;
>> include example.conf -l;
>> include example.conf relative;
>> include example.conf from_there;
>> include example.conf nearby;
>
> I can't say I like either of the variants.
… Neither do I (although the "nearby", that I submitted in my last
patch that you perhaps haven't read yet, seems the most natural one).
> Additionally, all variants with an additional explicit flags won't
> work in other cases where a configuration prefix is currently
> used, such as ssl_certificate or auth_basic_user_file. On the
> other hand, obviously enough it should be possible to resolve from
> the current included file all paths which are currently resolved
> from the configuration prefix.
The big difference between include and all other directives is that
include does not do variable resolution.
This allows the misuse of (request-time) variables to store absolute
paths, with things such as:
map $http_host $app_root { default /var/www/app1; } # Or a set, or
$document_root/.., whatever.
ssl_certificate $app_root/certs/thissite.pem;
This makes an unnecessary variable evaluation at runtime, but as it's
technically possible, and as such I'm quite certain there exists a ton
of such configurations in the world (if only to reduce typing, and thus
copy-paste errors).
But include has no such configurability.
Both of these advocate in favor of config-time variables:
- include would benefit of a bit of configurability:
webapps containing their nginx config could be dropped by a sysadm
wherever
he wanted, set a (config-time) $app_root, and the app would work out
of the
box by using $app_root to reference snippets indepently of where it
has been
put.
- other directives (that for now misuse request-time variables) would
have a
clear separation between config-time resolved parts and request-time
ones,
with a performance gain on the config-time ones
But this would require a bit of thinking (about where variables do get
stored
during the config reading, do they persist until the request-time,
attached to
each block with the last value they acquired during config reading, to
serve as
default values for the request-time variables, and so on).
In the meantime (and who can tell the meantime's duration?), the
"nearby" keyword
is a simple, semi-elegant placeholder for that.
(Hum… in fact, even with a way to "setenv $app_dir; include
$app_dir/nginx/snippet.conf;",
I think I would continue to just "include snippet.conf nearby;")
--
Guillaume
More information about the nginx-devel
mailing list