Jitsi Meetの利用状況を確認する

Jitsi Meetが使える環境を構築して見たところ、評判も良く、結構な数のユーザーが使ってくれているようだ。しかし、Videobridgeは想定していた以上にCPUを消費するように見えたので、実際どのくらいの人数が利用しているのかを確認したいと思った。





元々自由に使ってもらう発想のシステムで、プライバシーを尊重するスタイルらしく、会議室や利用ユーザーを管理するようなインターフェースが提供されていない、ってことらしいんだけど、ツールは準備されているらしい。

既に運用している環境で機能を追加することを想定している。
インストールについては過去記事を参照のこと。

やること。

Prosodyの最新バージョンを使う

Ubuntuは色々なパッケージを安全に提供してくれているが、どうやらJitsi Meetの開発元はProsody 11を使っているみたい。ゴースト問題への対応方法を調べていたら、そんな雰囲気(正確なところは分からないが)。

Prosody本家のリポジトリを登録

Ubuntu18.04のProsodyバージョンは0.10.0-1build1となっている。これを11にするのだが…

本家のリポジトリを設定すれば最新版が使えるかも!
Prosody package repository

# echo deb http://packages.prosody.im/debian $(lsb_release -sc) main > /etc/apt/sources.list.d/prosody.list
# wget https://prosody.im/files/prosody-debian-packages.key
# apt-key add prosody-debian-packages.key
# apt update

 

インストール

既にProsodyはインストールされているので、アップデートするだけ。

# apt dist-upgrade

これでProsodyのパッケージが更新され、0.11.5-1~bionic6になった。

設定修正

だが、このままだとJitsi Meetが動かない。っていうより、Prosodyが動かない。設定ファイルを読み込むように修正する。
Jitsi Community / Need help to update prosody to 0.11

/etc/prosody/prosody.cfg.lua
--VirtualHost "localhost"  ← コメント化
…
Include "conf.d/*.cfg.lua" ← 最終行に追加

※このVirtualHostをコメント化することは重要な気がする。全体に設定したつもりの何かを、localhost内で閉じてしまうから。localhostの設定は、conf.dの中で設定している。

さらに…ここに書かれていた情報で以下を修正。
Jitsi Community / Need help to update prosody to 0.11

/etc/prosody/conf.avail/temp.hogeserver.hogedns.jp.cfg.lua
--    storage = "none"
    storage = "memory"

※2箇所あるので、どちらも修正しておく。

さらに、インストール時に生成される秘密鍵ファイルにアクセス権がないと起動しないので、権限変更しておく。

# chown prosody /etc/prosody/certs/localhost.key

Prosodyを再起動し、Jitsi Meetが正しく動作することを確認する。

# systemctl restart prosody

 

luarocksの最新バージョンを使う

luarocksの最新バージョンをインストール

Prosodyのモジュールが利用するライブラリはluarocksを使ってコンパイルすることができる。Prosody 11が求めるのはLua5.2のライブラリ群。

Ubuntuの公式リポジトリからダウンロードしてきたluarocksは5.1をサポートしているけれど、5.2のモジュールを作ることができない。configがありそうなものなんだけれど、なんともできなかった。

そこで、こちらも本家からluarocksの最新バージョンをダウンロードしてきて利用することにした。
Github / luarocks / Installation instructions for Unix

# apt install lua5.2 liblua5.2-dev zip unzip

# wget https://luarocks.org/releases/luarocks-3.3.1.tar.gz
# tar zxpf luarocks-3.3.1.tar.gz
# cd luarocks-3.3.1/
# ./configure
# make
# make install

※この日の最新は3.3.1だった。その日の最新を落としてくるのが吉。

あっという間にmakeできるので驚いたけど、特に問題なし。
/usr/local/bin/luarocks ができあがる。

ここにはパスが通っていないので、通しておく。

~/.profile
…
PATH="$PATH:/usr/local/bin"

※最後に追記。

ログインし直せばパスの設定が反映される。

Prosodyが利用するモジュールをコンパイル

ログインし直して、各モジュールをコンパイル。

# luarocks install net-url
# luarocks install basexx

