Установка и настройка Asterisk + FreePBX на CentOS 8

Материал из Шпаргалка знаний
Перейти к навигации Перейти к поиску

После установки на сервер CentOS 8 (Minimal) (x86_64) 4Gb RAM, 4 CPU, 20Gb SSD, приступаем к подготовке сервера.

Данная инструкция написана на примере установки Asterisk 16 LTS и FreePBX 15 — хоть на момент написания этих строк, последняя версия астериска была 18-я, FreePBX 15 поддерживает, максимум, Asterisk 17. В качестве веб-сервера для FreePBX мы будем использовать NGINX.

Подготовка сервера

Для корректной работы сервера необходимо настроить системное время, открыть порты в брандмауэре и отключить SELinux. Также мы установим несколько пакетов и создадим учетную запись, от которой будет работать Asterisk.

Настройка Времени

Задаем часовой пояс:

timedatectl set-timezone Europe/Moscow

* в данном примере московское время. Список всех зон можно посмотреть командой timedatectl list-timezones.

Устанавливаем сервис для синхронизации времени:

dnf install chronyd -y
systemctl enable chronyd --now

Обновляем систему:

dnf update -y
dnf upgrade -y

Настройка firewall

Мы должны открыть порты:

  • 5060 — SIP.
  • 5061 — SIP over TLS.
  • 80 — http.
  • 443 — https.
  • 10000-20000 — диапазон для динамических портов.

В CentOS для управления брандмауэром может использоваться firewalld или iptables. Рассмотрим настройку и того, и другого:

Firewalld

Разрешаем порты для работы asterisk:

firewall-cmd --permanent --add-port={5060,5061}/{tcp,udp}
firewall-cmd --permanent --add-port=10000-20000/udp

... и веб-сервера NGINX:

firewall-cmd --permanent --add-service={http,https}

Для применения настроек перезапускаем правила:

firewall-cmd --reload
Iptables

Открываем порты для астериска и веб-сервера:

iptables -I INPUT -p tcp --match multiport --dports 5060,5061 -j ACCEPT
iptables -I INPUT -p udp --match multiport --dports 5060,5061 -j ACCEPT 
iptables -I INPUT -p tcp --match multiport --dports 80,443 -j ACCEPT
iptables -I INPUT -p udp --match multiport --dports 80,443 -j ACCEPT
iptables -I INPUT -p udp --dport 10000:20000 -j ACCEPT

Для сохранения правил установим:

yum install iptables-services

И разрешим автозапуск сервиса и сохраняем правила:

systemctl enable iptables
service iptables save

* правила будут сохранены в файл /etc/sysconfig/iptables.

Отключение SELinux.

setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config

Установка пакетов

Выполним установку пакетов:

dnf install wget tar glibc-langpack-ru -y

* где:

wget — утилита для загрузки файлов по сети.

tar — для распаковки архивов.

glibc-langpack-ru — русская локаль. Она нужна, чтобы у нас была возможность выбрать русский интерфейс во FreePBX.

Создание пользователя

Нам нужен общий пользователь, от которого будет работать Asterisk и веб-сервер. Это необходимо, чтобы веб-сервер имел доступ к каталогам астериска.

Создаем пользователя командой:

useradd asterisk -m

Настройка веб-сервера

Для работы FreePBX нам необходим веб-сервер и СУБД. В нашем примере мы установим связку NGINX + PHP + MariaDB + NodeJS.

Установка MariaDB

Подключение актуального репозитория: В примерах выше мы установили СУБД из репозиториев операционных систем. А значит — нет гарантии, что будет установлена последняя версия MariaDB. Для решения задачи мы можем подключить официальный репозиторий самого разработчика.

Генерируем репозиторий mariadb.repo.

Скачиваем скрипт из оф.сайта для генерации репозитория mariadb.repo и даем ему право на выполнение.

cd ~
wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
chmod +x mariadb_repo_setup

После предоставления необходимых прав, нужно запустить этот скрипт и он уже сгенерирует репозиторий.

./mariadb_repo_setup

Итак, после выполнения скрипта файл mariadb.repo будет сгенерирован в директории /etc/yum.repos.d.

Заходим и смотрим, что он там намутил...

nano /etc/yum.repos.d/mariadb.repo

После генерации репозитория теперь запускаем установку самой MariaDB:

dnf install mariadb mariadb-server --allowerasing
  • для установки mysql выполняем команду dnf install mysql

