管理 RabbitMQ 服務器的幾種方式

jopen 11年前發布 | 44K 次閱讀 RabbitMQ ActiveMQ 消息系統

1.通過 rabbitmqctl 腳本</strong></span>

rabbitmqctl 是 shell 腳本,其通過 exec 調用了 erl 程序。會間接調用到如下兩個 shell 腳本:

  • rabbitmq-env
  • rabbitmq-defaults
  • </ul> 在使用該腳本時允許用戶定制的環境變量為:

    • RABBITMQ_NODENAME          默認值 ${NODENAME}
    • RABBITMQ_CTL_ERL_ARGS       默認值 ${CTL_ERL_ARGS}
    • </ul> 下面分別看下這幾個腳本都干了哪些事情。
      rabbitmqctl</strong>】</span>

      [root@Betty chapter-9]# vi /usr/sbin/rabbitmqctl

      !/bin/sh

      The contents of this file are subject to the Mozilla Public License

      Version 1.1 (the "License"); you may not use this file except in

      compliance with the License. You may obtain a copy of the License

      at http://www.mozilla.org/MPL/

      #

      Software distributed under the License is distributed on an "AS IS"

      basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See

      the License for the specific language governing rights and

      limitations under the License.

      #

      The Original Code is RabbitMQ.

      #

      The Initial Developer of the Original Code is VMware, Inc.

      Copyright (c) 2007-2013 VMware, Inc. All rights reserved.

      #

      Get default settings with user overrides for (RABBITMQ_)<var_name>

      Non-empty defaults should be set in rabbitmq-env

      . dirname $0/rabbitmq-env # $0 為 /usr/sbin/rabbitmqctl 所以 dirname $0/rabbitmq-env

                                  # 為 /usr/sbin/rabbitmq-env
                                  # 這里是初始化了一些默認的環境變量值(詳見下面)
      
      

      --- Set environment vars RABBITMQ_<var_name> to defaults if not set

      若未手動設置 $RABBITMQ_NODENAME 則設置其為默認值 ${NODENAME}

      [ "x" = "x$RABBITMQ_NODENAME" ] && RABBITMQ_NODENAME=${NODENAME}

      若未手動設置 $RABBITMQ_CTL_ERL_ARGS 則設置其值為默認值 ${CTL_ERL_ARGS}

      [ "x" = "x$RABBITMQ_CTL_ERL_ARGS" ] && RABBITMQ_CTL_ERL_ARGS=${CTL_ERL_ARGS}

      --- End of overridden <var_name> variables

      exec ${ERL_DIR}erl \ -pa "${RABBITMQ_HOME}/ebin" \ -noinput \ -hidden \ ${RABBITMQ_CTL_ERL_ARGS} \ -sname rabbitmqctl$$ \ # $$ 為當前進程的 pid -boot "${CLEAN_BOOT_FILE}" \ -s rabbit_control_main \ -nodename $RABBITMQ_NODENAME \ -extra "$@"</pre>rabbitmq-env</strong>】</span>

      [root@Betty ~]# vi /usr/sbin/rabbitmq-env

      !/bin/sh

      The contents of this file are subject to the Mozilla Public License

      Version 1.1 (the "License"); you may not use this file except in

      compliance with the License. You may obtain a copy of the License

      at http://www.mozilla.org/MPL/

      #

      Software distributed under the License is distributed on an "AS IS"

      basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See

      the License for the specific language governing rights and

      limitations under the License.

      #

      The Original Code is RabbitMQ.

      #

      The Initial Developer of the Original Code is VMware, Inc.

      Copyright (c) 2007-2013 VMware, Inc. All rights reserved.

      #

      Determine where this script is really located (if this script is

      invoked from another script, this is the location of the caller)

      SCRIPT_PATH="$0" # $0 的值應該為 /usr/sbin/rabbitmq-env while [ -h "$SCRIPT_PATH" ] ; do # -h 用于判定是否為符號鏈接

      # readlink -f 獲取符號鏈接 rabbitmq-env 所對應的完整路徑 /usr/lib/rabbitmq/sbin/rabbitmq-env
      FULL_PATH=`readlink -f $SCRIPT_PATH 2>/dev/null`
      if [ "$?" != "0" ]; then   # 判定上一步執行結果是否為成功
      # 直接執行 readlink 將獲取符號鏈接 rabbitmq-env 所對應的相對路徑 ../lib/rabbitmq/sbin/rabbitmq-env
        REL_PATH=`readlink $SCRIPT_PATH`
        # expr STRING : REGEXP 判定 $REL_PATH 是不是以 '/' 開頭
        if expr "$REL_PATH" : '/.*' > /dev/null; then
          SCRIPT_PATH="$REL_PATH"   # 以 '/' 開頭
        else
          SCRIPT_PATH="`dirname "$SCRIPT_PATH"`/$REL_PATH"
        fi
      else
        SCRIPT_PATH=$FULL_PATH
      fi
      

      done

      SCRIPT_DIR=dirname $SCRIPT_PATH # 得到 SCRIPT_DIR = /usr/lib/rabbitmq/sbin RABBITMQ_HOME="${SCRIPT_DIR}/.." # 得到 RABBITMQ_HOME = /usr/lib/rabbitmq/ [ "x" = "x$HOSTNAME" ] && HOSTNAME=env hostname # 得到 HOSTNAME = Betty NODENAME=rabbit@${HOSTNAME%%.} # 得到 NODENAME = rabbit@Betty 其中 ${HOSTNAME%%.} 的含義是

                                       # 以 '.' 為分隔位置,從后開始作最長匹配的刪除
                                       # 如果是一個 '%' 則為最短匹配
      
      

      Set defaults

      . ${SCRIPT_DIR}/rabbitmq-defaults # 初始化默認環境變量(詳見下面)

      Common defaults

      SERVER_ERL_ARGS="+K true +A30 +P 1048576 \ -kernel inet_default_connect_options [{nodelay,true}]" # 默認的通用配置選項

      warn about old rabbitmq.conf file, if no new one

      if [ -f /etc/rabbitmq/rabbitmq.conf ] && \ [ ! -f ${CONF_ENV_FILE} ] ; then echo -n "WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- " # echo -n 不輸出換行符 echo "location has moved to ${CONF_ENV_FILE}" fi

      Get configuration variables from the configure environment file

      [ -f ${CONF_ENV_FILE} ] && . ${CONF_ENV_FILE} # 如果存在 ${CONF_ENV_FILE} 文件則執行該 環境配置 文件</pre> rabbitmq-defaults

      [root@Betty ~]# vi /usr/sbin/rabbitmq-defaults

      !/bin/sh

      The contents of this file are subject to the Mozilla Public License

      Version 1.1 (the "License"); you may not use this file except in

      compliance with the License. You may obtain a copy of the License

      at http://www.mozilla.org/MPL/

      #

      Software distributed under the License is distributed on an "AS IS"

      basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See

      the License for the specific language governing rights and

      limitations under the License.

      #

      The Original Code is RabbitMQ.

      #

      The Initial Developer of the Original Code is VMware, Inc.

      Copyright (c) 2012-2013 VMware, Inc. All rights reserved.

      #

      next line potentially updated in package install steps

      SYS_PREFIX=

      next line will be updated when generating a standalone release

      ERL_DIR=

      CLEAN_BOOT_FILE=start_clean SASL_BOOT_FILE=start_sasl

      Set default values

      CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq # 配置文件路徑 LOG_BASE=${SYS_PREFIX}/var/log/rabbitmq # 日志文件路徑 MNESIA_BASE=${SYS_PREFIX}/var/lib/rabbitmq/mnesia # 數據庫路徑 ENABLED_PLUGINS_FILE=${SYS_PREFIX}/etc/rabbitmq/enabled_plugins # 記錄已使能插件的文件

      PLUGINS_DIR="${RABBITMQ_HOME}/plugins" # 插件所在路徑

      CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf # 環境配置文件</pre>
      2. 通過 RabbitMQ Management plugin</strong></span>
      首先想到的問題是:為什么有了 rabbitmqctl 還要 RabbitMQ Management plugin ?

      • 原因一,若想通過 rabbitmqctl 來對 rabbitmq server 進行操作,要求必須要有 Erlang 運行環境、必須要能夠訪問到啟動 rabbitmq server 時使用的 erlang cookie 文件。
      • 原因二,一旦滿足了上述條件,那么該訪問者將擁有對當前 rabbitmq server 為所欲為的能力,非常危險。
      • 原因三,不是所有人都喜歡敲、以及會敲 CLI 命令。
      • 原因四,難于與其他編程語言或工具進行集成。
      • </ul> RabbitMQ Management plugin 提供了如下幾種入口:

        • Web interface    --  通過鼠標點擊就可以查看各種信息
        • REST interface   --   通過 HTTP URI 實現對各種功能的訪問
        • CLI interface      --   通過 rabbitmqadmin 腳本訪問 (Python2.x)
        • </ul> 與《Rabbitmq in Action》中的說明進行對照:

          • Management: Web UI
          • Management: HTTP API
          • Management: Command Line Tool 
          • </ul> 其中,

            • WEB UI 提供了在 rabbitmq server 上的可視化操作;
            • REST API 提供了一種與其他語言和工具集成的方式。返回的結構均以 JSON 格式提供,故需要支持 JSON 解析;需要支持 HTTP basic authentication ;需要手動構造完整的 HTTP request 。支持對返回結果的排序、顯示過濾,以及獲取歷史數據。(參考 http://youripaddir:15672/api/)
            • CLI interface 優于 REST-based API 的地方是不需要構建 request 中的全部內容,提供了優雅的格式化的輸出。rabbitmqadmin 已經實現了對 REST API 的封裝,提供了更加簡潔的調用接口,能夠對 rabbitmq server 進行管理和監控。
            • </ul>       官網原文如下介紹該工具:rabbitmqadmin 提供了 Web UI 上所具有的全部功能,且更易于在腳本中使用。rabbitmqadmin 是一個特化的 HTTP 客戶端,但如果你打算在自己的應用程序中調用 rabbitmqadmin ,那么還是建議你采用直接訪問 HTTP API 的方式 </span> 另外, rabb</span> itmqadmin 一般會在增加可執行權限后放到 /usr/local/bin 中。

              來自:http://my.oschina.net/moooofly/blog/170965

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!