Ejabberd MUC 룸은 연결이 끊긴 사용자에게 사용할 수 없는 현재 상태를 보내지 않습니다.

Ejabberd MUC 룸은 연결이 끊긴 사용자에게 사용할 수 없는 현재 상태를 보내지 않습니다.

. mod_muc​클라이언트는 일반적으로 WebSocket 끝점을 통해 브라우저의 서버에 연결됩니다. ejabberd는 nginx 리버스 프록시 뒤에 앉아 있습니다.

클라이언트가 불결하게 연결을 끊으면(예: 브라우저 탭 종료) 즉시 로그 파일에 다음과 같은 메시지가 표시됩니다.

ejabberd_1  | 15:39:04.917 [info] (websocket|<0.591.0>) Closing c2s session for 491099311875587266962@localhost/7150882238488846509978: Connection failed: connection closed

그러나 MUC 룸에서는 연결이 끊긴 사용자가 계속 온라인 상태인 것처럼 보입니다(즉, 시간 초과가 없음). 사용할 수 없는 현재 상태가 회의실로 전송되지 않습니다.~까지다른 사람이 그룹 메시지에 참여하거나, 나가거나, 보내는 경우 사용할 수 없는 현재 상태가 갑자기 나타나고 사용자가 오프라인인 것으로 표시됩니다. 연결을 끊은 사용자 이외의 사용자 간에 비공개 메시지를 보내는 것은 효과가 없습니다.

나는 이전에 Debian Jessie에서 ejabberd 16.09를 사용하고 있었는데, 여기서는 이 동작이 발생하지 않았습니다. 연결이 끊긴 경우에도 현재 상태 업데이트가 즉시 이루어졌습니다.

ejabberd.yml내 파일 의 내용은 다음과 같습니다 .

---
## loglevel: Verbosity of log files generated by ejabberd
## 0: No ejabberd log at all (not recommended)
## 1: Critical
## 2: Error
## 3: Warning
## 4: Info
## 5: Debug
loglevel: 4

## rotation: Disable ejabberd's internal log rotation, as the Debian package
## uses logrotate(8).
log_rotate_count: 0
log_rotate_date: ""

## hosts: Domains served by ejabberd.
## You can define one or several, for example:
## hosts:
##   - "example.net"
##   - "example.com"
##   - "example.org"
hosts:
  - "localhost"

certfiles:
  - "/etc/ejabberd/ejabberd.pem"
  ## - "/etc/letsencrypt/live/*/*.pem"

## TLS configuration
define_macro:
  'TLS_CIPHERS': "HIGH:!aNULL:!eNULL:!3DES:@STRENGTH"
  'TLS_OPTIONS':
    - "no_sslv3"
    - "no_tlsv1"
    - "no_tlsv1_1"
    - "cipher_server_preference"
    - "no_compression"
    ## 'DH_FILE': "/path/to/dhparams.pem"
    ## generated with: openssl dhparam -out dhparams.pem 2048

c2s_ciphers: 'TLS_CIPHERS'
s2s_ciphers: 'TLS_CIPHERS'
c2s_protocol_options: 'TLS_OPTIONS'
s2s_protocol_options: 'TLS_OPTIONS'
## c2s_dhfile: 'DH_FILE'
## s2s_dhfile: 'DH_FILE'

listen:
  -
    port: 5280
    ip: "0.0.0.0"
    module: ejabberd_http
    request_handlers:
      ##"/api": mod_http_api
      "/http-bind": mod_bosh
      ## "/upload": mod_http_upload
      "/websocket": ejabberd_http_ws
    captcha: false
    register: false
    tls: false
    protocol_options: 'TLS_OPTIONS'
    web_admin: false

websocket_ping_interval: 10
websocket_timeout: 60

## Disabling digest-md5 SASL authentication. digest-md5 requires plain-text
## password storage (see auth_password_format option).
disable_sasl_mechanisms:
  - "digest-md5"
  - "X-OAUTH2"

s2s_use_starttls: required

## Store the plain passwords or hashed for SCRAM:
auth_password_format: scram

##
## Anonymous login support:
auth_method: anonymous
anonymous_protocol: both
allow_multiple_connections: true

## Full path to a script that generates the image.
## captcha_cmd: "/usr/share/ejabberd/captcha.sh"

acl:
  admin:
     user:
       - ""

  local:
    user_regexp: ""
  loopback:
    ip:
      - "127.0.0.0/8"
      - "::1/128"
      - "::FFFF:127.0.0.1/128"

access_rules:
  local:
    - allow: local
  c2s:
    - deny: blocked
    - allow
  announce:
    - allow: admin
  configure:
    - allow: admin
  muc_create:
    - allow: local
  pubsub_createnode:
    - allow: local
  register:
    - allow
  trusted_network:
    - allow: loopback

