Erlang 20

5.安装Orber | 5. Installing Orber

5 安装Orber

5.1安装过程

本章介绍如何在Erlang环境中安装Orber。

制备

首先,您必须决定是否要将Orber作为一个:

  • 单节点(非分布式) - 与其他Orber实例和其他供应商提供的ORB的所有通信均使用OMG GIOP协议。

  • 多节点(分布式) - 同一个Orber节点domain通过Erlang分发协议进行通信。对于所有其他Orber实例,即不属于domain其他供应商的ORB的一部分,使用OMG GIOP协议。

使用哪种方法是高度特定于实现的,但是您应该考虑几件事情:

  • Orber域中的所有节点都应该具有相同的安全级别。

  • 如果容量大于负载(流量),单节点Orber可能是一个很好的解决方案。

  • 在某些情况下,分布式系统架构需要单节点Orber安装。

  • 多节点Orber使负载平衡成为可能,并创建了一个更容错的系统。如果使用分布式Mnesia表,则对象也可以具有统一的视图。

  • 由于GIOP协议产生比Erlang分发协议更大的开销,因此与ORB间通信(GIOP)相比,在与同一Orber域内的对象进行通信时性能会更好。

您还必须决定是否希望Orber使用disc_copies和/或存储内部数据ram_copies。您应该选择哪种存储类型取决于您的应用程序中是否打算使用Mnesia。如果您打算使用,disc_copies您必须先创建一个Mnesia模式,其中包含有关计划运行Orber的Erlang节点位置的信息。有关更多背景信息,请参阅Mnesia文档。

在某些情况下,绝对有必要更改Orber的默认配置。 例如,如果两个Orber-ORB应能够通过GIOP进行通信,则它们必须具有唯一的域域。 请参阅配置设置部分。 如果您遇到任何问题; 请参阅本用户指南中关于调试的章节。

跳跃启动Orber

启动Orber最简单的方法是使用orber:jump_start(Port),它启动一个带有(很可能)唯一域(即“IP-number:Port”)的单节点ORB。 此功能只能在开发和测试过程中使用。 对于任何其他情况,请按照以下各节所述安装并启动Orber。 侦听端口,即iiop_port配置参数,被设置为提供的端口。

警告

使用orber时,如何配置Orber:jump_start(端口)可能会随时更改而不会发出警告。 因此,此操作不得用于交付给客户的系统中。

安装单节点Orber

由于单个节点Orber通过OMG GIOP协议进行通信,所以不需要启动Erlang分发(即使用-name / -sname)。

如果我们用ram_copies不需要创建基于磁盘的架构。只需使用:

erl> mnesia:start(). erl> corba:orb_init([{domain, "MyRAMSingleNodeORB"}]). erl> orber:install([node()], [{ifr_storage_type, ram_copies}]). erl> orber:start().

如果您需要安装disc_copies您必须首先创建一个Mnesia模式。否则,安装与RAM安装类似:

erl> mnesia:create_schema([node()]). erl> mnesia:start(). erl> corba:orb_init([{domain, "MyDiskSingleNodeORB"}]). erl> orber:install([node()], [{ifr_storage_type, disc_copies}, {nameservice_storage_type, disc_copies}]). erl> orber:start().

您仍然可以选择将IFR数据存储为ram_copies,但如果节点重新启动,则必须重新安装数据(即调用orber:install / 2)。 因此,由于IFR数据相当静态,您应该使用disc_copies。 有关更多信息,请参阅参考手册中的orber部分。

如果你不需要改变Orber的配置,你可以跳过orb_init/1。但是,您至少应该设置IIOP超时参数。

安装基于RAM的多节点ORBER

Orber使用Erlang分发协议。因此,您必须首先启动它,例如使用:

hostA> erl -sname nodeA

在这个例子中,我们假设我们想要使用两个节点; nodeA和nodeB。 由于Mnesia必须知道哪些其他节点应作为发行版的一部分,因此我们需要添加Mnesia配置参数extra_db_nodes或使用mnesia:change_config / 2。 首先,我们必须在所有节点上启动Mnesia,然后才能安装Orber:

nodeA@hostA> mnesia:start(). nodeA@hostA> mnesia:change_config(extra_db_nodes, [nodeA@hostA, nodeB@hostB]).

