在这里该命令会提示关于目录的警告信息,不用理会。直接运行下列命令:
编辑GitLab的配置程序:
然后用新用户登录,点击GitLab中My profile>Keys>Add new按钮,将生成的SSH公钥贴到弹出对话框的Key中,Title可随便填,我一般是使用用户_机器名这种格式,然后点击Save按钮。
在保存用户公钥之后,就可测试是否可以通过公钥来访问服务器上的git用户,执行git命令:
这样,shell环境中的变量定义比rabbitmq-env.conf中的相同变量定义有更高的优先级, 而RabbitMQ中的系统默认值具有最低优先级.
最小化的样例配置文件如下:
这些文件的位置分布特定的. 默认情况下,这些文件是没有创建的,但每个平台上期望的位置如下:
Windows 服务用户在删除配置文件后,需要重新安装服务.
RabbitMQ server 源码仓库包含 名为rabbitmq.config.example.这个示例文件中包含了你想要设置的大多数配置项(有一些省略)与其说明. 示例中的所有配置项都注释了的,如果你有需要,你可以取消注解. 注意,示例文件仅仅只是示例,不应该将其视为通用的推荐.
大部分的RabbitMQ用户都会不会修改这些值,有些是相当模糊的.然而,为了完整性,他们都在这里列出。
接受TCP侦听器连接的Erlang进程数。 |
如上所述,用于SSL连接。 |
接受SSL侦听器连接的Erlang进程数。 |
流程控制触发的内存阀值.相看 文档. |
高水位限制的分数,当达到阀值时,队列中消息消息会转移到磁盘上以释放内存. 参考 文档. |
RabbitMQ存储数据分区的可用磁盘空间限制.当可用空间值低于阀值时,流程控制将被触发. 此值可根据RAM的总大小来相对设置 (如.{mem_relative, 1.0}). 此值也可以设为整数(单位为bytes)或者使用数字单位(如."50MB"). 默认情况下,可用磁盘空间必须超过50MB. 参考 文档. |
控制日志的粒度.其值是日志事件类别(category)和日志级别(level)成对的列表.
目前定义了4种日志类别. 它们是: |
与客户端协商的允许最大frame大小. 设置为0表示无限制,但在某些QPid客户端会引发bug. 设置较大的值可以提高吞吐量;设置一个较小的值可能会提高延迟. |
与客户端协商的允许最大chanel大小. 设置为0表示无限制.该数值越大,则broker使用的内存就越高. |
Channel 操作超时时间(毫秒为单位) (内部使用,因为消息协议的区别和限制,不暴露给客户端). |
表示心跳延迟(单位为秒) ,服务器将在connection.tune frame中发送.如果设置为 0, 心跳将被禁用. 客户端可以不用遵循服务器的建议, 查看 来了解详情. 禁用心跳可以在有大量连接的场景中提高性能,但可能会造成关闭了非活动连接的网络设备上的连接落下. |
RabbitMQ从头开始创建数据库时,创建的用户名. |
创建用户时分配给它的默认 . |
如果你希望默认的guest用户能远程连接,你必须将其修改为[]. |
当节点第一次启动的时候,设置此选项会导致集群动作自动发生. 元组的第一个元素是其它节点想与其建立集群的节点. 第二个元素是节点的类型,要么是disc,要么是ram |
连接时向客户端声明的键值对列表 |
统计收集模式。主要与管理插件相关。选项:
你自已可不用修改此选项. |
统计收集时间间隔(毫秒为单位). 主要针对于 . |
此列表可包含模块的名称(在模块相同的情况下,将同时用于认证来授权)或像{ModN, ModZ}这样的元组,在这里ModN将用于认证,ModZ将用于授权. 在2元组的情况中, ModZ可由列表代替,列表中的所有元素必须通过每个授权的确认,如{ModN, [ModZ1, ModZ2]}. 这就允许授权插件进行组合提供额外的安全约束. |
内部集群通信中,委派进程的数目. 在一个有非常多核的机器(集群的一部分)上,你可以增加此值. |
内部使用. 你不应该修改. |
默认socket选项. 你可能不想修改这个选项. |
这可以增加服务器吞吐量,但会增加服务器的启动时间. 你可以看到花费几分钟延迟启动的成本,就可以带来20-50% 更好性能.这些数字与高度依赖于工作负载和硬件. |
如何处理网络分区.可用模式有:
参考 来了解更多信息 |
节点向其它节点发送存活消息和频率(毫秒). 注意,这与 是不同的; 丢失存活消息不会引起节点掉线 |
消息大小在此之下的会直接内嵌在队列索引中. 在修改此值时,建议你先阅读 文档. |
队列索引的实现模块. 在修改此值时,建议你先阅读 文档. |
队列内容的实现模块. 你可能不想修改此值. |
在集群中等待使用Mnesia表可用的超时时间。 |
查看 来了解更多信息. |
此外,许多插件也可以在配置文件中配置, 其名称是rabbitmq_plugin的形式. 我们的维护的插件被记录在以下位置:
你可以设置下面的环境变量来指定相关文件的位置,但大部分人都不必这样做:
包含RabbitMQ 服务器Mnesia数据库文件子目录的基本目录,除非明确设置了RABBITMQ_MNESIA_DIR目录,否则每个节点都应该配置一个. (除了Mnesia文件,这个位置还包含消息存储和索引文件以及模式和集群的细节.) |
RabbitMQ节点Mnesia数据库文件安放的目录. (除了Mnesia文件,这个位置还包含消息存储和索引文件以及模式和集群的细节.) |
用于在启动服务器时扩展启用插件的工作目录。 |
此文件记录了显式启用的插件。 |
此文件中包含了rabbitmqctl所等待进程ID的信息. |
RabbitMQ持久层的目的是为了得到好的结果,在大多数情况下没有配置。然而,一些配置有时是有用的。此页解释了如何配置它。在采取任何行动之前,你都应该阅读这一切。
首先,先讲一下背景: 持久化和短暂消息都可以写入磁盘.持久化消息一旦到达队列,就会写入磁盘,而短暂消息只在内存压力较大被赶出内存时才会写入磁盘.持久化消息在内存紧张释放内存时,依然也会存在内存中. 持久层指的是存储这两种类型消息到磁盘的机制.
在本页中,我们说的队列是指无镜像队列或master队列或slave队列. 队列镜像会发生以上的持久化.
持久层有两个组件: 队列索引和消息存储.队列索引负责维护消息在队列的位置,以及是否被投递,是否应答的信息. 因此,每个队列都有一个队列索引。
消息存储是消息的key-value存储, 由服务器中的所有队列共享.消息(消息体, 消息属性或消息头)可直接存储于队列索引,也可以写到消息存储中.在技术上有两个消息存储(一个暂时的和一个持久的消息),但他们通常一起被被认为是“消息存储”。
在内存压力下,持久层试图尽可能多地写入磁盘,并尽可能的从内存中删除。然而有一些事情必须留在内存中:
将消息写入队列索引有优点也有缺点.
如果一个消息通过一个交换路由到多个队列,则消息将需要写入多个队列索引。如果这样的消息被写入消息存储区,则只有一个副本需要被写入。
将小消息存储在队列索引中目的是优化,所有其它消息将会写入消息存储.这可以配置项queue_index_embed_msgs_below来配置.默认情况下,序列后大小小于4096字节 (包括属性和头)会存储在队列索引中.
当从磁盘中读取消息时,每个队列索引至少需要在内存中保留一个段文件(segment file). 段文件中包含了16,384个消息. 因此要谨慎如果增加queue_index_embed_msgs_below;小的增加会导致大量的内存使用。
持久化有可能表现不佳,因为持久化受限于文件句柄的数目或与它工作的异步线程.在这两种情况下,当您有大量需要同时访问磁盘的队列时,会发生这样的情况。.
RabbitMQ 服务器通常受限于它能打开的文件句柄数量(在Unix上,无论如何). 每个运行的网络连接都需要一个文件句柄, 其余的可用于队列使用。如果磁盘访问队列比考虑到网络连接后文件句柄更多,那么磁盘访问队列将与文件句柄一起共享; 每个都会在它返回交给另一个队列之前,都会使用文件句柄一段时间.
当有太多磁盘访问队列时,这可以防止服务器崩溃,但代价是昂贵的. 管理插件可以显示集群中每个节点的统计I/O统计信息,如读,写,查找的速率.同时它也会显示重新开始(reopens)的速率- 文件句柄通过这种方式来回收利用. 一个有太少文件句柄繁忙的服务器每秒可能会做几百次reopens - 在这种情况下,如果增加文件句柄,就有可能提高性能.
Erlang 虚拟机创建异步线程池来处理长时间运行的文件I/O操作. 这些线程池是所有队列所共享的.每个活跃的文件I/O操作都会使用一个异步线程. 太少的异步线程可以因此伤害性能。
注意,异步线程的情况并不完全类似与文件句柄的情况. 如果一个队列按顺序来执行一定数量的I/O操作,假设它持有一个文件句柄来所理所有操作,其性能是最好的,否则,我们会占用CPU来做更多的刷新,查找 操作. 然而,队列不能从持有一个异步线程执行一系列的操作中获益(事实上也做不到).
因此理论上应该要有足够的文件句柄来处理所有队列上的I/O流操作, 并且要有足够的线程来处理并发的 (simultaneous )的I/O操作.
由异步线程缺乏造成的性能问题,不是太明显. (一般情况下都不太可能,可首先检查其它地方!) .
太少异步线程的典型症状是,当服务器忙于持久化时,在很短的时间内,每秒 I/O操作的数目将会下降到0(管理插件可报告) ,报告的每个 I/O操作的时间将会增加.
Erlang虚拟主机的异步线程数目可通过+A 参数进行配置,有描述, 通常情况下,也可以通过环境变量RABBITMQ_SERVER_ERL_ARGS来配置. 默认值是 +A 30. 在修改之前,多进行几次尝试总是好主意.
网络是Clients与RabbitMQ通信的媒介.broker支持的所有协议都是基于TCP的. RabbitMQ 和操作系统都提供了许多可调整的旋钮.其中,有些是直接与TCP和IP操作相关的,其它则是与应用程序级协议如TLS相关的. 本指南涵盖了RabbitMQ中与网络相关的多个主题. 本指南并不是一广泛的指南,而只是一个概述. 某些调整参数是与特定操作系统相关的.当有与特定操作系统相关的主题时, 本指南只关注Linux,因为它是部署RabbitMQ的最常见平台.
有几个可以配置或调整的区域:
网络是一个广泛的话题。有许多配置选项,可以对某些工作负载产生积极或消极的影响。因此,本指南不尝试是一个完整的参考,而是提供一个关键的可调参数的索引,并作为一个起点。
RabbitMQ用于接受客户端连接,它需要绑定一个或多个网络接口,并监听特定的端口. 网络接口使用rabbit.tcp_listeners选项来配置.默认情况下,RabbitMQ会在所有可用网络接口上监听5672端口.
TCP listeners 可配置网络接口和端口. 下面的示例演示了如何在一个特定网络接口和端口上进行监听:
下面的例子演示了如何在IPv4 and IPv6上进行监听:
现代Linux kernels 以及Vista后的Windows版本,当在所有IPv6地址上配置端口时,IPv4是没有明确禁用的,IPv4地址依然可用,因此
SELinux 以及相似的机制可能会阻止RabbitMQ绑定到某个端口. 当这样的情况发生时,RabbitMQ启动会失败.必须保证可打开下面的端口:
也可以通过配置 来使用不同的端口.
优化吞吐量是一个共同的目录. 可通过下面的来实现
确保Nagle的算法失效
启用可选TCP功能和扩展
对于后两个,可看下面的操作系统级别调整部分。请注意,调整吞吐量将涉及权衡问题。例如,增加TCP缓冲区的大小会增加每一个连接的内存使用数量,从而使得总服务器内存增大。
这是关键的调整参数. 每个TCP连接都分配了缓冲区. 一般来说,缓冲区用得越大,每个连接上RAM就用得越多,就有更好的吞吐率.在Linux,操作系统默认会自动调整TCP缓冲区的大小,通常会设置为80到120 KB之间.要获取最大吞吐量,可使用rabbit.tcp_listen_options来加大配置.
下面的例子将TCP缓冲区设置为192 KiB:
注意,将发发送缓冲区和接收缓冲区设置不同的值是很危险的,且是不推荐的.
默认值为30. 8个或8个以上的节点建议使用高于96的值,即: 每核上可以运行12或12以上的I/O线程. 注意:值越高不意味着有更好的吞吐量或由于等待的I / O 而造成较低的处理器烧伤.
有多个因素可以限制单个节点上支持的并发连接数:
大部分操作系统都限制了同一时间可以打开的文件句柄数目. 每个操作系统上都不同.
当在优化并发连接数的时候,须确保你的系统有足够的文件描述符来支持你的client和节点的使用.
要粗略地计算限制,可以用每个节点上连接的数目乘以1.5. 例如,要支持100,000个连接,需要设置限制文件描述符为150,000.稍为增加限制可增加闲置机器内存的使用量,但这是一个合理的权衡。
见上文的部分概述. 可使用rabbit.tcp_listen_options选项来减小缓冲区大小,这样就可以减小每个连接上使用的RAM使用量. 在每个节点上的并发量比吞吐量重要的环境中,这通常是必须的.
下面的例子将TCP缓冲区设置为32 KiB:
注意,越小的TCP缓冲区会导致明显的吞吐量下降, 所以最优的值可在吞吐量和每连接使用的RAM值中找到 ,即在它们之间作一个权衡.将发送缓冲区和接收缓冲区的值设为不同,这是非常危险的且是不推荐的.低于8 KiB的值是不推荐的.
当优化大量并发连接数时,恰当的Erlang虚拟机I/O线程池大小也很重要。见上面的部分。
当只有较少数量的客户端时,新连接的分布是非常不均匀的,但因为足够小,所以没有太大的差异. 当数量达到数万或更多时,重要的是要确保服务器可以接受入站连接.未接受的TCP连接会放在带有限制长度的队列中. 此长度必须能应对负载较小和较高时的情况,例如,当许多客户端因为网络中断或重连时,必须能应对.
默认值是128. 当挂起的连接队列长度超出此值时,连接将被操作系统拒绝。也可参见优化内核部分的net.core.somaxconn。
操作系统设置可影响RabbitMQ的操作.有些是直接与网络相关的(如. TCP设置),其它影响是TCP sockets以及其它东西(如打开文件句柄的限制).理解这些限制是很重要的,因为随着工作量不同而改变.
几个重要的可配置内核选项包括 (针对IPv4):
本地IP端口范围,定义为一对值。该范围必须为并发连接的峰值数提供足够的条目。
尚未收到连接客户端确认的连接请求的最大数量。默认为128,最大值为65535。优化吞吐量时,4096和8192是推荐的起始值。
请注意,这些默认值在不同的内核版本和发行版之间是不同的。使用最近的内核(3.9或更新)。
内核参数调整在不同操作系统之间是不同的.这篇指南针对的是Linux. 配置内核参数交互,使用sysctl -w (需要超级权限),例如:
用于探测客户端与RabbitMQ之间的对等端或连接故障 . 也有同样的目的,但它针对的是集群节点通信. 低于5(秒)的值可能会导致负面影响,不建议使用。
RabbitMQ有连接握手超时时间,默认为10秒钟. 当客户端在严重受限的环境中运行时,可能需要增加超时时间。这可以通过rabbit.handshake_timeout(毫秒)来完成:
应该指出的是,这只在客户端和网络有严格约束的情况下使用。握手超时在其他情况下也会出现问题。
在许多情况下,RabbitMQ依靠Erlang运行时节点间通信(包括工具rabbitmqctl,RabbitMQ插件等)。当客户端进行连接RabbitMQ节点时,客户端包会执行主机名解析。本节简要介绍了与此相关的最常见问题。
如果client library配置成用主机名进行连接,它会执行主机名解析.依赖于 DNS 和本地解析器(类似于/etc/hosts)配置,这可能会花点时间.错误配置可能会导致解析超时,如,当试图通过DNS解析本地主机名如my-dev-machine. 其结果是,客户端连接会花很长的时候(几十秒到几分钟).
RabbitMQ 依赖于Erlang运行时来进行节点间通信. Erlang节点包括主机名,要么是短的 (rmq1) 要么是全限定的(rmq1.dev.megacorp.local). 混合使用简短的和全限定的节点名称,是运行时不允许的 .集群中的每个节点必须能够解析其它节点的主机名, 简短的和全限定的. 默认情况下,RabbitMQ 会使用简短主机名.
跃然RabbitMQ大部分配置都生活在, 有些东西却不能在配置文件中配置:
如果他们需要在一个集群中的所有节点是相同的
如果他们有可能在运行时改变
参数特殊的使用情况是策略( policies),它用于为成组的队列和交换器,以及插件(如Federation 和 Shovel)指定可选参数.
参数可以被设置,清除,和列举:
由于参数值是一个JSON文档, 当在使用rabbitmqctl命令行创建时,你通常需要引用它. 在Unix上,很容易使用单引号来引用整个文档,在其中可以使用双引号.在Windows上,你必须转义所有双引号.基于此理由,我们为Unix和Windows分别给出了例子.
RabbitMQ使用数据库中的参数来定义虚拟主机,交换器,队列,绑定,用户和权限. 参数是通过管理插件的导出功能以及对象定义中导出的.
策略会自动匹配交换器和队列,并帮助确定他们的行为. 每个交换器和队列至少有一个策略匹配,并且每个策略都会在交换器或队列上映射一系列的key-value对.
策略的行为有点像exchange.declare和queue.declare的参数, 除了它们会自动应用(不需要客户端程序的干预),并且它们可在任何时候进行修改.请注意,策略控制的功能集合与参数控制的功能集合是不同的.
策略会在每次交换器或队列创建的时候进行匹配,而不仅仅是在创建策略时。
"pattern" 参数是一个用来匹配交换器或队列名称的正则表达式.
当有多个策略匹配交换器或队列时,则会应用优先级最高的策略.
在某些情况下,我们想要在资源上应用多个策略.例如,我们想让一个队列能同时联合和镜像. 任何时候,在资源上最多只能应用一个策略,但我们可在那个策略中应用多个定义.
联合(federation)策略定义需要指定一个upstream 集合,因此在我们的定义中,我们需要federation-upstream-set 键.另一方面,要镜像队列,我们需要在策略中定义ha-mode键.由于策略定义只是一个JSON对象,在同一个策略中我们可以定义这两个键.
本人项目配置文件如下:(配置文件中一定不能含有中文,不然重启 apache 会失败!)