Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
astpanel:optimization [2019/08/05 08:24] apor |
astpanel:optimization [2019/12/16 11:11] (текущий) apor [Настройка Nginx] |
||
---|---|---|---|
Строка 3: | Строка 3: | ||
===== Оптимизация запросов GetVar ===== | ===== Оптимизация запросов GetVar ===== | ||
+ | Для получения расширенных данных по телефонному звонку панель телефонии активно запрашивает информацию по каналам, существующим на телефонной станции. | ||
+ | |||
+ | По умолчанию, панель телефонии пыталась обратиться через [[https://wiki.asterisk.org/wiki/x/aIFJ | AJAM]] интерфейс к Aterisk. Но со временем стало ясно, что время ответа сервера увеличивается с увеличением количества одновременных звонков, и увеличением количества клиентских соединений со стороны 1С:Предприятие. | ||
+ | |||
+ | Следующим витком развития механизма было описание дополнительного HTTP сервиса, работа которого осуществляется в обход AJAM интерфейса. Для FreePBX это ресурс: **http://127.0.0.1/admin/1c/getvar/index.php?event=Ping**. Производительность этого варианта работы оказалась выше, но при крупных внедрениях и ее оказалось мало. Вот пример нагрузочного теста: | ||
+ | |||
+ | <code>ab -c 400 -n 10000 'http://127.0.0.1/admin/1c/getvar/index.php?event=Ping' | ||
+ | This is ApacheBench, Version 2.3 <$Revision: 1430300 $> | ||
+ | Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ | ||
+ | Licensed to The Apache Software Foundation, http://www.apache.org/ | ||
+ | |||
+ | Benchmarking 127.0.0.1 (be patient) | ||
+ | Completed 1000 requests | ||
+ | Completed 2000 requests | ||
+ | Completed 3000 requests | ||
+ | Completed 4000 requests | ||
+ | Completed 5000 requests | ||
+ | Completed 6000 requests | ||
+ | Completed 7000 requests | ||
+ | Completed 8000 requests | ||
+ | Completed 9000 requests | ||
+ | |||
+ | apr_pollset_poll: The timeout specified has expired (70007) | ||
+ | Total of 9985 requests completed</code> | ||
+ | |||
+ | Видно, что сервер просто "**упал**" и все 10000 запросов обработать не в состоянии, обработка 9985 запросов заняла более минуты. | ||
+ | |||
+ | В текущей статье описывается вариант оптимизации, позволяющий многократно увиличить пропускную способность. В искуственном тесте **10000** запросов обрабатывается за **1.456** секунды. | ||
==== Настройка Nginx ==== | ==== Настройка Nginx ==== | ||
Строка 12: | Строка 40: | ||
</code> | </code> | ||
- | Правим порт в конфиг **[[https://files.miko.ru/s/8N4KeY805dN61m3 | /etc/nginx/nginx.conf]]**. Параметр "**listen**". | + | Правим порт в конфиг **[[https://files.miko.ru/s/dnrxCWZG6hrjbXk | /etc/nginx/nginx.conf]]**. Параметр "**listen**". |
<code> | <code> | ||
+ | |||
user nginx; | user nginx; | ||
worker_processes 1; | worker_processes 1; | ||
Строка 19: | Строка 48: | ||
pid /var/run/nginx.pid; | pid /var/run/nginx.pid; | ||
load_module modules/ndk_http_module.so; | load_module modules/ndk_http_module.so; | ||
- | load_module modules/ngx_http_lua_module.so; | + | load_module "modules/ngx_http_lua_module.so"; |
events { | events { | ||
Строка 31: | Строка 60: | ||
keepalive_timeout 65; | keepalive_timeout 65; | ||
server { | server { | ||
- | listen 89; | + | listen 23600; |
server_name localhost; | server_name localhost; | ||
location /pbxcore/api/miko_ajam/getvar { | location /pbxcore/api/miko_ajam/getvar { | ||
+ | default_type 'text/plain'; | ||
+ | content_by_lua_file /etc/nginx/http_get_variables.lua; | ||
+ | keepalive_timeout 0; | ||
+ | } | ||
+ | location /admin/1c/getvar/index.php { | ||
default_type 'text/plain'; | default_type 'text/plain'; | ||
content_by_lua_file /etc/nginx/http_get_variables.lua; | content_by_lua_file /etc/nginx/http_get_variables.lua; | ||
Строка 43: | Строка 77: | ||
</code> | </code> | ||
- | Заливаем файл на сервер **[[https://files.miko.ru/s/TPmJxuX5mZCZfRc | /etc/nginx/http_get_variables.lua]]** | + | Заливаем файл на сервер **[[https://files.miko.ru/s/fjCXEdFUd7fQ6La | /etc/nginx/http_get_variables.lua]]** |
Устанавливаем права доступа к файлу | Устанавливаем права доступа к файлу | ||
<code>chown nginx:nginx /etc/nginx/http_get_variables.lua | <code>chown nginx:nginx /etc/nginx/http_get_variables.lua | ||
Строка 61: | Строка 95: | ||
Смотрим статус сервера: | Смотрим статус сервера: | ||
<code>systemctl status nginx.service</code> | <code>systemctl status nginx.service</code> | ||
- | |||
==== Проверка работы сервиса ==== | ==== Проверка работы сервиса ==== | ||
Из локальной консоли выполните команду: | Из локальной консоли выполните команду: | ||
- | <code>curl -u admin:secret 'http://127.0.0.1:89/pbxcore/api/miko_ajam/getvar?event=Ping'</code> | + | <code>curl -u admin:secret 'http://127.0.0.1:23600/pbxcore/api/miko_ajam/getvar?event=Ping'</code> |
Должен вернуть: | Должен вернуть: | ||
<code>true</code> | <code>true</code> | ||
Строка 72: | Строка 105: | ||
Дополнительная проверка получения переменных канала: | Дополнительная проверка получения переменных канала: | ||
- | <code>curl -u admin:secret 'http://127.0.0.1:89/pbxcore/api/miko_ajam/getvar?channel=SIP/201-00000009&variables=CDR(linkedid),EXTEN'</code> | + | <code>curl -u admin:secret 'http://127.0.0.1:23600/pbxcore/api/miko_ajam/getvar?channel=SIP/201-00000009&variables=CDR(linkedid),EXTEN'</code> |
Должен венуть: | Должен венуть: | ||
<code>New Structure("Result", true)</code> | <code>New Structure("Result", true)</code> | ||
Строка 78: | Строка 111: | ||
<code>New Structure("Result,Msg", false, "AMI auth failed...")</code> | <code>New Structure("Result,Msg", false, "AMI auth failed...")</code> | ||
- | Не забудьте открыть на фаерволе порт 89. | + | Тест производительности: |
+ | <code>[root@freepbx ~]# ab -c 400 -n 10000 'http://127.0.0.1:23600/pbxcore/api/miko_ajam/getvar?event=Ping' | ||
+ | This is ApacheBench, Version 2.3 <$Revision: 1430300 $> | ||
+ | Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ | ||
+ | Licensed to The Apache Software Foundation, http://www.apache.org/ | ||
+ | |||
+ | Benchmarking 127.0.0.1 (be patient) | ||
+ | Completed 1000 requests | ||
+ | Completed 2000 requests | ||
+ | Completed 3000 requests | ||
+ | Completed 4000 requests | ||
+ | Completed 5000 requests | ||
+ | Completed 6000 requests | ||
+ | Completed 7000 requests | ||
+ | Completed 8000 requests | ||
+ | Completed 9000 requests | ||
+ | Completed 10000 requests | ||
+ | Finished 10000 requests | ||
+ | |||
+ | |||
+ | Server Software: nginx/1.15.7 | ||
+ | Server Hostname: 127.0.0.1 | ||
+ | Server Port: 23600 | ||
+ | |||
+ | Document Path: /pbxcore/api/miko_ajam/getvar?event=Ping | ||
+ | Document Length: 30 bytes | ||
+ | |||
+ | Concurrency Level: 400 | ||
+ | Time taken for tests: 1.216 seconds | ||
+ | Complete requests: 10000 | ||
+ | Failed requests: 0 | ||
+ | Write errors: 0 | ||
+ | Total transferred: 1730000 bytes | ||
+ | HTML transferred: 300000 bytes | ||
+ | Requests per second: 8225.49 [#/sec] (mean) | ||
+ | Time per request: 48.629 [ms] (mean) | ||
+ | Time per request: 0.122 [ms] (mean, across all concurrent requests) | ||
+ | Transfer rate: 1389.66 [Kbytes/sec] received | ||
+ | |||
+ | Connection Times (ms) | ||
+ | min mean[+/-sd] median max | ||
+ | Connect: 0 18 119.3 4 1008 | ||
+ | Processing: 4 13 15.0 12 626 | ||
+ | Waiting: 1 10 15.0 9 621 | ||
+ | Total: 8 31 126.0 15 1208 | ||
+ | |||
+ | Percentage of the requests served within a certain time (ms) | ||
+ | 50% 15 | ||
+ | 66% 16 | ||
+ | 75% 16 | ||
+ | 80% 17 | ||
+ | 90% 19 | ||
+ | 95% 21 | ||
+ | 98% 27 | ||
+ | 99% 1019 | ||
+ | 100% 1208 (longest request) | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Не забудьте открыть на фаерволе порт 23600. | ||
Например для iptables под управлением CENTOS это делается добавлением строчки в файл /etc/sysconfig/iptables | Например для iptables под управлением CENTOS это делается добавлением строчки в файл /etc/sysconfig/iptables | ||
<code> | <code> | ||
- | -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 89 -j ACCEPT | + | -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 23600 -j ACCEPT |
</code> | </code> | ||
[[:astpanel|Обратно к инструкциям...]] | [[:astpanel|Обратно к инструкциям...]] |