Чтобы, проверить какие пакеты установились нужно использовать команду:

yum list installed | grep mariadb

Разрешаем автозапуск и запускаем СУБД:

systemctl enable mariadb --now
  • для работы с mysql меняем mariadb на mysql.

Проверьте состояние службы MariaDB, выполнив следующую команду.

systemctl status mariadb

Если у вас включен брандмауэр, тогда нужно добавить MariaDB в правило брандмауэра. Для этого выполните следующую команду.

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

Сразу создаем пароль для учетной записи root:

mysqladmin -u root password

Защита сервера MariaDB на CentOS 8

В качестве последнего шага нам нужно запустить безопасный сценарий установки MariaDB. Этот скрипт позаботится о пароле root, установки привилегий, удалении тестовых баз данных, запрете входа в систему с root правами.

mysql_secure_installation

Далее вводим пароль который создавали на предыдущем шаге и везде отвечаем: Y

[root@webserver ~]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

You already have a root password set, so you can safely answer 'n'.

Change the root password? [Y/n] n
 ... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Установка NGINX

Для установки самой свежей стабильной версии nginx создаем конфиг:

nano /etc/yum.repos.d/nginx.repo

Есть 2 версии nginx. Stable version (Стабильная) и Mainline version (Основная). Основная версия — это последняя версия nginx с новыми функционалом. Стабильная версия — это версия, которая нацелена на стабильность и безопасность. Новый функционал не добавляется.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/8/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/8/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Можно прописать в файл все два репозитория. Если нужна стабильная версия, тогда ее нужно указать программе dnf, что бы она использовала репозиторий стабильной версии.

dnf config-manager --set-enabled nginx-stable

Устанавливаем NGINX:

dnf install nginx -y

Внесем небольшую корректировку в файл nginx.conf:

nano /etc/nginx/nginx.conf
http {
    ...
    server_names_hash_bucket_size 64;
    ...
    client_max_body_size 128M;  (Добавляем эту строку. Данный параметр разрешает загрузку файлов размером 128 Мб.)
    ....
}

* на практике, может встретиться ошибка could not build server_names_hash, you should increase server_names_hash_bucket_size: 32. Она возникает при большом количестве виртуальных серверов или если один из них будет иметь длинное название. Данная строка в конфиге исправит ситуацию.

Разрешаем автозапуск сервиса и запустим его:

systemctl enable nginx --now

Проверим, что веб-сервер работает. Для этого открываем браузер на другом компьютере, который находится в одной сети и вводим в адресной строке IP-адрес сервера. В итоге мы должны увидеть заголовок «Welcome to nginx!»:

  • обратите внимание, что данное приветствие может иметь и другой вид.

PHP и компоненты

Добавляем репозиторий:

dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Теперь вы можете перечислить модули PHP и посмотреть, был ли добавлен PHP 8.2

dnf module list php

После этого теперь вы можете сбросить модуль и включить PHP 8.2:

dnf module reset php
dnf module install php:remi-8.2
dnf module enable php:remi-8.2

И устанавливаем php и PHP-FPM версии 8.2:

dnf install php php-fpm -y

Проверяем:

php -r "phpinfo();" | grep "PHP Version"

Установим наиболее популярные модули, которые могут пригодится в процессе эксплуатации веб сервера.

dnf install php-{bcmath,gd,json,mbstring,mysqlnd,pear,snmp,zip} -y

В процессе установки php на CentOS устанавливается apache, но нам он не нужен — вводим команду для запрета его автозапуска:

systemctl disable httpd

Открываем настройки для php:

nano /etc/php.ini

Правим значения для следующих опций:

upload_max_filesize = 128M
...
post_max_size = 128M
...
date.timezone = "Europe/Moscow"
...
memory_limit = 512M

* где:

upload_max_filesize — максимальный объем загружаемого файла.

post_max_size — максимальный объем всех загружаемых файлов за один раз.

date.timezone — временная зона.

memory_limit — максимальный объем памяти, который может использовать интерпретатор.

Открываем настройки php-fpm:

nano /etc/php-fpm.d/www.conf

Задаем значения для следующих опций:

user = asterisk
...
group = asterisk
...
listen.acl_users = asterisk,apache,nginx

