Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

ARI_WS_CLOSED_UNEXPECTEDLY IP-Телефония и СКУД

Asterisk: res_ari.c ARI WebSocket connection closed unexpectedly

Обновлено: 24.08.2026 · Официальная документация ↗
  • Ошибка в системном журнале: 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 = no

2. Настройка прав и параметров в /etc/asterisk/ari.conf

[general]
enabled = yes
pretty = yes
allowed_origins = *

[ari_app_user]
type = user
read_only = no
password = UltraSecureAriPassword456!
password_format = plain

3. Настройка 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"
💡 Практика специалистов: Если ARI работает за Nginx Reverse Proxy, обязательно пропишите в блоке location заголовки: proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; и увеличьте proxy_read_timeout до 3600s.

Частые вопросы (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".

Полезные материалы
Рекомендуем