PATCH: Add $fqdn stream and http variable.
coles.david at gmail.com
Sun Nov 25 22:49:12 UTC 2018
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
On some systems `gethostent` can be used to explicitly walk
`/etc/hosts`, but behaviour is so inconsistent I would avoid it.
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()`
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
> Also, the $hostname variable is expected to be FQDN on systems
> participating in the DNS. If it's not FQDN in your case, you may
> want to consider reconfiguring your system. See
> for a previous discussion on the topic.
Thank you for the pointer to the previous discussion. Doing some
investigation I've found several contrary recommendations:
: Function: int gethostname (char *name, size_t size)
: If the system participates in the DNS, this is the FQDN (see
: The recommended method of setting the FQDN is to make the hostname be an alias
: for the fully qualified name using /etc/hosts, DNS, or NIS. For
example, if the
: hostname was "ursula", one might have a line in /etc/hosts which reads
: 127.0.1.1 ursula.example.com ursula
The Linux programming interface. Kerrisk, M. (2010). §12.2 (p. 299)
: Often, this name is something like the hostname prefix from the system’s DNS
: domain name.
Advanced programming in the UNIX environment. Stevens, W. R., & Rago,
S. A. (2013). §6.9 (p. 172)
: Historically, BSD-derived systems provide the `gethostname` function to return
: only the name of the host.
: If the host is connected to a TCP/IP network, the host name is normally the
: fully qualified domain name of the host.
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.
More information about the nginx-devel