* FreePBX должен работать с файлами в каталоге /etc/asterisk. Владельцем этого каталога будет пользователь asterisk, поэтому обработка php должна выполняться тоже от данного пользователя, чтобы иметь соответствующие права на редактирование конфигурационных файлов.

Запускаем php-fpm и разрешаем его автозапуск:

systemctl enable php-fpm --now

NGINX + PHP

Свяжем наш веб-сервер с php. Для этого откроем конфигурационный файл:

nano /etc/nginx/nginx.conf

Добавим следующие строки в разделы http - server:

...
http {
    ...
    server {
        ...
        server_name  192.168.1.15;
        ...
        location ~ \.php$ {
            set $root_path /usr/share/nginx/html;
            fastcgi_pass unix:/run/php-fpm/www.sock;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
            fastcgi_param SERVER_NAME $host;
        }
        ...

* в данном примере мы задаем настройку для server_name — указываем имя хоста или IP-адрес, по которому мы будем подключаться к FreePBX. Также мы создаем секцию location для обработки php через php-fpm.

Перезапустим nginx:

systemctl reload nginx

Создаем index.php в каталоге сайта по умолчанию со следующим содержимым:

nano /usr/share/nginx/html/index.php
<?php phpinfo(); ?>

Открываем в браузере IP-адрес нашего сервера. Теперь мы должны увидеть сводную информацию по PHP и его настройкам, например:

NodeJS

Последний компонент для нашего веб-сервера — NodeJS. Для его установки выполняем команду:

dnf install nodejs npm -y

Убедиться в установке можно командой просмотра версии:

node --version

Наш веб-сервер готов к работе.

Установка Asterisk

Мы будем устанавливать 16-ю версию Asterisk. На странице загрузки мы можем посмотреть все версии АТС и ссылки на них: https://www.asterisk.org/downloads/asterisk/all-asterisk-versions/

Сначала установим пакеты, необходимые для сборки:

dnf --enablerepo=powertools install libedit-devel

После скачиваем Asterisk:

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz

Распаковываем архив и переходим в него:

tar -xvf asterisk-*.tar.gz
cd asterisk-*/

Устанавливаем зависимости для астериска:

./contrib/scripts/install_prereq install

Мы должны увидеть:

Complete!
#############################################
## install completed successfully
#############################################

Чистим временные файлы, которые появились после установки зависимостей:

make distclean

Добавляем библиотеку для работы с mp3:

./contrib/scripts/get_mp3_source.sh

Конфигурируем исходник:

./configure

* в данном примере мы конфигурируем исходник без дополнительных опций. Полный перечень опций и что они означают можно посмотреть командой ./configure -h.

Мы должны увидеть:

...
configure: Menuselect build configuration successfully completed

               .$$$$$$$$$$$$$$$=..      
            .$7$7..          .7$$7:.    
          .$$:.                 ,$7.7   
        .$7.     7$$$$           .$$77  
     ..$$.       $$$$$            .$$$7 
    ..7$   .?.   $$$$$   .?.       7$$$.
   $.$.   .$$$7. $$$$7 .7$$$.      .$$$.
 .777.   .$$$$$$77$$$77$$$$$7.      $$$,
 $$$~      .7$$$$$$$$$$$$$7.       .$$$.
.$$7          .7$$$$$$$7:          ?$$$.
$$$          ?7$$$$$$$$$$I        .$$$7 
$$$       .7$$$$$$$$$$$$$$$$      :$$$. 
$$$       $$$$$$7$$$$$$$$$$$$    .$$$.  
$$$        $$$   7$$$7  .$$$    .$$$.   
$$$$             $$$$7         .$$$.    
7$$$7            7$$$$        7$$$      
 $$$$$                        $$$       
  $$$$7.                       $$  (TM)     
   $$$$$$$.           .7$$$$$$  $$      
     $$$$$$$$$$$$7$$$$$$$$$.$$$$$$      
       $$$$$$$$$$$$$$$$.                

configure: Package configured for: 
configure: OS type  : linux-gnu
configure: Host CPU : x86_64
configure: build-cpu:vendor:os: x86_64 : pc : linux-gnu :
configure: host-cpu:vendor:os: x86_64 : pc : linux-gnu :

Продолжаем настройку — запускаем меню для выбора параметров:

make menuselect

Можно оставить значения по умолчанию и сохранить настройки.

Теперь можно запустить сборку астериска:

make

Мы должны увидеть сообщение об успешной сборке:

 +--------- Asterisk Build Complete ---------+
 + Asterisk has successfully been built, and +
 + can be installed by running:              +
 +                                           +
 +                make install               +
 +-------------------------------------------+

После выполняем установку:

make install

Мы увидим:

 +---- Asterisk Installation Complete -------+
 +                                           +
 +    YOU MUST READ THE SECURITY DOCUMENT    +
 +                                           +
 ...

Устанавливаем скрипты для автозапуска АТС и готовые конфигурационные файлы:

make config
make samples

Ранее мы создали пользователя asterisk, от которого должен запуститься наш сервер телефонии. Для этого откроем файл:

nano /etc/asterisk/asterisk.conf

Снимаем комментарий с опций:

runuser = asterisk
rungroup = asterisk

... и снимем комментарий с последующим редактированием:

defaultlanguage = ru
documentation_language = ru_RU

Задаем владельца для следующих каталогов:

chown -R asterisk:asterisk /var/run/asterisk
chown -R asterisk:asterisk /etc/asterisk
chown -R asterisk:asterisk /var/{lib,log,spool}/asterisk
chown -R asterisk:asterisk /var/log/asterisk

и проверяем настройки:

asterisk -c

Мы должны увидеть Asterisk Ready:

... значит наш сервер готов к запуску. Все ошибки и предупреждения нам не помешают, однако их можно устранить разными способами, как правило, отключив неиспользуемые модули.

После успешной проверки, можно запустить Asterisk в качестве демона:

systemctl enable asterisk
systemctl start asterisk

Установка FreePBX

Возвращаемся в домашнюю папку пользователя:

cd ~

Установим пакеты:

yum install sox mpg123 -y

* где:

  • sox — консольная утилита для преобразования аудиофайлов из одного формата в другой.
  • mpg123 — аудиопроигрыватель/декодер реального времени.

Скачиваем портал для управления астериском:

wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-15.0-latest.tgz

* мы скачаем freepbx версии 15. Для CentOS 8 это оптимальная версия. Если необходимо установить freepbx 14, то устанавливаемая по умолчанию версия php выдаст ошибку.

Распаковываем скачанный архив:

tar zxvf freepbx-*.tgz

Переходим в распакованный каталог:

cd freepbx

Запускаем скрипт проверки работы Asterisk:

./start_asterisk start

Если видим:

STARTING ASTERISK
Asterisk is already running

... запускаем установку:

./install -n --dbuser root --dbpass password --webroot=/usr/share/nginx/html

* в данном примере мы указали учетные данные для подключения к СУБД (логин root и пароль, который мы создали после установки MariaDB); также мы указываем путь /usr/share/nginx/html, который является домашней директорией веб-сервера NGINX.

Начнется установка — в конце мы должны увидеть:

You have successfully installed FreePBX

Установим компонент pm2:

fwconsole ma install pm2

Обновим все компоненты:

fwconsole ma updateall

Перезапустим конфигурацию:

fwconsole reload --verbose

Открываем браузер и заходим по адресу http:<IP-адрес сервера> — должна открываться страница конфигурирования FreePBX. Задаем настройки:

* достаточно указать логин и пароль для пользователя, под которым мы будем заходить в панель управления FreePBX и email адрес.

После входим в панель администратора под созданной учетной записью. Система нас запросит региональные настройки:

Теперь открываем конфигурационный файл:

nano /etc/asterisk/manager.conf

Находим строки:

#include manager_additional.conf
#include manager_custom.conf

... и меняем их на:

;include manager_additional.conf
;include manager_custom.conf

Перезапускаем сервис Asterisk:

systemctl restart asterisk

Asterisk + FreePBX настроен.

CDR и подключение к базе данных

В моем случае, не работало ведение CDR, а при вводе в консоли asterisk:

asterisk -r

... команды:

> odbc show

... я увидел:

ODBC DSN Settings
-----------------

  Name:   asteriskcdrdb
  DSN:    MySQL-asteriskcdrdb
    Last fail connection attempt: 2023-09-27 11:28:52
    Number of active connections: 0 (out of 5)
    Logging: Disabled

То есть, нет подключения к базе данных asteriskcdrdb. А при попытке подключиться к нужному DSN из командной строки:

isql -v MySQL-asteriskcdrdb

... я получил ошибку:

[01000][unixODBC][Driver Manager]Can't open lib '/usr/lib64/libmyodbc5.so' : file not found

То есть, проблема в отсутствии необходимой библиотеки при подключении к базе данных.

Нам необходимо выполнить 2 действия:

1. Установить коннектор ODBC.

2. Изменить драйвер для подключения к СУБД в odbc.ini.

Так как в данной инструкции мы используем в качестве севера баз данных MariaDB, нам необходим соответствующий коннектор. Ниже приведена инструкция установки и подключения к MariaDB из PHP с помощью ODBC:


ODBC connector

Для начала мы должны установить ODBC connector. Нам понадобиться скачать на наш сервер архив, поэтому сначала инсталлируем wget.

yum install wget -y

После установки wget перейдем в каталог /tmp:

cd /tmp

Открываем браузер и заходим на страницу загрузки коннекторов MariaDB и выбираем ODBC connector, а также нашу операционную систему (https://mariadb.com/downloads/connectors/connectors-data-access/odbc-connector/), например:

* в данном случае мы загрузим коннектор для CentOS 8.

Ниже на этой же страницы мы увидим ссылку на скачивание нужного нам коннектора. Копируем данную ссылку. С помощью wget и скопированной ссылки загружаем на сервер коннектор:

wget https://dlm.mariadb.com/1936441/Connectors/odbc/connector-odbc-3.1.15/mariadb-connector-odbc-3.1.15-centos8-amd64.tar.gz

Распаковываем его:

tar zxvf mariadb-connector-odbc-*.tar.gz

И копируем библиотеки в каталог /usr/lib64:

cp mariadb-connector-odbc-*-amd64/lib64/mariadb/lib* /usr/lib64/

После скачанный архив и распакованный каталог можно удалить:

rm -rf mariadb-connector-odbc-*

Установка и подготовка к работе СУБД

Для проверки настройки нам нужен сервер баз данных. Если его нет, то установим mariadb-server на тот же сервер, где и развернули ODBC. dnf install mariadb mariadb-server --allowerasing

В нашем случае мы его уже установили выше.

Заходим в консоль SQL:

mysql -uroot -p

Создаем новую базу данных:

> CREATE DATABASE my_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

* для наших тестов мы создали базу с названием my_db.

Дадим права на подключение и работу с созданной базой данных:

> GRANT ALL PRIVILEGES ON my_db.* TO 'odbc_user'@'localhost' IDENTIFIED BY 'odbc_password';

* данной командой мы разрешили доступ к базе my_db пользователю odbc_user, который будет подключаться с локального компьютера и паролем odbc_password.

Подключаемся к созданной базе данных:

> use my_db;

Создаем простенькую таблицу:

> CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(512) NOT NULL,
  `rights` varchar(64) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

* наша созданная таблица будет состоять из 3 столбцов — id, name и rights.

Добавим 3 строки в нашу таблицу:

> INSERT INTO users (`name`, `rights`) VALUES ('Павел', 'admin'), ('Инна', 'superuser'), ('Денис' ,'operator');

Готово. Теперь выходим из sql-оболочки:

> quit

Установка и настройка ODBC

Устанавливаем сам ODBC.

yum install unixODBC -y

Открываем конфигурационный файл:

nano /etc/odbcinst.ini

Проверяем наличие следующей записи (если ее нет, добавляем):

...
[MariaDB]
Description     = ODBC for MariaDB
Driver          = /usr/lib/libmaodbc.so
Driver64        = /usr/lib64/libmaodbc.so
FileUsage       = 1
...

* в данном примере описано подключение к СУБД с драйвером MariaDB и путем до файла с библиотекой (отдельно для 32- и 64-разрядной версии).

Открываем файл:

nano /etc/odbc.ini

Добавляем DSN для подключения к нашему серверу и базе, которую создавали на предыдущем этапе:

[ODBC]
Driver = MariaDB
USER = odbc_user
PASSWORD = odbc_password
Server = 127.0.0.1
Database = my_db
Port = 3306

* где:

ODBC — произвольное название для нашего подключения.

Driver — драйвер, который мы будем использовать. Его мы описали в файле /etc/odbcinst.ini.

USER — пользователь, под которым будем подключаться к базе. Используем данные для ранее созданной учетной записи в mariadb.

PASSWORD — пароль для созданного ранее пользователя, под которым мы будем подключаться к базе.

Server — сервер баз данных. В нашем примере локальный сервер.

Database — имя созданной базы данных.

Port — порт, на котором слушает сервер. 3306 используется по умолчанию для MariaDB.

Пробуем подключиться к базе с использованием ODBC:

isql -v ODBC

* где ODBC — название для подключения, которое мы задали на предыдущем шаге.

Мы должны увидеть командную строку для ввода команд sql — пробуем получить данные из нашей таблицы users:

> select * from users;

Мы должны увидеть что-то на подобие:

+----+--------------+----------------+
| id |     name     |     rights     |
+----+--------------+----------------+
| 1  |    Павел     |      admin     |
| 2  |    Инна      |    superuser   |
| 3  |    Денис     |    operator    |
+----+--------------+----------------+

Можно выходить из sql-оболочки:

> quit

Настройка php

Теперь настроим подключение из php. Мы рассмотрим 2 способа подключения — с помощью odbc_connect и PDO.

Предварительно, создадим каталог, в который разместим тестовый скрипт для подключения к базе:

mkdir -p /var/www/php
odbc_connect

Ставим расширение php-odbc (а также сам php, если его нет на сервере).

yum install php php-odbc -y

После установки создадим скрипт для проверки подключения:

nano /var/www/php/db.php
<?php

    $driver = "DRIVER=MariaDB";
    $server = "127.0.0.1";
    $db_name = "my_db";
    $port = "3306";
    $user = "odbc_user";
    $password = "odbc_password";
    $ocon = odbc_connect("{$driver};Server={$server};Database={$db_name};Port={$port};String Types=Unicode", $user, $password);

    $result = odbc_exec($ocon, "SELECT * FROM users LIMIT 10");
    while ($mass = odbc_fetch_array ($result)) {
        print_r($mass);
    }

    odbc_close($ocon);

?>

* в данном листинге мы задаем параметры для подключения к локальному серверу (127.0.0.1) с учетными данными, которые создали при настройке СУБД. После мы выполняем выборку и выводим результат на экран.

Или же мы можем сократить наш скрипт. Ранее для проверки мы создали ODBC DSN в файле /etc/odbc.ini. PHP с помощью odbc_connect может ссылаться для соединения на него. Итого, получаем:

<?php

    $ocon = odbc_connect("ODBC", "odbc_user", "odbc_password");

    $result = odbc_exec($ocon, "SELECT * FROM users LIMIT 10");
    while ($mass = odbc_fetch_array ($result)) {
        print_r($mass);
    }

    odbc_close($ocon);

?>

* обратите внимание, что мы передаем функции odbc_connect только 3 параметра для подключения:

ODBC — название для нашего DSN. odbc_user — имя пользователя для подключения к базе данных. odbc_password — пароль для подключения к базе.

PDO

Ставим расширение php-pdo (а также сам php, если его нет на сервере).

yum install php php-pdo

После установки создадим скрипт для проверки подключения:

nano /var/www/php/db.php
<?php

    $pcon = new PDO("odbc:Driver=MariaDB;Server=127.0.0.1;Database=my_db;","odbc_user","odbc_password");
 
    try {
        $result = $pcon->query("SELECT * FROM users LIMIT 10");
        $mass = $result->fetchAll(PDO::FETCH_ASSOC);
        print_r($mass);
    } catch (Exception $e){
        throw new PDOException(var_export($pcon->errorInfo(),true));
    }

?>

* в данном листинге мы задаем параметры для подключения к локальному серверу (127.0.0.1) с учетными данными, которые создали при настройке СУБД. После мы выполняем выборку и выводим результат на экран.

Или же мы можем сократить наш скрипт. Ранее для проверки мы создали ODBC DSN в файле /etc/odbc.ini. PHP с помощью PDO может ссылаться для соединения на него. Итого, получаем:

<?php

    $pcon = new PDO("odbc:ODBC","odbc_user","odbc_password");

    try {
        $result = $pcon->query("SELECT * FROM users LIMIT 10");
        $mass = $result->fetchAll(PDO::FETCH_ASSOC);
        print_r($mass);
    } catch (Exception $e){
        throw new PDOException(var_export($pcon->errorInfo(),true));
    }

?>

* обратите внимание, что мы передаем функции PDO только 3 параметра для подключения:

odbc:ODBC — способ соединения с базой и название для нашего DSN.

odbc_user — имя пользователя для подключения к базе данных.

odbc_password — пароль для подключения к базе.

Проверка запроса

После того, как мы создали скрипт проверки любым из вышеописанных способов, запускаем его на исполнение:

php /var/www/php/db.php

Мы должны получить следующий результат:

Array
(
    [id] => 1
    [name] => Павел
    [rights] => admin
)
Array
(
    [id] => 2
    [name] => Инна
    [rights] => superuser
)
Array
(
    [id] => 3
    [name] => Денис
    [rights] => operator
)

Подключение к MariaDB с помощью ODBC настроено.


После открываем файл:

nano /etc/odbc.ini

Задаем новое значение для параметра driver:

driver=MariaDB

* список доступных драйвером можно посмотреть в файле /etc/odbcinst.ini.

Перезапускаем asterisk:

systemctl restart asterisk

После можно проверить, что Asterisk подключился к базе:

asterisk -r
> odbc show

Мы должны увидеть:

ODBC DSN Settings
-----------------

  Name:   asteriskcdrdb
  DSN:    MySQL-asteriskcdrdb
    Number of active connections: 1 (out of 5)
    Logging: Disabled

Возможные проблемы

Рассмотрим решение некоторых проблем, с которыми мы можем столкнуться в процессе настройки.

Can't open PID file /var/run/asterisk/asterisk.pid (yet?) after start: No such file or directory

Ошибка отображается при просмотре статуса сервиса, сразу после его запуска:

systemctl status asterisk

...
... systemd[1]: asterisk.service: Can't open PID file /var/run/asterisk/asterisk.pid (yet?) after start: No such file or directory
... 

Данное сообщение не является ошибкой. Скорее, это сообщение от системы при запуске.

Убедиться в наличие данного файла можно командой:

ls -l /var/run/asterisk/asterisk.pid

Мы должны увидеть:

-rw-r--r--. 1 asterisk asterisk 6 Nov  5 09:45 /var/run/asterisk/asterisk.pid

* где видно, что файл существует. Его владелец — пользователь asterisk.

Ошибка 500 при попытке установить FreePBX 14 на CentOS 8

Ошибка появляется при попытке открыть страницу FreePBX в браузере.

Причина: официально, FreePBX 14 поддерживает php 5, которая по умолчанию уже не устанавливается в CentOS 8. В php версии 7 один из методов класса gui_hidden считается устаревшим и система возвращает ошибку 500.

Решение: есть 2 варианта решения проблемы.

1) установить на CentOS 8 php версии 5.6. Для этого подключаем репозиторий remi:

dnf install http://rpms.remirepo.net/enterprise/remi-release-8.rpm

После чего можно устанавливать необходимые компоненты:

dnf install php56 php56-php-fpm php56-php-bcmath php56-php-gd php56-php-json php56-php-mbstring php56-php-mysqlnd php56-php-pear php56-php-snmp php56-php-zip

Открываем настройки для php:

nano /etc/opt/remi/php56/php.ini

Правим значения для следующих опций:

upload_max_filesize = 128M
...
post_max_size = 128M
...
date.timezone = "Europe/Moscow"
...
memory_limit = 512M

Открываем настройки php-fpm:

nano /etc/opt/remi/php56/php-fpm.d/www.conf

Задаем значения для следующих опций:

user = asterisk
...
group = asterisk
...
listen.acl_users = asterisk,apache

Запускаем php-fpm:

systemctl enable php56-php-fpm --now

Откроем настройки nginx:

nano /etc/nginx/nginx.conf

Для опции fastcgi_pass задаем значение:

        ...
        location ~ \.php$ {
            ...
            fastcgi_pass unix:/var/opt/remi/php56/run/php-fpm/www.sock;
            ...

А также:

nano /etc/nginx/conf.d/php-fpm.conf
upstream php-fpm {
        server unix:/var/opt/remi/php56/run/php-fpm/www.sock;
}

Перезапускаем nginx:

systemctl restart nginx

Также потребовалось установить следующий модуль для FreePBX:

fwconsole ma downloadinstall soundlang

2) отключить отображение ошибки. Для этого открываем файл:

nano /etc/freepbx.conf

И добавляем строку:

...
$bootstrap_settings['freepbx_error_handler'] = false;
...

Однако, у меня данный способ не дал положительного результата. Страница FreePBX открылась, но с ошибкой «Can Not Connect to Asterisk», а сервис fwconsole при запуске выдавал ошибку. В итоге, самый правильный вариант — использовать официально поддерживаемую версию PHP.