# apt install libssl1.0-dev ※1
# luarocks install luajwtjitsi

# luarocks install lua-cjson 2.1.0-1 ※2

※1 SSLのライブラリは1.1でluacryptoに関わる部分が大きく変わったそうで、旧バージョンでないとコンパイルできない。
GitHub / mkottman / luacrypto / Error: Build error: Failed compiling object src/lcrypto.o

※2 cjsonについては、最新バージョンだとエラーが発生するため、明示的に1つ前のバージョンをインストールしている。
stackoverflow / Symbol not found: _lua_objlen

状態表示モジュールの設置と問い合わせ

ここまで準備ができれば、状態表示モジュールを設置して使うだけ。

状態表示モジュールの設置

セッション情報をするためのモジュール、頑張ってみたけれども標準のmod_muc_sizeは自分には動作させられなかった。
色々探して試して…ようやく動くものを発見した。
Jitsi Community / Jitsi monitoring mod, room list , occupant list

この投稿にある The code: と書かれている箇所のコードをコピーして以下のファイルを作成する。
/usr/share/jitsi-meet/prosody-plugins/mod_muc_status.lua

ただ、この名前のままだと攻撃を受ける可能性があるので、名前を変えておくように書かれている。これにはApaheのProxy設定で対応しようと思う。

…
    ["GET status"] = function (event) return async_handler_wrapper(event,get_all) end;
    ["GET sessions"] = function () return tostring(it.count(it.keys(prosody.full_sessions))); end;
…

※このstatusやsessionsを問い合わせで使う。

こうして設置した状態表示モジュールをVirtualHostに登録する。
/etc/prosody/conf.avail/localhost.cfg.lua
-- Section for localhost

-- This allows clients to connect to localhost. No harm in it.
VirtualHost "localhost"
        -- enabled = false -- Remove this line to enable this host
	app_id=""
	app_secret=""
        authentication = "anonymous"
        modules_enabled = {
            "muc_status";
        }

設定を反映させる。

# systemctl restart prosody

これで、設置したモジュールが利用するライブラリも読み込まれるので、エラーが出ていないことを確認する。

/var/log/prosody/prosody.err
May 16 16:48:08 portmanager     error   Error binding encrypted port for https: No certificate present in SSL/TLS configuration for https port 5281
May 16 16:48:08 portmanager     error   Error binding encrypted port for https: No certificate present in SSL/TLS configuration for https port 5281

※このエラーは無視して良いとのこと。これ以外のエラーは解消しておく。

ログインしてcurlで問い合わせ

Prosodyはまだ理解できていないところが多いのだけれど、どうも”GET なんちゃら”で定義されているところにアクセスすると、関数を呼び出して答えを返してくれるらしい。
/usr/share/jitsi-meet/prosody-plugins/mod_muc_status.lua ※先程設置したファイル

…
    ["GET status"] = function (event) return async_handler_wrapper(event,get_all) end;
    ["GET sessions"] = function () return tostring(it.count(it.keys(prosody.full_sessions))); end;
…

実際に問い合わせてみる。

# curl http://localhost:5280/sessions
2

※実際のセッション+2が表示される。Jitsi関連の接続があるからだろうと思う。

statusの方では、json形式の文字列が戻され、あまり見やすくない。
整形ツールで見やすくする。
Qiita / jq コマンドを使う日常のご紹介

# apt install jq
# curl http://localhost:5280/status?domain=temp.hogeserver.hogeddns.jp | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   323  100   323    0     0  20187      0 --:--:-- --:--:-- --:--:-- 19000
[
  [
    [
      {
        "NBparticipant": "1",
        "roomjid": "aiueo@conference.temp.hogeserver.hogeddns.jp",
        "NBvideomuted": "0",
        "domain": "conference.temp.hogeserver.hogeddns.jp",
        "NBaudiomuted": "0",
        "participant": [
          {
            "videomuted": "false",
            "display_name": "",
            "jid": "aiueo@conference.temp.hogeserver.hogeddns.jp/f3859d42",
            "role": "moderator",
            "audiomuted": "false"
          }
        ],
        "roomname": "aiueo"
      }
    ]
  ]
]

