{"action":"created","comment":{"url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls/comments/31910287","id":31910287,"diff_hunk":"@@ -0,0 +1,671 @@\n+<?xml-stylesheet type=\"text/xml\" href=\"page.xsl\"?>\n+<!--\n+Copyright (C) 2007-2015 Pivotal Software, Inc.\n+\n+All rights reserved. This program and the accompanying materials\n+are made available under the terms of the under the Apache License,\n+Version 2.0 (the \"License”); you may not use this file except in compliance\n+with the License. You may obtain a copy of the License at\n+\n+http://www.apache.org/licenses/LICENSE-2.0\n+\n+Unless required by applicable law or agreed to in writing, software\n+distributed under the License is distributed on an \"AS IS\" BASIS,\n+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+See the License for the specific language governing permissions and\n+limitations under the License.\n+-->\n+<html xmlns=\"http://www.w3.org/1999/xhtml\"\n+      xmlns:doc=\"http://www.rabbitmq.com/namespaces/ad-hoc/doc\"\n+      xmlns:xi=\"http://www.w3.org/2003/XInclude\"\n+      xmlns:x=\"http://www.rabbitmq.com/2011/extensions\">\n+  <head>\n+    <title>Networking and RabbitMQ</title>\n+  </head>\n+  <body>\n+    <doc:section name=\"intro\">\n+      <doc:heading>Introduction</doc:heading>\n+\n+      <doc:subsection name=\"intro\">\n+        <p>\n+          Clients communicate with RabbitMQ over the network. All\n+          protocols supported by the broker are TCP-based. As such,\n+          both RabbitMQ and the operating system provide a wide range\n+          of knobs that can be tweaked. Some of them are directly\n+          related to TCP and IP operations, others have to do with\n+          application-level protocols such as TLS. This guide covers\n+          multiple topics related to networking in the context of\n+          RabbitMQ. This guide is not meant to be an extensive\n+          reference but rather an overview. Some tuneable parameters\n+          discussed are OS-specific. This guide focuses on Linux when\n+          covering OS-specific subjects, as it is the most common\n+          platform RabbitMQ is deployed on in production.\n+        </p>\n+        <p>\n+          There are several areas which can be configured or tuned:\n+\n+          <ul>\n+            <li>Interfaces and ports</li>\n+            <li>TLS</li>\n+            <li>TCP socket settings</li>\n+            <li>Kernel TCP settings</li>\n+            <li>(AMQP 0-9-1, STOMP) Heartbeats</li>\n+            <li>Hostnames and DNS</li>\n+          </ul>\n+\n+          Except for OS kernel parameters and DNS, all RabbitMQ settings\n+          are <a href=\"/configure.html\">configured the same way</a>.\n+        </p>\n+        <p>\n+          Networking is a broad topic. There are many configuration options\n+          that can have positive or negative effect on certain workloads.\n+          As such, this guide does not try to be a complete reference but rather\n+          offer an index of key tunable parameters and serve as a starting\n+          point.\n+        </p>\n+      </doc:subsection>\n+    </doc:section>\n+\n+    <doc:section name=\"interfaces\">\n+      <doc:heading>Network Interfaces</doc:heading>\n+\n+      <doc:subsection name=\"multiple-interfaces\">\n+        <p>\n+          For RabbitMQ to accept client connections, it needs to bind to one or more\n+          interfaces and listen on (protocol-specific) ports. The interfaces are\n+          configured using the <code>rabbit.tcp_listeners</code> config option.\n+          By default, RabbitMQ will listen on all available interfaces.\n+        </p>\n+\n+        <p>\n+          TCP listeners configure both interface and port. The following example\n+          demonstrates how to configure RabbitMQ on a specific IP and standard port:\n+\n+<pre class=\"code\">\n+[\n+  {rabbit, [\n+    {tcp_listeners, [{\"192.168.1.99\", 5672}]}\n+  ]}\n+].\n+</pre>\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"dual-stack\">\n+        <doc:heading>Listening on Dual Stack (Both IPv4 and IPv6) Interfaces</doc:heading>\n+        <p>\n+          The following example demonstrates how to configure RabbitMQ\n+          to listen on localhost only for both IPv4 and IPv6:\n+\n+<pre class=\"code\">\n+[\n+  {rabbit, [\n+    {tcp_listeners, [{\"127.0.0.1\", 5672},\n+                     {\"::1\",       5672}]}\n+  ]}\n+].\n+</pre>\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"single-stack-ipv4\">\n+        <doc:heading>Listening on IPv4 Interfaces Only</doc:heading>\n+        <p>\n+          In this example RabbitMQ will listen on an IPv4 interface only:\n+\n+<pre class=\"code\">\n+[\n+  {rabbit, [\n+    {tcp_listeners, [{\"192.168.1.99\", 5672}]}\n+  ]}\n+].\n+</pre>\n+        </p>\n+        <p>\n+          Alternatively, if a single stack setup is desired, the interface can be\n+          configured using the <code>RABBITMQ_NODE_IP</code> environment variable.\n+          See our <a href=\"/configure.html\">Configuration guide</a> for detalis.\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"single-stack-ipv6\">\n+        <doc:heading>Listening on IPv6 Interfaces Only</doc:heading>\n+        <p>\n+          In this example RabbitMQ will listen on an IPv6 interface only:\n+\n+<pre class=\"code\">\n+[\n+  {rabbit, [\n+    {tcp_listeners, [{\"fe80::2acf:e9ff:fe17:f97b\", 5672}]}\n+  ]}\n+].\n+</pre>\n+        </p>\n+        <p>\n+          Alternatively, if a single stack setup is desired, the interface can be\n+          configured using the <code>RABBITMQ_NODE_IP</code> environment variable.\n+          See our <a href=\"/configure.html\">Configuration guide</a> for detalis.\n+        </p>\n+      </doc:subsection>\n+    </doc:section>\n+\n+    <xi:include href=\"install-selinux-ports.xml.inc\" />\n+\n+    <doc:section name=\"tls\">\n+      <p>\n+        It is possible to encrypt connections using TLS with RabbitMQ. Authentication\n+        using peer certificates is also possible. Please refer to the <a href=\"/ssl.html\">TLS/SSL guide</a>\n+        for more information.\n+      </p>\n+    </doc:section>\n+\n+    <doc:section name=\"tuning-for-throughput\">\n+      <doc:heading>Tuning for Throughput</doc:heading>\n+\n+      <doc:subsection name=\"tuning-for-throughput-intro\">\n+        <p>\n+          Tuning for throughput is a common goal. Improvements can be achieved by\n+\n+          <ul>\n+            <li>Increasing TCP buffer sizes</li>\n+            <li>Ensuring Nagle's algorithm is disabled</li>\n+            <li>Enabling optional TCP features and extensions</li>\n+          </ul>\n+\n+          For the latter two, see the OS-level tuning section below.\n+\n+          Note that tuning for throughput will involve trade-offs. For example, increasing TCP buffer\n+          sizes will increase the amount of RAM used by every connection, which can be a significant\n+          total server RAM use increase.\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"tuning-for-throughput-tcp-buffers\">\n+        <doc:heading>TCP Buffer Size</doc:heading>\n+        <p>\n+          This is one of the key tunable parameters. Every TCP connection has buffers\n+          allocated for it. Generally speaking, the larger these buffers are, the more RAM\n+          is used per connection and better the throughput. On Linux, the OS will automatically\n+          tune TCP buffer size by default, typically settling on a value between 80 and 120 KB.\n+          For maximum throughput, it is possible to increase buffer size using the <code>rabbit.tcp_listen_options</code>.\n+        </p>\n+        <p>\n+          The following example sets TCP buffers to 192K:\n+\n+<pre class=\"code\">\n+[\n+  {rabbit, [\n+    {tcp_listen_options, [\n+                          {sndbuf, 196608},\n+                          {recbuf, 196608}\n+                          ]}\n+  ]}\n+].\n+</pre>\n+\n+         Note that setting send and receive buffer sizes to different values is dangerous\n+         and is not recommended.\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"tuning-for-throughput-async-thread-pool\">\n+        <doc:heading>Erlang VM I/O Thread Pool</doc:heading>\n+\n+        <p>\n+          Erlang runtime uses a pool of threads for performing I/O\n+          operations asynchronously. The size of the pool is <a href=\"/configure.html\">configured</a> via\n+          the <code>+A</code> VM command line flag, e.g. <code>+A 128</code>. We highly recommend\n+          overriding the flag using the `RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS` environment\n+          variable:\n+\n+<pre class=\"code\">\n+RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=\"+A 128\"\n+</pre>\n+\n+          Default value is 30. Nodes that have 8 or more cores available are recommended\n+          to use values higher than 96, that is, 12 or more I/O threads for every core available.\n+          Note that higher values do not necessarily mean better throughput or lower CPU\n+          burn due to waiting on I/O.\n+        </p>\n+      </doc:subsection>\n+    </doc:section>\n+\n+    <doc:section name=\"tuning-for-large-number-of-connections\">\n+      <doc:heading>Tuning for a Large Number of Connections</doc:heading>\n+\n+      <doc:subsection name=\"tuning-for-large-number-of-connections-intro\">\n+        <p>\n+          Some workloads, often referred to as \"the Internet of\n+          Things\", assume a large number of client connections per\n+          node, and a relatively low volume of traffic from each node.\n+          One such workload is sensor networks: there can be hundreds\n+          of thousands or millions of sensors deployed, each emitting\n+          data every several minutes. Optimising for the maximum\n+          number of concurrent clients ca be more important than for\n+          total throughput.\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"tuning-for-large-number-of-connections-limitations\">\n+        <p>\n+          Several factors can limit how many concurrent connections a single node can support:\n+\n+          <ul>\n+            <li>Number of open file handles (including sockets)</li>\n+            <li>Amount of RAM used by each connection</li>\n+            <li>Amout of CPU resources used by each connection</li>\n+          </ul>\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"tuning-for-large-number-of-connections-open-file-handles-limit\">\n+        <doc:heading>Open File Handles Limit</doc:heading>\n+        <p>\n+          Most operating systems limit the number of file handles that\n+          can be opened at the same time. <a href=\"http://docs.basho.com/riak/latest/ops/tuning/linux/\">How\n+          the limit is configured</a> varies from OS to OS.\n+\n+          When optimising for the number of concurrent connections,\n+          making sure your system has enough file descriptors to\n+          support not only client connections but also files the node\n+          may use. To calculate a ball park limit, multiply the number\n+          of connections per node by 1.5. For example, to support 100,000\n+          connections, set the limit to 150,000.\n+\n+          Increasing the limit slightly increases the amount of\n+          RAM idle machine uses but this is a reasonable trade-off.\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"tuning-for-large-number-of-connections-tcp-buffer-size\">\n+        <doc:heading>TCP Buffer Size</doc:heading>\n+        <p>\n+          See the section above for an overview.\n+          it is possible to decrease buffer size using the <code>rabbit.tcp_listen_options</code> to reduce\n+          the amount of RAM by the server used per connection. This is typically necessary\n+        </p>\n+        <p>\n+          The following example sets TCP buffers to 32K:\n+\n+<pre class=\"code\">\n+[\n+  {rabbit, [\n+    {tcp_listen_options, [\n+                          {sndbuf, 32768},\n+                          {recbuf, 32768}\n+                          ]}\n+  ]}\n+].\n+</pre>\n+\n+         Note that lower TCP buffer sizes will result in a significant throughput drop,\n+         so an optional value between throughput and per-connection RAM use needs to be\n+         found for every workload.\n+\n+         Setting send and receive buffer sizes to different values is dangerous\n+         and is not recommended. Values lower than 8K are not recommended.\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"tuning-for-large-number-of-connections-nodelay\">\n+        <doc:heading>Nagle's Algorithm (\"nodelay\")</doc:heading>\n+        <p>\n+          Disabling <a\n+          href=\"http://en.wikipedia.org/wiki/Nagle's_algorithm\">Nagle's\n+          algorithm</a> is primarily useful for reducing latency but\n+          can also improve\n+          throughput. <code>kernel.inet_default_connect_options</code>\n+          and <code>kernel.inet_default_listen_options</code> must\n+          include <code>{nodelay, true}</code> to disable Nagle's\n+          algorithm for inter-node connections.  When configuring\n+          sockets that serve client connections,\n+          <code>rabbit.tcp_listen_options</code> must include the same\n+          option. This is the default.\n+\n+          The following example demonstrates that:\n+\n+<pre class=\"code\">\n+[\n+  {kernel, [\n+    {inet_default_connect_options, [{nodelay, true}]},\n+    {inet_default_listen_options,  [{nodelay, true}]}\n+  ]},\n+  {rabbit, [\n+    {tcp_listen_options, [\n+                          {nodelay, true}\n+                          ]}\n+  ]}\n+].\n+</pre>\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"tuning-for-large-number-of-connections-async-thread-pool\">\n+        <doc:heading>Erlang VM I/O Thread Pool Tuning</doc:heading>\n+        <p>\n+          Adequate Erlang VM I/O thread pool size is also important when tuning for a large number of\n+          concurrent connections. See the section above.\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"tuning-for-large-number-of-connections-connection-backlog\">\n+        <doc:heading>Connection Backlog</doc:heading>\n+        <p>\n+          With a low number of clients, new connection rate is very unevenly distributed\n+          but is also small enough to not make much difference. When the number reaches tens of thousands\n+          or more, it is important to make sure that the server can accept inbound connections.\n+          Unaccepted TCP connections are put into a queue with bounded length. This length has to be\n+          sufficient to account for peak load hours and possible spikes (e. g. mass client\n+          disconnects due to a network interruption). This is configured using the <code>rabbit.tcp_listen_options.backlog</code>\n+          option:\n+\n+<pre class=\"code\">\n+[\n+  {rabbit, [\n+    {tcp_listen_options, [{backlog, 4096}]}\n+  ]}\n+].\n+</pre>\n+\n+           Default value is 128. When pending connection queue length grows beyond this value,\n+           connections will be rejected by the operating system. See also <code>net.core.somaxconn</code>\n+           in the kernel tuning section.\n+        </p>\n+      </doc:subsection>\n+    </doc:section>\n+\n+    <doc:section name=\"os-tuning\">\n+      <doc:heading>OS Level Tuning</doc:heading>\n+\n+      <doc:subsection name=\"os-tuning-intro\">\n+        <p>\n+          Operating system settings can affect operation of RabbitMQ.\n+          Some are directly related to networking (e.g. TCP settings), others\n+          affect TCP sockets as well as other things (e.g. open file handles limit).\n+\n+          Understanding these limits is important, as they may changing depending on\n+          the workload.\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"os-tuning-important-options\">\n+        <p>\n+          A few important configurable kernel options include (for IPv4):\n+\n+          <dl>\n+            <dt><code>fs.file-max</code></dt>\n+            <dd>\n+              Max number of files the kernel will allocate. Limits and current value\n+              can be inspected using <code>/proc/sys/fs/file-nr</code>.\n+            </dd>\n+\n+            <dt><code>net.ipv4.ip_local_port_range</code></dt>\n+            <dd>\n+              Local IP port range, define as a pair of values. The range must .\n+            </dd>\n+\n+            <dt><code>net.ipv4.tcp_tw_reuse</code></dt>\n+            <dd>\n+              When enabled, allows the kernel to reuse sockets in <code>TIME_WAIT</code>\n+              state when it's safe to do so. See <a href=\"http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html\">Coping with the TCP TIME_WAIT connections on busy servers</a> for details.\n+              This option is dangerous when used behind NAT.\n+            </dd>\n+\n+            <dt><code>net.ipv4.tcp_fin_timeout</code></dt>\n+            <dd>\n+              Lowering this value to 5-10 reduces the amount of time closed connections\n+              will stay in the TIME_WAIT state. Recommended for cases when a large\n+              number of concurrent connections is expected.\n+            </dd>\n+\n+            <dt><code>net.core.somaxconn</code></dt>\n+            <dd>\n+              Size of the listen queue (how many connections are in\n+              the process of being established at the same time).\n+              Default is 128. Increase to 4096 or higher to support\n+              inbound connection bursts, e.g. when clients re-connect\n+              en masse.\n+            </dd>\n+\n+            <dt><code>net.ipv4.tcp_max_syn_backlog</code></dt>\n+            <dd>\n+              Maximum number of remembered connection requests, which\n+              are still did not receive an acknowledgment from\n+              connecting client. Default is 128, max value is 65535. 4096 and 8192 are\n+              recommended starting values when optimising for throughput.\n+            </dd>\n+\n+            <dt><code>net.ipv4.tcp_keepalive_*</code></dt>\n+            <dd>\n+              <code>net.ipv4.tcp_keepalive_time</code>, <code>net.ipv4.tcp_keepalive_intvl</code>,\n+              and <code>net.ipv4.tcp_keepalive_probes</code> configure TCP keepalive.\n+\n+              AMQP 0-9-1 and STOMP have <a href=\"/heartbeats.html\">Heartbeats</a> which partially\n+              undo its effect, namely that it can take minutes to detect a unresponsive peer,\n+              e.g. in case of a hardware or power failure.\n+\n+              When enabling TCP keepalive, we recommend setting heartbeat timeout to 8-20 seconds.\n+            </dd>\n+\n+            <dt><code>net.ipv4.conf.default.rp_filter</code></dt>\n+            <dd>\n+              Enabled reverse path filtering. If <a href=\"http://en.wikipedia.org/wiki/IP_address_spoofing\">IP address spoofing</a>\n+              is not a concern for your system, disable it.\n+            </dd>\n+          </dl>\n+\n+\n+          Note that default values for these vary between Linux kernel releases.\n+          Using a recent kernel (3.9 or later) is recommended.\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"os-tuning-important-how-to-configure\">\n+        <p>\n+          Kernel parameter tuning differs from OS to OS. This guide focuses on Linux.\n+          To configure a kernel parameter interactively, use <code>sysctl -w</code> (requires superuser\n+          privileges), for example:\n+\n+<pre class=\"code\">\n+sysctl -w fs.file-max 200000\n+</pre>\n+\n+          To make the changes permanent (stick between reboots), they need to be added to\n+          <code>/etc/sysctl.conf</code>. See <a href=\"http://man7.org/linux/man-pages/man8/sysctl.8.html\">sysctl(8)</a>\n+          and <a href=\"http://man7.org/linux/man-pages/man5/sysctl.conf.5.html\">sysctl.conf(5)</a>\n+          for more details.\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"os-tuning-outro\">\n+        <p>\n+          TCP stack tuning is a broad topic that is covered in much detail elsewhere:\n+\n+          <ul>\n+            <li><a href=\"http://www.psc.edu/index.php/networking/641-tcp-tune\">Enabling High Performance Data Transfers</a></li>\n+            <li><a href=\"https://fasterdata.es.net/network-tuning/\">Network Tuning Guide</a></li>\n+          </ul>\n+        </p>\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"os-tuning-max-open-file-handles\">\n+      </doc:subsection>\n+    </doc:section>\n+\n+    <doc:section name=\"socket-gen-tcp-options\">\n+      <doc:heading>TCP Socket Options</doc:heading>\n+\n+      <doc:subsection name=\"socket-gen-tcp-options-common\">\n+        <doc:heading>Common Options</doc:heading>\n+        <dl>\n+          <dt><code>rabbit.tcp_listen_options.nodelay</code></dt>\n+          <dd>\n+            When enabled, disables\n+            <a href=\"http://en.wikipedia.org/wiki/Nagle's_algorithm\">Nagle's algorithm</a>.\n+            Default is true. Highly recommended for most users.\n+          </dd>\n+          <dt><code>rabbit.tcp_listen_options.sndbuf</code></dt>\n+          <dd>\n+            See TCP buffers discussion earlier in this guide. Default value is\n+            automatically tuned by the OS, typically in the 88K to 128K range on\n+            modern Linux versions. Increasing buffer size improves consumer throughput\n+            and RAM use for every connection. Decreasing has the opposite effect.\n+          </dd>\n+          <dt><code>rabbit.tcp_listen_options.recbuf</code></dt>\n+          <dd>\n+            See TCP buffers discussion earlier in this guide. Default value effect\n+            are similar to that of <code>rabbit.tcp_listen_options.sndbuf</code> but\n+            for publishers and protocol operations in general.\n+          </dd>\n+          <dt><code>rabbit.tcp_listen_options.backlog</code></dt>\n+          <dd>\n+            Maximum size of the unaccepted TCP connections queue. When this size\n+            is reached, new connections will be rejected. Set to 4096 or higher for\n+            environments with thousands of concurrent connections and possible bulk client\n+            re-connections.\n+          </dd>\n+          <dt><code>rabbit.tcp_listen_options.linger</code></dt>\n+          <dd>\n+            When set to <code>{true, N}</code>, sets\n+            the timeout in seconds for flushing unsent data when the (server) socket is\n+            closed.\n+          </dd>\n+          <dt><code>rabbit.tcp_listen_options.keepalive</code></dt>\n+          <dd>\n+            When set to <code>true</code>, enables TCP keepalives (see above).\n+            Default is <code>false</code>. Makes sense for environments where\n+            connections can go idle for a long time (at least 10 minutes),\n+            although <a href=\"/heartbeats.html\">heartbeats</a> is still recommended over\n+            this option.\n+          </dd>\n+          <dt><code>rabbit.tcp_listen_options.reuseaddr</code></dt>\n+          <dd>\n+            Sets <code>SO_REUSEADDR</code> on the sockets, which allows a port belonging\n+            to a connection in the <code>TIME_WAIT</code> state to be reused for other\n+            connections. Enabled by default, highly recommended for environments with\n+            large numbers of concurrent connections and/or connection churn (short-lived\n+            clients).\n+          </dd>\n+        </dl>\n+\n+      </doc:subsection>\n+\n+      <doc:subsection name=\"socket-gen-tcp-options-defaults\">\n+        <doc:heading>Defaults</doc:heading>\n+\n+        <p>\n+          Below is the default TCP socket option configuration used by RabbitMQ:\n+<pre class=\"code\">\n+[\n+  {rabbit, [\n+    {tcp_listen_options, [{reuseaddr,     true},\n+                          {backlog,       128},\n+                          {nodelay,       true},\n+                          {linger,        {true, 0}}]}\n+  ]}\n+].\n+</pre>\n+        </p>\n+      </doc:subsection>\n+    </doc:section>\n+\n+    <doc:section name=\"heartbeats\">\n+      <doc:heading>Heartbeats</doc:heading>\n+\n+      <p>\n+        Some protocols supported by RabbitMQ, including AMQP 0-9-1, support <em>heartbeats</em>, a way to detect dead\n+        TCP peers quicker. Please refer to the <a href=\"/heartbeats.html\">Heartbeats guide</a>\n+        for more information.\n+      </p>\n+    </doc:section>\n+\n+    <doc:section name=\"nettick\">\n+      <doc:heading>Net Tick Time</doc:heading>\n+\n+      <p>\n+        <a href=\"/heartbeats.html\">Heartbeats</a> are used to detect peer or connection failure\n+        between clients and RabbitMQ nodes. <a href=\"/net_ticktime.html\">net_ticktime</a> serves\n+        the same purpose but for cluster node communication. Values lower than 5 (seconds) are","path":"site/networking.xml","position":589,"original_position":588,"commit_id":"dd02c3a378fd481874c6b9d46568d52d8fcec481","original_commit_id":"6ba21143c79e96ede50d3428241fc4b8e187ee3f","user":{"login":"videlalvaro","id":30834,"avatar_url":"https://avatars.githubusercontent.com/u/30834?v=3","gravatar_id":"","url":"https://api.github.com/users/videlalvaro","html_url":"https://github.com/videlalvaro","followers_url":"https://api.github.com/users/videlalvaro/followers","following_url":"https://api.github.com/users/videlalvaro/following{/other_user}","gists_url":"https://api.github.com/users/videlalvaro/gists{/gist_id}","starred_url":"https://api.github.com/users/videlalvaro/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/videlalvaro/subscriptions","organizations_url":"https://api.github.com/users/videlalvaro/orgs","repos_url":"https://api.github.com/users/videlalvaro/repos","events_url":"https://api.github.com/users/videlalvaro/events{/privacy}","received_events_url":"https://api.github.com/users/videlalvaro/received_events","type":"User","site_admin":false},"body":"I think \"are\" is not needed here","created_at":"2015-06-08T12:50:52Z","updated_at":"2015-06-08T12:50:52Z","html_url":"https://github.com/rabbitmq/rabbitmq-website/pull/28#discussion_r31910287","pull_request_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls/28","_links":{"self":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls/comments/31910287"},"html":{"href":"https://github.com/rabbitmq/rabbitmq-website/pull/28#discussion_r31910287"},"pull_request":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls/28"}}},"pull_request":{"url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls/28","id":36741186,"html_url":"https://github.com/rabbitmq/rabbitmq-website/pull/28","diff_url":"https://github.com/rabbitmq/rabbitmq-website/pull/28.diff","patch_url":"https://github.com/rabbitmq/rabbitmq-website/pull/28.patch","issue_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/issues/28","number":28,"state":"open","locked":false,"title":"Networking and Production Checklist guides","user":{"login":"michaelklishin","id":1090,"avatar_url":"https://avatars.githubusercontent.com/u/1090?v=3","gravatar_id":"","url":"https://api.github.com/users/michaelklishin","html_url":"https://github.com/michaelklishin","followers_url":"https://api.github.com/users/michaelklishin/followers","following_url":"https://api.github.com/users/michaelklishin/following{/other_user}","gists_url":"https://api.github.com/users/michaelklishin/gists{/gist_id}","starred_url":"https://api.github.com/users/michaelklishin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaelklishin/subscriptions","organizations_url":"https://api.github.com/users/michaelklishin/orgs","repos_url":"https://api.github.com/users/michaelklishin/repos","events_url":"https://api.github.com/users/michaelklishin/events{/privacy}","received_events_url":"https://api.github.com/users/michaelklishin/received_events","type":"User","site_admin":false},"body":"This introduces two new documentation guides:\r\n\r\n * Everything related to networking\r\n * Production check list\r\n\r\nThe goal is not to make the guides as extensive as possible but to offer a starting point. We will expand both guides over time based on user feedback and what support questions we get most often.","created_at":"2015-06-02T15:26:56Z","updated_at":"2015-06-08T12:50:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"af05a6b769f01bf74fe159c7e4bdc9d309f35f5f","assignee":{"login":"dumbbell","id":159804,"avatar_url":"https://avatars.githubusercontent.com/u/159804?v=3","gravatar_id":"","url":"https://api.github.com/users/dumbbell","html_url":"https://github.com/dumbbell","followers_url":"https://api.github.com/users/dumbbell/followers","following_url":"https://api.github.com/users/dumbbell/following{/other_user}","gists_url":"https://api.github.com/users/dumbbell/gists{/gist_id}","starred_url":"https://api.github.com/users/dumbbell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dumbbell/subscriptions","organizations_url":"https://api.github.com/users/dumbbell/orgs","repos_url":"https://api.github.com/users/dumbbell/repos","events_url":"https://api.github.com/users/dumbbell/events{/privacy}","received_events_url":"https://api.github.com/users/dumbbell/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/milestones/4","html_url":"https://github.com/rabbitmq/rabbitmq-website/milestones/n/a","labels_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/milestones/4/labels","id":1034804,"number":4,"title":"n/a","description":"Not applicable to a specific release","creator":{"login":"dumbbell","id":159804,"avatar_url":"https://avatars.githubusercontent.com/u/159804?v=3","gravatar_id":"","url":"https://api.github.com/users/dumbbell","html_url":"https://github.com/dumbbell","followers_url":"https://api.github.com/users/dumbbell/followers","following_url":"https://api.github.com/users/dumbbell/following{/other_user}","gists_url":"https://api.github.com/users/dumbbell/gists{/gist_id}","starred_url":"https://api.github.com/users/dumbbell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dumbbell/subscriptions","organizations_url":"https://api.github.com/users/dumbbell/orgs","repos_url":"https://api.github.com/users/dumbbell/repos","events_url":"https://api.github.com/users/dumbbell/events{/privacy}","received_events_url":"https://api.github.com/users/dumbbell/received_events","type":"User","site_admin":false},"open_issues":4,"closed_issues":17,"state":"closed","created_at":"2015-03-23T17:45:26Z","updated_at":"2015-06-02T15:26:56Z","due_on":null,"closed_at":"2015-03-24T10:01:04Z"},"commits_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls/28/commits","review_comments_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls/28/comments","review_comment_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/issues/28/comments","statuses_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/statuses/dd02c3a378fd481874c6b9d46568d52d8fcec481","head":{"label":"rabbitmq:network-configuration-guide","ref":"network-configuration-guide","sha":"dd02c3a378fd481874c6b9d46568d52d8fcec481","user":{"login":"rabbitmq","id":96669,"avatar_url":"https://avatars.githubusercontent.com/u/96669?v=3","gravatar_id":"","url":"https://api.github.com/users/rabbitmq","html_url":"https://github.com/rabbitmq","followers_url":"https://api.github.com/users/rabbitmq/followers","following_url":"https://api.github.com/users/rabbitmq/following{/other_user}","gists_url":"https://api.github.com/users/rabbitmq/gists{/gist_id}","starred_url":"https://api.github.com/users/rabbitmq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rabbitmq/subscriptions","organizations_url":"https://api.github.com/users/rabbitmq/orgs","repos_url":"https://api.github.com/users/rabbitmq/repos","events_url":"https://api.github.com/users/rabbitmq/events{/privacy}","received_events_url":"https://api.github.com/users/rabbitmq/received_events","type":"Organization","site_admin":false},"repo":{"id":32091173,"name":"rabbitmq-website","full_name":"rabbitmq/rabbitmq-website","owner":{"login":"rabbitmq","id":96669,"avatar_url":"https://avatars.githubusercontent.com/u/96669?v=3","gravatar_id":"","url":"https://api.github.com/users/rabbitmq","html_url":"https://github.com/rabbitmq","followers_url":"https://api.github.com/users/rabbitmq/followers","following_url":"https://api.github.com/users/rabbitmq/following{/other_user}","gists_url":"https://api.github.com/users/rabbitmq/gists{/gist_id}","starred_url":"https://api.github.com/users/rabbitmq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rabbitmq/subscriptions","organizations_url":"https://api.github.com/users/rabbitmq/orgs","repos_url":"https://api.github.com/users/rabbitmq/repos","events_url":"https://api.github.com/users/rabbitmq/events{/privacy}","received_events_url":"https://api.github.com/users/rabbitmq/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rabbitmq/rabbitmq-website","description":"Source files for www.rabbitmq.com","fork":false,"url":"https://api.github.com/repos/rabbitmq/rabbitmq-website","forks_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/forks","keys_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/teams","hooks_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/hooks","issue_events_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/issues/events{/number}","events_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/events","assignees_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/assignees{/user}","branches_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/branches{/branch}","tags_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/tags","blobs_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/git/refs{/sha}","trees_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/statuses/{sha}","languages_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/languages","stargazers_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/stargazers","contributors_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/contributors","subscribers_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/subscribers","subscription_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/subscription","commits_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/commits{/sha}","git_commits_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/git/commits{/sha}","comments_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/comments{/number}","issue_comment_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/issues/comments{/number}","contents_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/contents/{+path}","compare_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/merges","archive_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/downloads","issues_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/issues{/number}","pulls_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls{/number}","milestones_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/milestones{/number}","notifications_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/labels{/name}","releases_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/releases{/id}","created_at":"2015-03-12T17:29:11Z","updated_at":"2015-05-23T10:38:45Z","pushed_at":"2015-06-08T12:50:23Z","git_url":"git://github.com/rabbitmq/rabbitmq-website.git","ssh_url":"git@github.com:rabbitmq/rabbitmq-website.git","clone_url":"https://github.com/rabbitmq/rabbitmq-website.git","svn_url":"https://github.com/rabbitmq/rabbitmq-website","homepage":null,"size":97213,"stargazers_count":3,"watchers_count":3,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":9,"forks":0,"open_issues":9,"watchers":3,"default_branch":"master"}},"base":{"label":"rabbitmq:live","ref":"live","sha":"7c60ca9f6c271fc491fa03edf2bb2e5075695b28","user":{"login":"rabbitmq","id":96669,"avatar_url":"https://avatars.githubusercontent.com/u/96669?v=3","gravatar_id":"","url":"https://api.github.com/users/rabbitmq","html_url":"https://github.com/rabbitmq","followers_url":"https://api.github.com/users/rabbitmq/followers","following_url":"https://api.github.com/users/rabbitmq/following{/other_user}","gists_url":"https://api.github.com/users/rabbitmq/gists{/gist_id}","starred_url":"https://api.github.com/users/rabbitmq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rabbitmq/subscriptions","organizations_url":"https://api.github.com/users/rabbitmq/orgs","repos_url":"https://api.github.com/users/rabbitmq/repos","events_url":"https://api.github.com/users/rabbitmq/events{/privacy}","received_events_url":"https://api.github.com/users/rabbitmq/received_events","type":"Organization","site_admin":false},"repo":{"id":32091173,"name":"rabbitmq-website","full_name":"rabbitmq/rabbitmq-website","owner":{"login":"rabbitmq","id":96669,"avatar_url":"https://avatars.githubusercontent.com/u/96669?v=3","gravatar_id":"","url":"https://api.github.com/users/rabbitmq","html_url":"https://github.com/rabbitmq","followers_url":"https://api.github.com/users/rabbitmq/followers","following_url":"https://api.github.com/users/rabbitmq/following{/other_user}","gists_url":"https://api.github.com/users/rabbitmq/gists{/gist_id}","starred_url":"https://api.github.com/users/rabbitmq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rabbitmq/subscriptions","organizations_url":"https://api.github.com/users/rabbitmq/orgs","repos_url":"https://api.github.com/users/rabbitmq/repos","events_url":"https://api.github.com/users/rabbitmq/events{/privacy}","received_events_url":"https://api.github.com/users/rabbitmq/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rabbitmq/rabbitmq-website","description":"Source files for www.rabbitmq.com","fork":false,"url":"https://api.github.com/repos/rabbitmq/rabbitmq-website","forks_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/forks","keys_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/teams","hooks_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/hooks","issue_events_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/issues/events{/number}","events_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/events","assignees_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/assignees{/user}","branches_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/branches{/branch}","tags_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/tags","blobs_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/git/refs{/sha}","trees_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/statuses/{sha}","languages_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/languages","stargazers_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/stargazers","contributors_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/contributors","subscribers_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/subscribers","subscription_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/subscription","commits_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/commits{/sha}","git_commits_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/git/commits{/sha}","comments_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/comments{/number}","issue_comment_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/issues/comments{/number}","contents_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/contents/{+path}","compare_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/merges","archive_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/downloads","issues_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/issues{/number}","pulls_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls{/number}","milestones_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/milestones{/number}","notifications_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/labels{/name}","releases_url":"https://api.github.com/repos/rabbitmq/rabbitmq-website/releases{/id}","created_at":"2015-03-12T17:29:11Z","updated_at":"2015-05-23T10:38:45Z","pushed_at":"2015-06-08T12:50:23Z","git_url":"git://github.com/rabbitmq/rabbitmq-website.git","ssh_url":"git@github.com:rabbitmq/rabbitmq-website.git","clone_url":"https://github.com/rabbitmq/rabbitmq-website.git","svn_url":"https://github.com/rabbitmq/rabbitmq-website","homepage":null,"size":97213,"stargazers_count":3,"watchers_count":3,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":9,"forks":0,"open_issues":9,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls/28"},"html":{"href":"https://github.com/rabbitmq/rabbitmq-website/pull/28"},"issue":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-website/issues/28"},"comments":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-website/issues/28/comments"},"review_comments":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls/28/comments"},"review_comment":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-website/pulls/28/commits"},"statuses":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-website/statuses/dd02c3a378fd481874c6b9d46568d52d8fcec481"}}}}