首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

10. Inet Configuration

10.1简介

本节介绍如何为IP通信配置Erlang运行时系统。它还解释了如何通过配置文件来配置它以满足您的需求。这些信息主要用于具有特殊配置需求或问题的用户。通常不需要特定的设置来让Erlang在正确的IP配置平台上正常工作。

当Erlang启动时,它会读取内核变量inetrc,如果已定义,该变量将指定用户配置文件的位置和名称。例:

代码语言:javascript
复制
% erl -kernel inetrc '"./cfg_files/erl_inetrc"'

请注意,.inetrc在早期的Erlang/OTP版本中支持的文件的使用现在已经过时。

指定配置文件的第二种方法是将环境变量设置ERL_INETRC为文件的全名。示例(bash):

代码语言:javascript
复制
% 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 (Unix resolv.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),并监视更改,即使它不存在。路径必须是绝对的。

这可以覆盖配置参数nameserversearch取决于指定文件的内容。他们也可以在将来反映文件内容的任何时间。

如果文件被指定为空字符串"",则将来不会读取或监视文件。这模拟了以短名称分布模式启动节点时未配置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):

代码语言:javascript
复制
%% -- 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可以如下方式启动:

代码语言:javascript
复制
% erl -sname my_node -kernel inetrc '"./cfg_files/erl_inetrc"'

扫码关注腾讯云开发者

领取腾讯云代金券