10. Inet Configuration
10 inet配置
10.1简介
本节介绍如何为IP通信配置Erlang运行时系统。它还解释了如何通过配置文件来配置它以满足您的需求。这些信息主要用于具有特殊配置需求或问题的用户。通常不需要特定的设置来让Erlang在正确的IP配置平台上正常工作。
当Erlang启动时,它会读取内核变量inetrc
,如果已定义,该变量将指定用户配置文件的位置和名称。例:
% erl -kernel inetrc '"./cfg_files/erl_inetrc"'
请注意,.inetrc
在早期的Erlang/OTP版本中支持的文件的使用现在已经过时。
指定配置文件的第二种方法是将环境变量设置ERL_INETRC
为文件的全名。示例(bash):
% export ERL_INETRC=./cfg_files/erl_inetrc
请注意,内核变量inetrc
会覆盖此环境变量。
如果没有指定用户配置文件并且Erlang以非分布式或短名称分布式模式启动,那么Erlang会使用默认配置设置以及在大多数情况下都能正常工作的本机查找方法。二郎读取系统中没有信息inet
的配置文件(例如/etc/host.conf
和/etc/nsswitch.conf
在这些模式下),除了/etc/resolv.conf
与/etc/hosts
所读取并监测用于内部DNS客户端在Unix平台上的变化inet_res(3)
。
如果Erlang以长名称分布模式启动,则需要从某处获取域名并读取inet
该信息的系统配置文件。任何发现的主机和解析器信息都会被记录下来,但只要Erlang配置为原生查找,就不会使用。如果查找方法更改为'file'
或'dns'
,请参阅下面的信息。
原生查找(系统调用)始终是默认的解析器方法。对于所有平台都是如此,除了VxWorks和OSE Delta在哪里'file'
或'dns'
正在使用(按照该优先级顺序)。
在Windows平台上,Erlang搜索系统注册表,而不是在以长名称分布模式启动时查找配置文件。
10.2配置数据
如果在系统inet
配置文件(或系统注册表)中找到,Erlang将以下数据记录在本地数据库中:
- 主机名和主机地址
- 域名
- 名称服务器
- 搜索域
- 查找法
这些数据也可以在用户配置文件中明确指定。该文件将包含配置参数的行(每个都以句号结尾)。一些参数将数据添加到配置中(例如主机和名称服务器),其他参数覆盖之前的任何设置(如域和查找)。用户配置文件始终在配置过程中进行最后检查,使用户可以覆盖任何默认值或以前进行的设置。调用inet:get_rc()
以查看inet
配置数据库的状态。
有效的配置参数如下:
{file, Format, File}.
Format = atom()
File = string()
指定Erlang从中读取配置数据的系统文件。Format
告诉解析器文件是如何解释的:
resolv
(Unixresolv
.conf)
host_conf_freebsd
(FreeBSD的host.conf)
host_conf_bsdos
(BSDOS host.conf)
host_conf_linux
(Linux的host.conf)
nsswitch_conf
(Unix的nsswitch.conf)
hosts
(Unix主机)
File
是用完整路径指定文件名。
{resolv_conf, File}.
File = string()
指定Erlang从内部DNS客户端读取解析器配置的系统文件inet_res(3)
,并监视更改,即使它不存在。路径必须是绝对的。
这可以覆盖配置参数nameserver
并search
取决于指定文件的内容。他们也可以在将来反映文件内容的任何时间。
如果文件被指定为空字符串""
,则将来不会读取或监视文件。这模拟了以短名称分布模式启动节点时未配置DNS客户端的旧行为。
如果未指定此参数,则默认为/etc/resolv.conf
除非设置了环境变量ERL_INET_ETC_DIR
,该环境变量将该文件的目录定义为一些可能不是/etc
。
{hosts_file, File}.
File = string()
指定Erlang从内部主机文件解析器读取解析器配置的系统文件,并监视更改,即使它不存在。路径必须是绝对的。
当使用查找选项时,这些主机条目在全部添加{file, hosts, File}
上面或{host, IP, Aliases}
下面时被搜索file
。
如果文件被指定为空字符串""
,则将来不会读取或监视文件。这模拟了以短名称分布模式启动节点时未配置DNS客户端的旧行为。
如果未指定此参数,则默认为/etc/hosts
除非设置了环境变量ERL_INET_ETC_DIR
,该环境变量将该文件的目录定义为一些可能不是/etc
。
{registry, Type}.
Type = atom()
指定Erlang从中读取配置数据的系统注册表。win32
是唯一有效的选择。
{host, IP, Aliases}.
IP = tuple()
Aliases = [string()]
将主机条目添加到hosts表中。
{domain, Domain}.
Domain = string()
设置域名。
{nameserver, IP [,Port]}.
IP = tuple()
Port = integer()
添加用于主要名称服务器的地址(和端口,如果不是默认值)inet_res(3)
。
{alt_nameserver, IP [,Port]}.
IP = tuple()
Port = integer()
添加辅助名称服务器的地址(和端口,如果不是默认值)inet_res(3)
。
{search, Domains}.
Domains = [string()]
添加搜索域inet_res(3)
。
{lookup, Methods}.
Methods = [atom()]
指定查找方法以及尝试它们的顺序。有效的方法如下:
native
(使用系统调用)
file
(使用从系统配置文件和/或用户配置文件中检索到的主机数据)
dns
(使用Erlang DNS客户端inet_res(3)
进行域名服务器查询)
查找方法string
尝试将主机名解析为IPv4或IPv6字符串并返回得到的IP地址。它时,会自动第一次尝试native
是不是
在Methods
列表中。在这种情况下,要跳过它,nostring
可以将伪查找方法插入Methods
列表中的任何位置。
{cache_size, Size}.
Size = integer()
设置解析器缓存大小。默认为100个DNS记录。
{cache_refresh, Time}.
Time = integer()
设置inet_res(3)
刷新解析器缓存的频率(以毫秒为单位)(即删除过期的DNS记录)。默认为1小时。
{timeout, Time}.
Time = integer()
设置等待的时间,直到通过DNS进行重试(以毫秒为单位)inet_res(3)
。默认为2秒。
{retry, N}.
N = integer()
设置DNS查询的次数inet_res(3)
将在放弃之前尝试。默认为3。
{inet6, Bool}.
Bool = true | false
告诉DNS客户端inet_res(3)
查找IPv6地址。默认为false
。
{usevc, Bool}.
Bool = true | false
告诉DNS客户端inet_res(3)
使用TCP(虚拟电路)而不是UDP。默认为false
。
{edns, Version}.
Version = false | 0
设置inet_res(3)
将使用的EDNS版本。唯一允许的版本是零。默认为false
,这意味着不使用EDNS。
{udp_payload_size, Size}.
N = integer()
设置允许的UDP有效负载大小inet_res(3)
将在EDNS查询中通告。此外,当DNS查询将被认为对于UDP强制TCP查询而言太大时,也会设置限制; 这是不完全正确的,因为单个名称服务器的广告UDP有效负载大小是要使用的,但是这种简单的策略会一直执行,直到需要实施更智能(探测,缓存)算法。默认值为1280,这取决于标准的以太网MTU大小。
{udp, Module}.
Module = atom()
告诉Erlang使用另一个原始的UDP模块inet_udp
。
{tcp, Module}.
Module = atom()
告诉Erlang使用另一个原始TCP模块inet_tcp
。
clear_hosts.
清理主机表。
clear_ns.
清除记录的名称服务器列表(主要和次要)。
clear_search.
清除搜索域列表。
10.3用户配置示例
假设用户不希望Erlang使用本地查找方法,但希望Erlang从开始读取所有必需的信息并使用它来解析名称和地址。如果查找失败,Erlang将从名称服务器请求数据(使用Erlang DNS客户端,设置为使用允许更大响应的EDNS)。解析器配置在配置文件更改时更新。另外,DNS记录永远不会被缓存。用户配置文件(在本例中命名erl_inetrc
,存储在目录中./cfg_files
)可以如下所示(Unix):
%% -- ERLANG INET CONFIGURATION FILE --
%% read the hosts file
{file, hosts, "/etc/hosts"}.
%% add a particular host
{host, {134,138,177,105}, ["finwe"]}.
%% do not monitor the hosts file
{hosts_file, ""}.
%% read and monitor nameserver config from here
{resolv_conf, "/usr/local/etc/resolv.conf"}.
%% enable EDNS
{edns,0}.
%% disable caching
{cache_size, 0}.
%% specify lookup method
{lookup, [file, dns]}.
例如,Erlang可以如下方式启动:
% erl -sname my_node -kernel inetrc '"./cfg_files/erl_inetrc"'