之后,我们必须首先确保两个节点将使用相同的域名,然后我们才能安装Orber:

nodeA@hostA> corba:orb_init([{domain, "MyRAMMultiNodeORB"}]). nodeA@hostA> orber:install([nodeA@hostA, nodeB@hostB], [{ifr_storage_type, ram_copies}]). nodeA@hostA> orber:start().

请注意,您只能调用orber:install/1/2在其中一个节点上。现在,我们可以在另一个节点上启动Orber:

nodeB@hostB> corba:orb_init([{domain, "MyRAMMultiNodeORB"}]). nodeB@hostB> orber:start().

安装基于磁盘的多节点Orber

至于基于RAM的多节点Orber安装,必须启动Erlang分发(例如,erl -sname nodeA)。主要区别在于,当它是基于磁盘的时候,必须创建一个Mnesia模式:

nodeA@hostA> mnesia:create_schema([nodeA@hostA, nodeB@hostB]). nodeA@hostA> mnesia:start().

在这个例子中,我们假设我们想要使用两个节点; nodeAnodeB。由于无法在多个节点上创建模式。因此,我们所要做的就是启动Mnesia(即调用mnesia:start()nodeB

在所有节点上启动Mnesia之后,您必须确认所有节点具有相同的域名,然后才能安装Orber:

nodeA@hostA> corba:orb_init([{domain, "MyDiskMultiNodeORB"}]). nodeA@hostA> orber:install([nodeA@hostA, nodeB@hostB], [{ifr_storage_type, disc_copies}]). nodeA@hostA> orber:start().

请注意,您只能调用orber:install/1/2在其中一个节点上。现在,我们可以在另一个节点上启动Orber:

nodeB@hostB> corba:orb_init([{domain, "MyDiskMultiNodeORB"}]). nodeB@hostB> orber:start().

5.2配置

必须正确配置Orber,以避免恶意攻击,并自动终止不再使用的IIOP连接。提取有关Orber的配置参数的信息的简单方法是调用操作orber:info/1/2。Orber提供以下配置参数:

键值范围默认
domainstring()"ORBER"
iiop_portinteger() >= 04001
nat_iiop_portinteger() > 0 | {local, integer(), {integer(), integer()}}The same as iiop_port
iiop_out_ports0 | {integer(),integer()}0
iiop_out_ports_attemptsinteger() > 01
iiop_out_ports_randomtrue | falsefalse
iiop_max_fragmentsinteger() > 0 | infinityinfinity
iiop_max_in_requestsinteger() > 0 | infinityinfinity
iiop_max_in_connectionsinteger() > 0infinity
iiop_backloginteger() > 05
iiop_packet_sizeinteger() > 0 | infinityinfinity
ip_addressstring() | {multiple, string()}All interfaces
ip_address_localstring()Defined by the underlying system
nat_ip_addressstring() | {multiple, string()} | {local, string(), {string(), string()}}The same as ip_address
objectkeys_gc_timeinteger() > 0 | infinityinfinity
giop_version{1,0} | {1,1} | {1,2}{1,1}
iiop_setup_connection_timeoutinteger() > 0 | infinityinfinity
iiop_connection_timeoutinteger() > 0 | infinityinfinity
iiop_in_connection_timeoutinteger() > 0 | infinityinfinity
iiop_out_keepalivetrue | falsefalse
iiop_in_keepalivetrue | falsefalse
iiop_timeoutinteger() > 0 | infinityinfinity
interceptors{native, atom()}-
local_interceptors{native, atom()}-
orbInitRefstring() | undefinedundefined
orbDefaultInitRefstring() | undefinedundefined
orber_debug_level0 - 100
flagsinteger() >= 00
iiop_acl{atom(), string()} | [{atom(), string(), string()}][]
secureno | sslno
ssl_generation2 | 32
iiop_ssl_portinteger() >= 04002
iiop_ssl_accept_timeoutinteger() > 0 | infinityinfinity
iiop_ssl_backloginteger() > 05
iiop_ssl_ip_address_localstring()Defined by the underlying system
nat_iiop_ssl_portinteger() > 0 | {local, integer(), {integer(), integer()}}The same as iiop_ssl_port
ssl_server_optionslist()See the SSL application for valid options.
ssl_client_optionslist()See the SSL application for valid options.
iiop_ssl_out_keepalivetrue | falsefalse
iiop_ssl_in_keepalivetrue | falsefalse

表'Orber配置参数'的评论:

自Orber以来,它们应该通过IIOP进行通信,必须拥有唯一的名称,如果两个具有相同的名称,则通信将失败。可以不包含^G(ie \007)。iiop_port如果设置为0,操作系统将选择任何空闲端口。

注意:在UNIX系统上,最好使IIOP端口高于1023,因为不推荐以root用户身份运行Erlang。

列表(IPv4或IPv6字符串)可能只包含一个用于传出连接的地址。对于传入连接,接口列表可能包含多个IP字符串。如果设置为传出连接并授予访问权限,则Orber将在连接到服务器端ORB时使用该本地接口。对于传入连接,客户端ORB需要在本地使用其中一个列出的接口。如果不这样做,访问将被拒绝。模块orber_acl提供了用于评估过滤器和地址访问控制的操作。另请参阅接口配置防火墙配置章节。

可以使用额外的超时参数调用操作:

erl> module_interface:function(ObjRef, Timeout, ..Arguments..). erl> module_interface:function(ObjRef, [{timeout, Timeout}], ..Arguments..). erl> module_interface:function(ObjRef, ..Arguments..).

额外的超时参数将覆盖配置参数。iiop_timeout然而,它是不可能使用的。infinity若要重写超时参数,请执行以下操作。超时值选项对于驻留在同一Orber域中的对象也是有效的。

iiop_setup_connection_timeoutiiop_timeoutiiop_connection_timeoutiiop_in_connection_timeout应该使用的变量。指定的值是实现特定的,即,WAN或LAN,但他们应该从范围iiop_setup_connection_timeoutiiop_connection_timeout

要在配置文件中更改这些设置,-config必须将该标志添加到erl命令中。有关更多信息,请参阅参考手册config(4)。这些值也可以在启动时作为选项单独发送到Erlang节点,有关详细信息,请参阅参考手册erl(1)

Orber环境旗

Environment Flags允许用户激活调试设备或更改Orber的行为。后者可能会导致Orber不再符合OMG标准,当与不符合要求的ORB通信时,这可能是必需的。

Hexadecimal ValueOMG CompliantDescription
0001noExclude CodeSet Component
0002yesLocal Typechecking
0004yesUse Host Name in IOR
0008yesEnable NAT
0020yesLocal Interceptors
0080yesLight IFR
0100yesUse IPv6
0200yesEXIT Tolerance
0400yesEnable Incoming ACL
0800yesEnable Outgoing ACL
1000yesUse Current Interface in IOR

可以使用上述标志的任何组合,并将行为更改如下:

  • 排除代码集组件-指示Orber排除导出IOR:s中的CodeSet组件。激活时,客户端和服务器之间不会就字符和宽字符转换进行协商。如果IDL规范包含数据类型wchar和/或wstring,此标志很可能会导致问题。

  • 本地Typechecking - 如果激活,将检查参数,回复和引发的异常,以确保数据正确。如果发生错误,error_logger则用于生成报告。由于额外的开销,一个人可能不会使用此选项来交付系统。由于这个选项激活用于在目标节点上产生的所有对象类型检查,但也可以使用的选项{local_typecheck, boolean()},调用时oe_create/2oe_create_link/2corba:create/4corba:create_link/4,以覆盖配置参数。

  • 在IOR中使用主机名-通常Orber在输出ior:s中插入IP-号。在某些情况下,这将导致客户端打开两个连接而不是一个连接。

  • 启用NAT -如果此标志设置,就可以使用NAT(网络地址转换)配置参数(nat_iiop_portnat_iiop_ssl_portnat_ip_address)。

  • 本地拦截器-使用拦截器进行本地调用。

  • 轻型IFR-如果没有显式使用IFR,并且设置了此标志,Orber将使用最小的IFR来减少内存使用和安装时间。

  • 使用IPv 6-当激活此选项时,Orber将使用IPv6进行跨兽人通讯。

  • 出口公差-即使回叫模块导致退出,服务器也会存活下来。

  • 启用传入ACL-激活传入连接的访问控制。

  • 启用传出ACL-激活对传出连接的访问控制。

  • 在IOR中使用当前接口-设置后,Orber将将请求通过的接口添加到导出的本地IOR:s。

调用操作orber:info/1/2将以可读的方式显示当前设置的标志。

5.3防火墙配置

防火墙用于保护对象与其他网络或子网络中的客户端,但也限制内部对象可能连接到的主机(即inbound protectionoutbound protection)。防火墙可以根据以下条件限制访问:

  • 运输水平-根据TCP标头中的地址信息执行访问控制决策。

  • 应用水平-了解GIOP消息和支持的特定传输级ORB协议,例如IIOP。

本节描述如何配置Transport Level防火墙。它必须事先了解源到目标映射,并且在概念上有一个包含表单元组的配置表:{inhost:inport}, {outhost:outport})如果没有端口限制,那么配置防火墙是相当容易的。否则,我们必须考虑下列备选办法:

  • 传入请求-Orber只使用配置参数指定的端口号。iiop[医]iiop[医]SSL[医]其他ORB%27可能使用多个端口,但应该可以更改此行为。请参阅其他ORB文档。

  • 传出请求 - 包括Orber在内的绝大多数ORB,要求操作系统在连接到服务器端ORB时提供空闲的本地端口。使用Orber时可以改变这种行为(即设置配置参数iiop_out_ports)。