api_permissions:
  "console commands":
    from:
      - ejabberd_ctl
    who: all
    what: "*"
  "admin access":
    who:
      - access:
          - allow:
            - acl: loopback
            - acl: admin
      - oauth:
        - scope: "ejabberd:admin"
        - access:
          - allow:
            - acl: loopback
            - acl: admin
    what:
      - "*"
      - "!stop"
      - "!start"
  "public commands":
    who:
      - ip: "127.0.0.1/8"
    what:
      - "status"
      - "connected_users_number"

shaper:
  normal: 1000
  fast: 50000

shaper_rules:
  max_user_sessions: 10
  max_user_offline_messages:
    - 5000: admin
    - 100
  c2s_shaper:
    - none: admin
    - normal
  s2s_shaper: fast

modules:
  ## mod_adhoc: {}
  mod_admin_extra: {}
  ## mod_announce:
    ## access: announce
  ## mod_avatar: {}
  ## mod_blocking: {}
  mod_bosh: {}
  ## mod_caps: {}
  ## mod_carboncopy: {}
  ## mod_client_state: {}
  ## mod_configure: {}
  ## mod_delegation: {}   # for xep0356
  ## mod_disco: {}
  ## mod_echo: {}
  ## mod_fail2ban: {}
  ## mod_http_api: {}
  ## mod_http_upload:
  ##   put_url: "https://@HOST@:5443/upload"
  ## mod_last: {}
  ## mod_mam:
  ##   ## Mnesia is limited to 2GB, better to use an SQL backend
  ##   ## For small servers SQLite is a good fit and is very easy
  ##   ## to configure. Uncomment this when you have SQL configured:
  ##   ## db_type: sql
  ##   assume_mam_usage: true
  ##   default: always
  mod_muc:
    access:
      - allow
    access_admin:
      - allow: admin
    access_create: muc_create
    access_persistent: muc_create
    default_room_options:
      mam: false
      presence_broadcast: [moderator, participant, visitor]
  mod_muc_admin: {}
  mod_offline:
    bounce_groupchat: true
    access_max_user_messages: 1
  mod_ping:
    send_pings: true
    ping_interval: 15
    ping_ack_timeout: 30
    timeout_action: kill
  ## mod_pres_counter:
    ## count: 5
    ## interval: 60
  ## mod_privacy: {}
  ## mod_private: {}
  ## mod_proxy65: {}
  ## mod_pubsub:
    ## access_createnode: pubsub_createnode
    ## plugins:
      ## - "flat"
      ## - "pep"
    ## force_node_config:
      ## "eu.siacs.conversations.axolotl.*":
        ## access_model: open
      ## Avoid buggy clients to make their bookmarks public
      ## "storage:bookmarks":
        ## access_model: whitelist
  ## mod_push: {}
  ## mod_push_keepalive: {}
  ## mod_register:
  ##   ## Only accept registration requests from the "trusted"
  ##   ## network (see access_rules section above).
  ##   ## Think twice before enabling registration from any
  ##   ## address. See the Jabber SPAM Manifesto for details:
  ##   ## https://github.com/ge0rg/jabber-spam-fighting-manifesto
  ##   ip_access: trusted_network
  ## mod_roster:
    ## versioning: true
  ## mod_s2s_dialback: {}
  ## mod_shared_roster: {}
  ## mod_sic: {}
  ## mod_vcard:
    ## search: false
  ## mod_vcard_xupdate: {}
  ## mod_version: {}

이 문제를 일으킬 수 있는 내 구성의 결함을 누군가 지적해 주시면 정말 감사하겠습니다.

답변1

해당 동작을 복제할 웹소켓 클라이언트가 없습니다. 하지만 BOSH를 지원하는 Gajim 클라이언트가 있습니다.

BOSH를 사용하여 Gajim 클라이언트에 로그인하고 다른 거주자가 있는 방에 참여합니다. 그러다 갑자기 Gajim 클라이언트를 죽입니다. ejabberd 로그나 채팅방에는 아무것도 기록되지 않습니다.

30초 후에 로그에 다음이 표시됩니다.

17:35:13.638 [info] (http_bind|<0.558.0>)
 Closing c2s session for user2@localhost/gajim.MQSPY3HC:
 Connection failed: connection closed

그리고즉시다른 방에 있는 사람은 현재 상태를 확인할 수 없습니다.

BOSH를 사용할 때도 문제가 발생하는지, 아니면 웹소켓과 밀접한 관련이 있는지 궁금합니다.

관련 정보