PATCH: Add $fqdn stream and http variable.
Maxim Dounin
mdounin at mdounin.ru
Mon Nov 26 14:51:31 UTC 2018
Hello!
On Sun, Nov 25, 2018 at 02:49:12PM -0800, David Coles wrote:
> Hi Maxim. Thanks for your comments.
>
> On Sat, Nov 24, 2018 at 4:35 AM Maxim Dounin <mdounin at mdounin.ru> wrote:
> > No, thank you. This change makes nginx startup unconditionally
> > dependant on the DNS availability. This is not something we are
> > going to accept.
>
> That's reasonable. I based this behaviour off `hostname -f` which also
> uses `gethostbyname` for resolving the FQDN.
> Note, on most systems this doesn't trigger an actual DNS lookup
> provided that hosts canonical name (usually the FQDN) is configured in
> `/etc/hosts` (See paragraph 5 of THE FQDN
> <https://manpages.debian.org/testing/hostname/hostname.1.en.html>).
The "no DNS lookup on most systems" is not something we can rely
on.
> On some systems `gethostent` can be used to explicitly walk
> `/etc/hosts`, but behaviour is so inconsistent I would avoid it.
Trying to use /etc/hosts will lead to results different from
results of normal name resolution, so this doesn't looks like an
option.
> How would you feel about trying to resolve the FQDN at nginx startup
> and, if unavailable falling back to `$hostname`? This matches the
> behaviour of other languages (e.g. Python's `socket.getfqdn()`
> <https://docs.python.org/3/library/socket.html#socket.getfqdn>).
Even trying to resolve the FQDN will imply DNS dependency. If DNS
is not availble it will wait for a timeout to expire before
proceeding any further.
> I could also make this a runtime evaluation, but it would be nice to
> only evaluate once as it would often be used in hot paths like logging
> and tracing.
Using system resolver at runtime is basically not possible,
because there is no non-blocking interface to system resolver, and
using blocking one will will block the whole worker process during
name resolution - which can take significant time. That's
basically why nginx has resolver in it.
The only option I see is doing name resolution only conditionally,
either when requested by a configuration directive, or when the
variable is actually used in the configuration. But I don't think
this worth the effort - configuring appropriate hostname and/or
using the name directly in nginx configuration would be a better
idea.
[...]
> Linux in particular seems to have interpreted `gethostname` as
> returning a DNS label (maximum of 63 characters) rather than a full
> DNS name (up to 213 characters).
> Thus it's impossible to represent certain DNS names as the system hostname.
There is more than one Linux distribution, and Debian is just one
of them. There are others which use FQDN:
https://serverfault.com/questions/331936/setting-the-hostname-fqdn-or-short-name
Note well that Debian can use FQDN as well, and "hostname -f" is
smart enough to use such name without looking further.
While length restrictions might make it impossible to represent
some names, this is unlikely a practical problem.
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx-devel
mailing list