Speedtest on premise

  • Tutorial

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

Один из лучших инструментов — iperf. Но если речь не идет о точной диагностике, он сложен для рядового пользователя, да и непрофильному ИТ специалисту потребуется время «включиться» и вспомнить, как он работает. Интернет-спидометры подходят плохо, т. к. показывают характеристики Интернет-подключения к какому-то внешнему серверу, и никак не отражают состояние напр., гигабитного линка ПК от какого-то корпуса до вашего ЦОД. Ookla предлагает вариант self-hosted ноды speedtest. Ранее удобный для локального развертывания Speedtest mini сейчас не поддерживается и заменен на Speedtest Custom, являющийся закрытым продуктом. Подписка для включения всех функций стоит $1995/год для 1-го сервера. Копирование файла - метод совсем грубый, т. к. засекать время неудобно, вмешивается антивирус и кэш при копировании повторном или в обратную сторону. Частично помогает программа LAN Speed Test, бесплатной Lite версии которой для оценки достаточно. Но хочется чего-то простого, универсального, без дополнительного ПО на клиенте и открытого.

На сайте Awesome Open Source попался проект Librespeed. Self-hosted, HTML5, PHP, одно- и многосерверные конфигурации, статистика, легко ставится и настраивается, работает на разных дистрибутивах или в контейнере. Стандартный интерфейс можно посмотреть на https://librespeed.org/

  • Достоинства: очень просто, быстро, наглядно; ведется статистика.

  • Недостатки: как и любой веб-спидометр, годится только для оценки, не подходит для глубокого анализа; измеряет L7 (HTTP(S)), а не L2 (Ethernet подключение).

Веб-спидометр не покажет скорость Ethernet-линка. Особенности tcp/ip описаны, напр., в статье «Как получить и измерить высокоскоростное соединение по TCP», сюда добавляется влияние самого HTTP, веб-сервера, браузера и, при использовании, шифрования. "Ping" в случае с http сущность также синтетическая и т.д. В корпоративной сети уточняйте свои настройки прокси-сервера, чтобы измерять скорость от клиента, а не от прокси. :)

Содержание

  1. Установка (Apache).

  2. Установка nginx (на выбор).

  3. Настройка БД статистики.

  4. Создание БД.

  5. Создание в БД таблицы.

  6. Настройка подключения к БД.

  7. Настройка брандмауэра.

  8. Запуск Апача.

  9. Первый запуск.

  10. Персонализация.

  11. Очистка.

Подробная информация - на странице проекта, ниже инструкция по запуску на CentOS 7 и Apache, с сохранением телеметрии в MariaDB. Добавлена глава для любитетелей nginx.

На чистой ОС в минимальной установке (до)настраиваем сеть, выполняем обновление, для ВМ устанавливаем гостевого агента виртуализации. SELinux и брандмауэр отключать не нужно!

Установка (Apache)

Нам потребуются следующие пакеты:

$ sudo yum install vim git httpd php php-gd php-mysql mariadb-server mod_ssl

Загружаем проект, делаем архивную копию и копируем файлы веб-сервера:

$ cd /opt/ && sudo git clone https://github.com/librespeed/speedtest/

$ sudo tar czf /opt/speedtest.`date +%F`.tgz /opt/speedtest/

