Estoy ejecutando ejabberd 19.09.1 usando la imagen oficial de Docker, configurada para autenticación anónima con mod_muc
. Los clientes generalmente se conectan al servidor en el navegador a través de un punto final WebSocket. ejabberd está sentado detrás de un proxy inverso nginx.
Cuando un cliente se desconecta de manera impura (por ejemplo, al cerrar la pestaña del navegador), inmediatamente veo un mensaje en el archivo de registro como:
ejabberd_1 | 15:39:04.917 [info] (websocket|<0.591.0>) Closing c2s session for 491099311875587266962@localhost/7150882238488846509978: Connection failed: connection closed
Sin embargo, en la sala MUC, el usuario desconectado parece estar todavía en línea indefinidamente (es decir, no hay tiempo de espera). No se envía ninguna presencia no disponible a la sala.hastaalguien más se une, abandona o envía un mensaje de grupo, momento en el cual aparece de repente la presencia no disponible y se muestra que el usuario está desconectado. El envío de mensajes privados entre usuarios distintos al que se desconectó no tiene ningún efecto.
Anteriormente estaba usando ejabberd 16.09 en Debian Jessie, donde este comportamiento no ocurría: las actualizaciones de presencia eran instantáneas, incluso en desconexiones no limpias.
Aquí está el contenido de mi ejabberd.yml
archivo:
---
## 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: {}
Agradecería mucho que alguien pudiera señalar algún defecto en mi configuración que pudiera estar causando este problema.
Respuesta1
No tengo ningún cliente websocket para replicar ese comportamiento. Pero tengo el cliente Gajim, que es compatible con BOSH.
Inicio sesión en el cliente Gajim usando BOSH y me uno a una habitación donde hay otros ocupantes. Luego mato al cliente Gajim abruptamente. No se registra nada en los registros de ejabberd ni en la sala de chat.
Después de 30 segundos, el registro muestra:
17:35:13.638 [info] (http_bind|<0.558.0>)
Closing c2s session for user2@localhost/gajim.MQSPY3HC:
Connection failed: connection closed
Yinmediatamentelos demás ocupantes de la habitación reciben la presencia de no disponible.
Me pregunto si también tienes el problema al usar BOSH, o si está estrictamente relacionado con websocket.