デプロイメントFAQ
EMQXのデプロイに推奨されるオペレーティングシステムは何ですか?
EMQXはさまざまなオペレーティングシステムおよびハードウェアプラットフォームでの動作をサポートしています。エンタープライズレベルの安定性と信頼性を考慮すると、一般的にはCentOS、Ubuntu、DebianなどのLinuxディストリビューションでのデプロイを推奨しています。
EMQXの推奨デプロイメントプランは何ですか?
EMQXはクラスター構成でのデプロイを推奨しており、クラスターのフロントエンドにロードバランサー(Nginx、HAProxyなど)を配置して、各ノードへの接続を均等に分散させる構成が推奨されます。
通信のセキュリティ要件が高いユーザーには、クライアント側でTLS接続を有効にし、ロードバランサー側でTLS終端を行うことを推奨します。つまり、クライアントとロードバランサー間はTLS暗号化通信を使用し、ロードバランサーとEMQXノード間はTCP通信を使用します。
EMQXノードはポートをパブリックネットワークに公開しないため、全体のセキュリティは低下しませんが、TLSのオフロードによりEMQXのリソース消費を効果的に節約できます。
デバイス数やメッセージスループットが少ない場合でもクラスターをデプロイする必要がありますか?
デバイス数が少なくメッセージスループットが低い場合でも、本番環境ではクラスター構成のデプロイが有効です。
クラスターはシステムの可用性を向上させ、単一障害点の発生を減らします。ノードがダウンしても、クラスター内の他の正常なノードがサービスを継続して提供できるため、業務への影響を防げます。
EMQXが起動しない場合のトラブルシューティング方法は?
EMQXが起動しない場合は、ログディレクトリ内のemqx.log.Nまたはerlang.log.Nを確認して詳細なエラー情報を取得してください。
または、emqx consoleコマンドでコンソールからEMQXを起動すると、エラーログが直接コンソールに出力されます。ログ内容に基づいて本ページの対応策を確認するか、GitHubに投稿してサポートを受けてください。
ログに「logger: command not found」と表示されEMQXが起動しない場合の対処法は?
以下の依存関係をインストールしてください。
CentOS/Redhat
$ yum install rsyslogUbuntu/Debian
$ apt-get install bsdutilsログに「...{on_load_function_failed,crypto}...」と表示されEMQXが起動しない場合の対処法は?
セキュリティ強化のため、EMQXはバージョン4.3以降でopenssl-1.1を使用しています。これにより、一部の古いLinuxディストリビューションで問題が発生する場合があります。
EMQXバージョン4.3.10未満およびEMQX Enterpriseバージョンe4.3.5未満では、以下のようなエラーメッセージが表示されることがあります。
{application_start_failure,kernel,{{shutdown,{failed_to_start_child,kernel_safe_sup,{on_load_function_failed,crypto}}}, ..}それ以降のバージョンでは、以下のようなエラーメッセージが表示される場合があります。
FATAL: Unable to start Erlang.
Please make sure openssl-1.1.1 (libcrypto) and libncurses are installed.これは、EMQXが依存するErlang/OTPの"crypto"アプリケーションが、必要なopensslの動的ライブラリ(.soファイル)を見つけられず起動に失敗していることを示しています。対処方法は以下の通りです。
重要なお知らせ
以下の解決策はあくまで例示です。
記載されているソースバージョンは現時点の知見に基づいて選定していますが、古くなっている可能性や脆弱性が存在する場合があります。
最新のセキュリティアップデートを適用するためには、OSのパッケージマネージャーからlibcryptoを直接インストールすることを推奨します。
ログに「libatomic.so.1: cannot open shared object file: No such file or directory」と表示されEMQXが起動しない場合の対処法は?
このエラーはシステムに依存関係のlibatomicが不足しているため発生します。以下のコマンドでlibatomicをインストールしてください。
# Rocky Linux, CentOSなど
yum install -y libatomic
# Debian, Ubuntuなど
apt install -y libatomicRPMやDEBパッケージを手動でインストールする場合、以下のような依存関係エラーが出ることがあります。
$ rpm -ivh emqx-5.7.0-el8-amd64.rpm
error: Failed dependencies:
libatomic is needed by emqx-5.7.0-el8-amd64.rpmこの場合も、まずlibatomicを手動でインストールしてください。
なお、最も推奨されるインストール方法はパッケージマネージャー(yum、aptなど)を使用することで、必要な依存関係が自動的にインストールされます。
:::
::::
DockerでEMQXを起動した際に「Permission denied」とログに表示され起動に失敗する場合の対処法
EMQXのデータを永続化するためにディレクトリをマウントして起動する場合:
sudo docker run -d --name emqx -p 18083:18083 -p 1883:1883 -v /emqx/data:/opt/emqx/data -v /emqx/log:/opt/emqx/log emqx:latest以下のエラーでコンテナ起動に失敗することがあります。
mkdir: cannot create directory '/opt/emqx/data/configs': Permission deniedこれはコンテナ内のEMQXがLinuxユーザーemqxとして動作しているのに対し、ホスト側のディレクトリがrootユーザーで作成されているため、EMQXがディレクトリやファイルを作成できないことが原因です。
解決策としては、ホスト側にemqxユーザーを作成し、そのユーザーでマウント対象のディレクトリを作成するか、作成済みのデータ・ログディレクトリのパーミッションを777に変更してください。
ただし、最も推奨されるデータ永続化方法は名前付きボリュームを使用することで、パーミッション問題を気にせずに済みます。
sudo docker volume create --name emqx-data
sudo docker volume create --name emqx-log
sudo docker run -d --name emqx -p 18083:18083 -p 1883:1883 -v emqx-data:/opt/emqx/data -v emqx-log:/opt/emqx/log emqx:latestEMQX起動時に「ポートが使用中(eaddrinuse)」と表示された場合の対処法は?
EMQXは起動時にデフォルトで7つのポートを使用します。これらは以下の通りです。
- ポート1883:TCPによるMQTTリスナー。設定で変更可能。
- ポート8883:SSL/TLSによるMQTTリスナー。設定で変更可能。
- ポート8083:WebSocketによるMQTTリスナー。設定で変更可能。
- ポート8084:WSS(SSL対応WebSocket)によるMQTTリスナー。設定で変更可能。
- ポート18083:HTTP APIサービスのデフォルトリスニングポート。ダッシュボードもこのポートを使用。設定で変更可能。
- ポート4370:EMQX分散クラスターのリモート関数呼び出しおよびMnesiaデータ同期用ポート。クラスター未形成時も占有。リスニングポートは
BasePort (4370) + Offsetで決定。4370は固定で変更不可。Offsetはノード名の数値サフィックスで決定。サフィックスなしは0。例:emqx@127.0.0.1のOffsetは0、emqx1@127.0.0.1のOffsetは1。 - ポート5370:ノード間のMQTTメッセージ転送に使われるクラスターRPCポート。ポート4370と同様にクラスター未形成時も占有。リスニングポートは
BasePort (5370) + Offsetで決定。5370は固定で変更不可。Offsetはノード名のName部分の数値サフィックスで決定。サフィックスなしは0。
ポート競合が起きた場合は、これらのポートの使用状況を確認し、必要に応じて設定を変更してください。
EMQX起動時に「WARNING: Default (insecure) Erlang cookie is in use.」とログに表示される理由は?
警告ログ全文は以下の通りです。
WARNING: Default (insecure) Erlang cookie is in use.
WARNING: Configure node.cookie in /usr/lib/emqx/etc/emqx.conf or override from environment variable EMQX_NODE__COOKIE
WARNING: NOTE: Use the same cookie for all nodes in the cluster.同じcookieを使用するEMQXノードのみがクラスターを形成できます。cookieはクラスター通信を暗号化しませんが、意図しないノードの接続を防止します。デフォルトではEMQXノードはemqxsecretcookieをcookie値として使用していますが、クラスター構築時にはセキュリティ向上のためcookie値の変更を推奨します。
2つ目の警告はcookieの設定方法を示しており、emqx.confのnode.cookie設定か、環境変数EMQX_NODE__COOKIEで設定可能です。EMQX 6.3.0以降は両方ともfile://を使ったファイルからの読み込みに対応しており、cookie値を設定ファイルや環境変数に直接記述する必要はありません。詳細はLoad the Node Cookie from a Fileを参照してください。
EMQX Dockerコンテナを再起動すると、設定したルールやリソースなどのデータが消失する理由は?
EMQXのランタイムデータは/opt/emqx/dataディレクトリに保存されており、設定ルール、リソース、保持メッセージなどが含まれます。コンテナ再起動時にデータを永続化するには、/opt/emqx/dataディレクトリをホストのローカルディレクトリやデータボリュームにマウントする必要があります。
しかし、正しくマウントしていても再起動後にデータが消失する場合があります。これはEMQXのランタイムデータが/opt/emqx/data/mnesia/${Node Name}ディレクトリに保存されており、コンテナ再起動時にEMQXのノード名が変わることで新しいストレージディレクトリが作成されるためです。
EMQXのノード名はNameとHostで構成され、HostはデフォルトでコンテナのIPアドレスから取得されます。デフォルトのネットワーク設定ではコンテナのIPが再起動時に変わるため、固定IPを維持する必要があります。
この問題に対処するため、EMQXは環境変数EMQX_HOSTを提供しており、ノード名のHost部分を設定可能です。ただし、このHost値は他のノードから到達可能である必要があるため、ネットワークエイリアスと併用してください。以下はEMQX_HOST環境変数とネットワークエイリアスを指定してEMQX Dockerコンテナを起動する例です。
docker run -d --name emqx -p 18083:18083 -p 1883:1883 -e EMQX_HOST=alias-for-emqx --network example --network-alias alias-for-emqx --mount type=bind,source=/tmp/emqx,target=/opt/emqx/data emqx:5.8.3docker-composeで起動後、正常に起動しダッシュボードにアクセスできるのにコンテナのステータスがunhealthyになる理由は?
docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
emqx1 emqx/emqx:latest "/usr/bin/docker-ent…" emqx 120 seconds ago Up 110 seconds (unhealthy) 0.0.0.0:1883->1883/tcp, :::1883->1883/tcp, 0.0.0.0:18083->18083/tcp, :::18083->18083/tcpEMQXのヘルスチェックは./bin/emqx_ctl statusコマンドに依存しています。このコマンドが失敗するとコンテナはunhealthy状態になります。
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
interval: 60s
timeout: 15s
retries: 3手動で./bin/emqx_ctl statusを実行すると以下のようなエラーが出る場合があります。
emqx@docker:/opt/emqx$ emqx_ctl status
Node emqx@docker not responding to pings.このエラーはコマンドがノードに接続できないことを示します。原因はコンテナ起動時にネットワークがエイリアスを使用せず、FQDN形式でないため、ノードを正しく特定できないことが多いです。
解決策は以下の通りです。
- Dockerのホスト名をEMQXノード名に合わせる。
docker-compose.ymlにホスト名設定を追加する。
# xxx.yyy.zzz(docker.emqx.com)はFQDN形式である必要があります
hostname: docker.emqx.com
environment:
- EMQX_HOST=docker.emqx.comEMQXはdata/mnesia/<node name>にデータを保存するため、ノード名が変わるとデータが失われます。コンテナのIPアドレスは変わる可能性があるため、FQDN形式の安定したノード名を使用してください。EMQXはErlangノードをlong-nameモードで動作させるため、ドットなしの短いホスト名は使用できません。
より簡単に設定するには、EMQX Docker Compose Generatorを利用して、本番環境向けのdocker-compose.ymlファイルを作成することを検討してください。