Asterisk: res_ari.c ARI WebSocket connection closed unexpectedly
- Ошибка в системном журнале:
ERROR: res_ari.c: ARI WebSocket connection closed unexpectedly. - Внешнее приложение Stasis перестает получать канальные события и управлять цепочками вызовов.
- Каналы в диалплане застревают на шаге
Stasis(app_name)и завершаются по таймауту. - Падение клиентского процесса Stasis (Node.js/Python ARI Client) по ошибке необработанного исключения сокета.
1. Проверка конфигурации HTTP-сервера Asterisk в /etc/asterisk/http.conf
Убедитесь, что встроенный HTTP-сервер активен и настроен корректный bind-адрес:
[general]
enabled = yes
bindaddr = 0.0.0.0
bindport = 8088
sessionlimit = 500
session_inactivity = 30000
session_keep_alive = 15000
tlsenable = no2. Настройка прав и параметров в /etc/asterisk/ari.conf
[general]
enabled = yes
pretty = yes
allowed_origins = *
[ari_app_user]
type = user
read_only = no
password = UltraSecureAriPassword456!
password_format = plain3. Настройка WebSocket Keep-Alive в клиентском коде
Для предотвращения разрыва сессии по таймауту NAT/Proxy включите регулярные Ping/Pong фреймы со стороны клиента (пример на Node.js ari-client):
const ari = require('ari-client');
ari.connect('http://127.0.0.1:8088', 'ari_app_user', 'UltraSecureAriPassword456!', {
websocket: {
keepalive: true,
keepaliveInterval: 10000,
dropConnectionOnKeepaliveTimeout: true,
keepaliveGracePeriod: 5000
}
}, (err, client) => {
if (err) throw err;
console.log('Connected to ARI WebSocket');
client.start('my_stasis_app');
});4. Перезапуск сетевых модулей Asterisk
asterisk -rx "http reload"
asterisk -rx "module reload res_ari.so" Частые вопросы (FAQ)
Почему WebSocket соединение ARI закрывается без явных ошибок?
Чаще всего соединение сбрасывается промежуточным прокси-сервером (Nginx, HAProxy) или межсетевым экраном из-за отсутствия трафика (Idle Timeout) при отсутствии регулярных WebSocket Ping фреймов.
Как защитить ARI интерфейс шифрованием TLS/WSS?
В http.conf включите tlsenable=yes, укажите tlscertfile и tlsdontverifyserver, и используйте wss:// протокол на порту 8089.
Что происходит с активными вызовами в Stasis при падении WebSocket?
Каналы остаются в Stasis до наступления таймаута приложения или принудительного сброса через диалплан/Hangup.
Как проверить статус подключений ARI через командную строку?
Выполните команду: asterisk -rx "ari show apps" или проверьте активных HTTP-пользователей: asterisk -rx "http show status".