Введение Запуск сервера RabbitMQ при ближайшем рассмотрении выглядит весьма запутанным делом.
Почему это так и как все обстоит на самом деле, можно прочитать под катом.
- Версия RabbitMQ-Сервера - 2.1.0
- ОС: Федора
Короткий
Смотрим внимательно на PID процессов.Ниже приведено объяснение происходящего:
-bash-3.2# /etc/init.d/rabbitmq-server start
root 7732 3834 0 11:54 pts/0 00:00:00 /bin/sh /etc/init.d/rabbitmq-server start
root 7733 7732 0 11:54 pts/0 00:00:00 /bin/sh /usr/sbin/rabbitmq-multi start_all 1
root 7740 7733 0 11:54 pts/0 00:00:00 su rabbitmq -s /bin/sh -c /usr/lib/rabbitmq/bin/rabbitmq-multi "start_all" "1"
rabbitmq 7741 7740 7 11:54 ? 00:00:00 /usr/lib64/erlang/erts-5.7.5/bin/beam.smp -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa /usr/lib/rabbitmq/lib/rabbitmq_server- 2.1.0/sbin/.
/ebin -noshell -noinput -hidden -K true -sname rabbitmq_multi7741 -s rabbit_multi -extra start_all 1
rabbitmq 7767 7741 0 11:54 ? 00:00:00 inet_gethost 4
rabbitmq 7768 7767 0 11:54 ? 00:00:00 inet_gethost 4
rabbitmq 7769 7741 0 11:54 ? 00:00:00 /bin/sh /usr/lib/rabbitmq/bin/rabbitmq-server -noinput
rabbitmq 7794 7769 0 11:54 ? 00:00:00 /bin/sh /usr/lib/rabbitmq/bin/rabbitmq-server -noinput
rabbitmq 7795 7794 0 11:54 ? 00:00:00 ps -ef
rabbitmq 7796 7794 0 11:54 ? 00:00:00 grep rabbit
-bash-3.2# echo $$
3834
Подробнее
- Из оболочки (PID = 3834) /etc/init.d/rabbitmq-server start;
- В скрипте init.d (PID=7732) загружается конф (исходник).
файл /etc/sysconfig/rabbitmq;
- Из сценария init.d запускается сценарий оболочки su Rabbitmq -s /bin/sh -c /usr/lib/rabbitmq/bin/rabbitmq-multi «start_all» «1» (PID = 7740); Из него загружается (исходник) /usr/lib/rabbitmq/bin/rabbitmq-evn, в котором загружается /etc/rabbimq/rabbitmq.conf
- В /usr/lib/rabbitmq/bin/rabbitmq-multi запускается erlang (PID=7741) с определённым набором параметров.
Самый интересный из них — -s Rabbit_multi. Указание функции, которая будет вызываться вместо start (man erl);
- Из работающего erlang-приложения запускается шелл-скрипт /bin/sh /usr/lib/rabbitmq/bin/rabbitmq-server -noinput (PID=7769), в котором запускается сам Rabbitmq-сервер.
220 run_rabbitmq_server() ->
221 with_os([{unix, fun run_rabbitmq_server_unix/0},
222 {win32, fun run_rabbitmq_server_win32/0}]).
223
224 run_rabbitmq_server_unix() ->
225 CmdLine = getenv("RABBITMQ_SCRIPT_HOME") ++ "/rabbitmq-server -noinput",
226 erlang:open_port({spawn, CmdLine}, [nouse_stdio]).
227
228 run_rabbitmq_server_win32() ->
229 Cmd = filename:nativename(os:find_executable("cmd")),
230 CmdLine = "\"" ++ getenv("RABBITMQ_SCRIPT_HOME")
231 ++ "\\rabbitmq-server.bat\" -noinput",
232 erlang:open_port({spawn_executable, Cmd},
233 [{arg0, Cmd}, {args, ["/q", "/s", "/c", CmdLine]},
234 nouse_stdio, hide]).
Столь нетривиальный процесс запуска явно сделан из-за мультиплатформенности самого приложения.
Переменные среды
Теперь мы имеем понимание, как происходит процесс запуска RabbitMQ-сервера, но не понимаем, как на него повлиять.Давайте подробнее рассмотрим запуск самих erlang-приложений.
Запуск лаунчера (rabbit_multi)
exec erl \
-pa "${RABBITMQ_HOME}/ebin" \
-noinput \
-hidden \
${RABBITMQ_MULTI_ERL_ARGS} \
-sname rabbitmq_multi$$ \
-s rabbit_multi \
${RABBITMQ_MULTI_START_ARGS} \
-extra "$@"
Запуск сервера
exec erl
${RABBITMQ_EBIN_PATH}
${RABBITMQ_START_RABBIT}
-sname ${RABBITMQ_NODENAME}
-boot ${RABBITMQ_BOOT_FILE}
${RABBITMQ_CONFIG_ARG}
+W w \
${RABBITMQ_SERVER_ERL_ARGS} \
${RABBITMQ_LISTEN_ARG} \
-sasl errlog_type error \
-kernel error_logger '{file,"'${RABBITMQ_LOGS}'"}' \
-sasl sasl_error_logger '{file,"'${RABBITMQ_SASL_LOGS}'"}' \
-os_mon start_cpu_sup true \
-os_mon start_disksup false \
-os_mon start_memsup false \
-mnesia dir "\"${RABBITMQ_MNESIA_DIR}\"" \
${RABBITMQ_SERVER_START_ARGS} \
"$@"
Думаю, теперь вы можете увидеть, какие переменные среды влияют на каждый из процессов erlang. Рекомендуется изменить эти параметры в файле /etc/rabbitmq/rabbitmq.conf, который, как мы помним, загружается при запуске /usr/lib/rabbitmq/bin/rabbitmq-multi. Вот как выглядит работающая служба с параметрами по умолчанию:
exec erl -noinput -sname rabbit@hostname -boot /var/lib/rabbitmq/mnesia/rabbit@hostname/plugins-scratch/rabbit \
-config /etc/rabbitmq/rabbitmq +W w +K true +A30 +P 1048576 -kernel inet_default_listen_options [{nodelay,true}] \
-kernel inet_default_connect_options [{nodelay,true}] \
-sasl errlog_type error -kernel error_logger '{file,'/var/log/rabbitmq/[email protected]'}' \
-sasl sasl_error_logger '{file,'/var/log/rabbitmq/[email protected]'}' \
-os_mon start_cpu_sup true -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbit@hostname" -noinput
Краткое содержание конф.
файлы В итоге за работу RabbitMQ-сервера отвечают 3 конфа.
файл:
- /etc/sysconfig/rabbitmq; — В нем принято указывать какие-то низкоуровневые параметры (например, ulimit)
- /etc/rabbitmq/rabbitmq.conf; — Настройка переменных среды для запуска erlang
- /etc/rabbitmq/rabbitmq.config. — Сам Rabbitmq-сервер настроен
Какие значения задавать переменным, влияющим на работу сервера, это личное дело каждого.
Возможно, я напишу об этом чуть позже.
Теги: #linux #настройка Linux #rabbitmq
-
Использование Онлайн-Хранилища Данных
19 Oct, 24 -
Гренада
19 Oct, 24 -
Много Новых И Разных Андроидов От Htc...
19 Oct, 24 -
Готовы Ли Они Слушать? (Сет Годин)
19 Oct, 24