警告

使用该选项iiop_out_ports可能会导致Orber用完有效端口号。例如,其他应用程序可能会窃取某些端口,或者到其他ORB的并发传出连接数可能会高于预期。减少但不能消除你应该使用的风险iiop_connection_timeout

防火墙配置示例:

# "Plain" IIOP To: Orber-IPNo:(iiop_port) From: ORB-IPNo:X To: ORB-IPNo:Z From: Orber-IPNo:(iiop_out_ports | Any Port) # IIOP via SSL To: Orber-IPNo:(iiop_port) From: ORB-IPNo:X To: Orber-IPNo:(iiop_ssl_port) From: ORB-IPNo:Y To: ORB-IPNo:Z From: Orber-IPNo:(iiop_out_ports | Any Port)

如果通过TCP Firewall with NAT(网络地址转换)进行通信,我们必须激活此行为并定义外部地址和/或端口。

图5.1:带有NAT的tcp防火墙

使用NAT可以为不同的网络域使用不同的主机数据。这样我们就可以共享Internet协议地址资源或模糊资源。要启用此功能的Enable NAT标志必须设置和nat_iiop_portnat_iiop_ssl_portnat_ip_address配置,其映射到iiop_portiiop_ssl_portip_address分别。因此,必须将防火墙配置为正确地将外部转换为内部表示。如果这些NAT参数分配了单个端口号或IP地址,则只有在将IOR导出到另一个ORB时才会使用这些参数。何时ip_address设置为{multiple, [IPAddress]}nat_ip_address应该以相同的方式进行配置,以便防火墙可以将每个NAT IP地址转换为有效地址。如果对象应该可以通过不同的接口和端口访问,另请参阅Interface Configuration选项{local, DefaultNATIPAddress, [{IPAddress, NATIPAddress}]}和/或{local, DefaultNATPort, [{Port, NATPort}]}应用。默认的NAT IP地址和端口应由ip_address_local防火墙转换为值和默认监听端口。如果在列表中未找到IP地址和/或端口,则默认值将被插入到IOR中。防火墙必须能够正确翻译这些内容。