$ sudo cp -RZ /opt/speedtest/* /var/www/html/

В php.ini нужно увеличить значение переменной post_max_size до 20 МиБ или выше

$ sudo vim /etc/php.ini

post_max_size = 20M

На этом для Апача настройка почти завершена.

Установка (nginx, на выбор)

Настройка Энжинэкса немного сложнее. Настройки подсмотрены здесь.

Установка дополнительных пакетов:

$ sudo yum install nginx php-fpm

Делаем резервные настройки:

$ sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.`date +%F`

$ sudo cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.`date +%F`

$ sudo cp /etc/php.ini /etc/php.ini.`date +%F`

Меняем секцию {server} nginx

$ sudo vim /etc/nginx/nginx.conf

server { listen 8080; listen [::]:8080; server_name _; root /opt/speedtest; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { index index.html index.htm index.php; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }

Аналогично для PHP-FPM

$ sudo vim /etc/php.ini

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; http://php.net/cgi.fix-pathinfo cgi.fix_pathinfo=0

$ sudo vim /etc/php-fpm.d/www.conf

; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx

Дополнительно

$ sudo firewall-cmd --permanent --add-port=8080/tcp

$ sudo firewall-cmd --reload

$ sudo systemctl --now enable php-fpm.service nginx.service

В этом случае предполагается, что корень сайта нашего спидометра остается в /opt/speedtest, модификация файлов должна производиться там и при очистке удалять каталог не следует. В качестве эксперимента можно поставить оба веб-сервера. ))

Настройка БД статистики

Если статистика не нужна, шаг можно пропустить.

БД можно не плодить, а использовать уже имеющуюся на другом сервере. Настройки будут немного отличаться. Ниже инструкция для полностью автономной установки с локальной БД.

$ sudo systemctl enable mariadb.service

$ sudo systemctl start mariadb.service

$ sudo mysql_secure_installation

Вывод программы настройки

Enter current password for root (enter for none): <Enter>

Set root password? [Y/n] <Enter>

New password: <EnterYourNewPasswordHere>

Re-enter new password: <RepeatYourNewPasswordHere>

Remove anonymous users? [Y/n] <Enter>

Disallow root login remotely? [Y/n] <Enter>

Remove test database and access to it? [Y/n] <Enter>

Reload privilege tables now? [Y/n] <Enter>

Создание БД

$ mysql -u root -p

MariaDB [(none)]> CREATE SCHEMA stats;

MariaDB [(none)]> USE stats;

MariaDB [stats]> CREATE USER 'my_user'@'localhost' IDENTIFIED BY 'myReallyStrongPA$$';

Query OK, 0 rows affected (0.00 sec)

MariaDB [stats]> GRANT ALL PRIVILEGES ON stats.* TO 'my_user'@'localhost';

Query OK, 0 rows affected (0.00 sec)

MariaDB [stats]> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.00 sec)

^d

MariaDB [stats]> Bye

Создание в БД таблицы

$ mysql -u my_user -pmyReallyStrongPA\$\$ stats < /var/www/html/results/telemetry_mysql.sql

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

Настройка подключения к БД

$ sudo vim /var/www/html/results/telemetry_settings.php

В конфиге меняем 5 параметров:

$stats_password = 'myP@$$';

$MySql_username = 'my_user';

$MySql_password = 'myReallyStrongPA$$';

$MySql_hostname = 'localhost';

$MySql_databasename = 'stats';

Полное содержание конфигурационного файла

<?php

// Type of db: "mysql", "sqlite" or "postgresql"

$db_type = 'mysql';

// Password to login to stats.php. Change this!!!

$stats_password = 'myP@$$';

// If set to true, test IDs will be obfuscated to prevent users from guessing URLs of other tests

$enable_id_obfuscation = false;

// If set to true, IP addresses will be redacted from IP and ISP info fields, as well as the log

$redact_ip_addresses = false;

// Sqlite3 settings

$Sqlite_db_file = '../../speedtest_telemetry.sql';

// Mysql settings

$MySql_username = 'my_user';

$MySql_password = 'myReallyStrongPA$$';

$MySql_hostname = 'localhost';

$MySql_databasename = 'stats';

$MySql_port = '3306';

// Postgresql settings

$PostgreSql_username = 'USERNAME';

$PostgreSql_password = 'PASSWORD';

$PostgreSql_hostname = 'DB_HOSTNAME';

$PostgreSql_databasename = 'DB_NAME';

Выходим с сохранением — Shift+zz.

Настройка брандмауэра

$ sudo firewall-cmd --add-service=http --add-service=https --permanent

$ sudo firewall-cmd --reload

$ sudo firewall-cmd --list-all

Запуск Апача

$ sudo chown -R apache:apache /var/www/html/

$ sudo systemctl --now enable httpd.service

Далее рекомендуется заменить самоподписанный сертификат на выпущенный в вашем центре сертификации.

Первый запуск

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

http://<hostname-or-ip>/example-singleServer-basic.html

Страница статистики

http://<hostname-or-ip>/results/stats.php

Персонализация теста

В комплекте идет несколько шаблонов

Шаблоны LibreSpeed
Шаблоны LibreSpeed
Вот некоторые из них:

example-singleServer-full.html

example-singleServer-chart.html

example-singleServer-progressBar.html

example-singleServer-pretty.html

$ sudo cp /var/www/html/example-singleServer-full.html /var/www/html/index.html

В ней можно подкрутить заголовки, добавить «перевод» и пр.

$ sudo vim /var/www/html/index.html

"Локализация"

Слева указаны номера строк (актуальны на момент написания статьи):

162 content:"Start"; -> Начать

165 content:"Abort"; -> Прервать

276 <title>LibreSpeed Example</title> -> Мой супер тест

279 <h1>LibreSpeed Example</h1> -> Сетевой спидометр ООО АБВ

282 <a class="privacy" href="#" onclick="I('privacyPolicy').style.display=''">Privacy</a> -> dd (удалить)

286 <div class="testName">Ping</div> -> Задержка

291 <div class="testName">Jitter</div> -> Дрожжание

298 <div class="testName">Download</div> -> Загрузка

304 <div class="testName">Upload</div> -> Выгрузка

288, 293 <div class="unit">ms</div> -> Мб/с

301, 307 <div class="unit">Mbps</div> -> Мб/с

Для «серых» IP-адресов преобразование IP to geo работать не будет и оно нам не интересно. В локальной сети полезнее получить имя хоста.

$ sudo vim /var/www/html/backend/getIP.php

Строки 57, 62 и 67

return 'private IPv4 access';

дополнить функцией gethostbyaddr до

return 'private IPv4 access (' . gethostbyaddr ($ip) . ')';

В редакторе vim это можно сделать по всему тексту командой

:%s/return 'private IPv4 access';/return 'private IPv4 access (' . gethostbyaddr ($ip) . ')';/g

Очистка

Для повышения безопасности и просто аккуратности установки целесообразно удалить более не используемые файлы:

$ sudo rm -rf /opt/speedtest/ /var/www/html/docker/

$ sudo rm -f /var/www/html/example*html /var/www/html/results/telemetry*sql

На этом все, долгого аптайма и стабильной работы!

Комментарии 6

    0
    «Один из лучших инструментов — iperf. Но если речь не идет о точной диагностике, он сложен для рядового пользователя» Куда уж проще: iperf3 -s с одной стороны и iperf3 -c server_ip
      0
      1. Да, это просто. Для нас с вами. Я Вам завидую, если все ваши пользователи без труда смогут запустить командную строку, скопировать программу, запустить с параметрами, внятно интерпретировать результат, да еще и поделиться им. ))
      2. И iperf -s тоже где-то надо запустить, что не каждому пользователю позволено.
      3. Была попытка запустить пункт 2 демоном. Но, в силу пункта 1, оно не прижилось…
        0
        iperf открывает udp порт выше 1024, что разрешено в 99% случаев обычному пользователю.
          0
          На машине в ЦОДе? Вероятно, у Вас иначе, но мы не можем позволить себе такую роскошь и разрешить всем пользователям запускать любые программы на серверах.
          Запускать у соседа? И что они измерят? :)
            0

            Чем отличается ваш софт от iperf?

        0
        Засеките время, затраченное службой ТП и пользователем на запуск и интерпретацию iperf'а. Умножьте на количество пользователей с жалобами. Потом на количество дней. Переведите в деньги, которые теряет бизнес. Это как пример.
        iperf — прекрасный инструмент, но не для них.
        Да, для небольшой конторы в 3-4-5 десятков человек Librespeed не более чем игрушка.

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

        Самое читаемое