※こちらは、1人でも良いので接続しておかないと中身が表示されない。

外部ホストからブラウザで問い合わせ

Apacheの設定

状態を見るためのディレクトリを設定して、そこで好きな問い合わせができるようにすればいいかなと。
/etc/apache2/sites-available/temp.hogeserver.hogeddns.jp

…
  ProxyPreserveHost on
  ProxyPass /http-bind http://localhost:5280/http-bind/
  ProxyPassReverse /http-bind http://localhost:5280/http-bind/

  ProxyPreserveHost off
  ProxyPass /query/ http://localhost:5280/
  ProxyPassReverse /query/ http://localhost:5280/

  RewriteEngine on
  RewriteRule ^/([a-zA-Z0-9]+)$ /index.html
</VirtualHost>

※追加部分のqueryのところをパスワードチックな長い文字列にしておけば、攻撃を受けることもないだろう。

設定を反映させる。

# systemctl reload apache2

これで、例えば以下をブラウザに入れて問い合わせることができる。
https://temp.hogeserver.hogedns.jp/query/status?domain=temp.hogeserver.hogeddns.jp

表示内容を整形

json形式は良いのだけれど、整形しないと読みづらい。フォーマッターを探していたら、とても良いライブラリが見つかった。
GitHub / bungle / lua-resty-prettycjson

# luarocks install lua-resty-prettycjson

mod_muc_status.luaを改変。
/usr/share/jitsi-meet/prosody-plugins/mod_muc_status.lua
…
local tostring = tostring;
local neturl = require "net.url";
local parse = neturl.parseQuery;
local pretty = require "resty.prettycjson"

-- option to enable/disable room API token verifications
…
--      return { status_code = 200; body = json.encode(state) };
        return { status_code = 200; body = pretty(state,"\n","  ") };

end
…

※要するに、エンコードのライブラリを変更した、というだけのこと。

Prosodyに設定を反映させる。

# systemctl restart prosody

これで、整形された結果が表示されるようになる。

調べたこと

Prosody10のままでどうにかできないか

色々トライしたけれども、自分には上手く処理できなかった。断念。

Error binding encrypted port for https の解消

Prosodyのインストールでいくつかやっておかなければならないことが欠落しているよ、という指摘。試していないけれど、解決できそうな雰囲気。
diaspora / Prosody errors: connections / binding encrypted port

ゴースト参加者を消す(暫定対処)

ゴースト参加者の問題は、どうやら人数が多いところでは頻繁に発生しており、開発陣はコミュニティ参加者と共に問題を解析している模様。

そして、その議論の中でPingerというプラグインでゴーストを切断しているという発言を見つけた。
Jitsi community / Ghosts users in some rooms

ここで触れられているmod_pingerを以下に持ってくる。
/usr/lib/prosody/modules/mod_pinger.lua

モジュールを有効化する。
/etc/prosody/prosody.cfg.lua

…
modules_enabled = {

        -- Generally required
                "roster"; -- Allow users to have a roster. Recommended ;)
…
                "pinger"; -- 暫定対処 ゴースト参加者対策(modules_enabledの最後に追加してみた)
}
…

反映させるためにProsodyを再起動。

# systemctl restart prosody

※prosodyを再起動すると、会議室にいるユーザーが全員切断されるので注意。

4端末で1時間ほど接続してみたが、特におかしな切断等は発生していないようだったので、開発元で対処されるまでの暫定対処として設定し、様子をみる。

さいごに

またしてもカットアンドトライの連続。
できあがった手順はこの通りでたいしたことはないけど、初めてのことも多いし、エラーの原因が上手く特定できなくて時間が掛かってしまった。


Jitsi Meetを何度もインストールして試しているが、最近猛烈にサーバーが重くて、モジュールのダウンロードに物凄く時間が掛かる。

何度も取りに行くのも申し訳ないし、一度ダウンロードしてきたものを取っておこうかな。ファイルはここにあるみたいだから。

/var/cache/apt/archives

と思ったらない…。毎度ダウンロードするしかなさそう。

お気軽にどうぞ ~ 投稿に関するご意見・感想・他

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です