如果有必要限制对安全网络内的ORB的访问,但同一主机上运行的其他应用程序可能未被阻止,则可以使用应用程序级防火墙或Orber访问控制列表(ACL)。后者使得用户可以用Orber定义哪些主机可以作为服务器或客户端进行通信。这是通过定义配置参数来实现的iiop_acl。无类别域间路由(CIDR)Filter确定哪个对等接口和另一个ORB可能使用的端口。

FilterPeer Interface(s)Peer Port(s)
"10.1.1.1"10.1.1.1any
"10.1.1.1/8"10.0.0.0-10.255.255.255any
"10.1.1.1/8#4001"10.0.0.0-10.255.255.2554001
"10.1.1.1/8#4001/5001"10.0.0.0-10.255.255.2554001-5001

Orber ACL也允许用户定义可以使用哪个本地接口,但不会检测到spoofing。该操作orber_acl:match/2/3可以轻松验证访问是否被授予。例如,如果Orber将以ACL启动[{tcp_out, "10.1.1.1/8#4001/5001"}],那么其orber_acl:match/2行为如下:

erl> orber_acl:match{11,1,1,1}, tcp_out). false erl> orber_acl:match{10,1,1,1}, tcp_out). true erl> orber_acl:match{11,1,1,1}, tcp_out, true). {false,[],0} erl> orber_acl:match{10,1,1,1}, tcp_out, true). {true,[],{4001,5001}}

