В производственной среде часто бывает нужно быстро оценить скорость сетевого подключения в локальной сети.
Один из лучших инструментов — 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 сущность также синтетическая и т.д. В корпоративной сети уточняйте свои настройки прокси-сервера, чтобы измерять скорость от клиента, а не от прокси. :)
Содержание
Подробная информация - на странице проекта, ниже инструкция по запуску на 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
Персонализация теста
В комплекте идет несколько шаблонов
Вот некоторые из них:
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
На этом все, долгого аптайма и стабильной работы!
Yurets_Ogurets
«Один из лучших инструментов — iperf. Но если речь не идет о точной диагностике, он сложен для рядового пользователя» Куда уж проще: iperf3 -s с одной стороны и iperf3 -c server_ip