只有当返回的布尔值为真时,额外的返回值才会有所不同。在上面的示例中,{true,[],{4001,5001}}意思是"10.1.1.1"如果服务器端ORB在4001-5001范围内的端口上侦听传入连接请求,则Orber可以使用任何本地接口连接到。请注意,调用该orber_acl:match/2/3操作不会导致Orber发起连接尝试。原因是,这个函数可能用于活动节点以及测试环境。因此,如果本地接口当前不可用或通过给定主机/端口没有可用的服务器端ORB,Orber将不会检测到该接口。

5.4接口配置

在许多情况下,只要简单地配置底层操作系统,就可以为所有应用程序使用本地接口。但是,在某些情况下,由于防火墙配置等原因,需要为不同的应用程序使用不同的本地接口。有时,甚至有必要为单个CORBA对象使用特定的接口。本节描述了如何以不同的方式改变这种情况。

默认行为是Orber让OS配置决定将在IOR中添加哪个接口:s导出到另一个ORB,以及连接到另一个ORB时使用的本地接口(Orber充当客户端ORB)。后者可以通过设置配置参数iiop_ssl_ip_address_local和/或ip_address_local通过SSL和IIOP分别影响IIOP 来覆盖。这些参数可以通过使用Orber通用interface上下文或定义ACL(访问控制列表)来覆盖。如果包含本地接口(例如[{tcp_out, "10.0.0.0/8", ["10.0.0.1"]}]),后者总是优先。如果接口被排除(例如[{tcp_out, "10.0.0.0/8"}]),所选择的接口将,按照以下顺序,可以通过确定#'IOP_ServiceContext'{}ip_address_local/iiop_ssl_ip_address_local底层系统的配置或。

为生成的存根/骨架添加接口上下文的方法如下:

Ctx = #'IOP_ServiceContext'{context_id = ?ORBER_GENERIC_CTX_ID, context_data = {interface, "10.0.0.1"}}, 'CosNaming_NamingContext':resolve(NS, [{context, [Ctx]}], Name),

也可以将上下文添加到corba:string_to_object/2, corba:resolve_initial_references/2, corba:resolve_initial_references_remote/3, corba:list_initial_services_remote/2, corba_object:not_existent/2, corba_object:non_existent/2corba_object:is_a/3corba_object如果提供的IOR是外部的,则导出的操作会受到影响。corba:string_to_object/2如果传递一个corbaloc或一个corbaloc字符串(参见INS本章),该函数可能需要接口上下文,corba:resolve_initial_references_remote/3而且corba:list_initial_services_remote/2始终连接到另一个ORB,并且可能需要添加上下文。corba如果通过设置orbInitRef和/或orbDefaultInitRef配置参数重新调用呼叫,则其余操作将受到影响。有关更多信息,请参阅每个模块的参考手册。

配置将IOR导出到另一个ORB时应使用哪个接口由nat_ip_address设置标志16#1000ip_address顺序决定。Orber通过所有接口或由其定义的接口来监听传入连接ip_address。使用orber:add_listen_interface/2/3和可以添加和删除额外的监听接口orber:remove_listen_interface/1。在这种情况下,应设置16#1000标志,并在必要时设置配置参数{local, DefaultNATIPAddress, [{IPAddress, NATIPAddress}]}和/或{local, DefaultNATPort, [{Port, NATPort}]}