Установка Apache JMeter в Ubuntu

Apache JMeter — инструмент для нагрузочного тестирования.

Для Apache JMeter необходимо установить Java, смотрите мою статью — Установка Java в Linux.

Для примера установлю Apache JMeter в Ubuntu Desktop 18.04.

После того как Java установлен, скопируем ссылку на архив с последней версией Apache JMeter с официального сайта http://jmeter.apache.org/download_jmeter.cgi и скачаем его:

wget http://apache.volia.net//jmeter/binaries/apache-jmeter-4.0.tgz

Распакуем архив:

tar -xf apache-jmeter-4.0.tgz

Запустим:

cd apache-jmeter-4.0/bin/
./jmeter

После запуска отобразилось сообщение, что в графическом режиме Apache JMeter можно создавать тесты, а выполнять их можно только из терминала, например так:

jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]

Кстати Apache JMeter в Windows запускается через файл jmeter.bat.

Перенаправление запросов на SSL

Опишу несколько вариантов перенаправления запросов с HTTP на HTTPS, первый и второй методы самые надежные:

1) Через virtual hosts.
В конфигурации сайта добавим строку Redirect, например когда на сайт установили SSL сертификат и нужно перенаправить все запросы на HTTPS:

NameVirtualHost *:80
<VirtualHost *:80>
   ServerName ixnfo.com
   ServerAlias www.ixnfo.com
   Redirect / https://ixnfo.com/
</VirtualHost>

<VirtualHost *:443>
   ServerName ixnfo.com
   ServerAlias www.ixnfo.com
   DocumentRoot /var/www/html
   SSLEngine On
   ...
</VirtualHost>

Если нужно перенаправить только некоторые запросы:

NameVirtualHost *:80
<VirtualHost *:80>
   ServerName ixnfo.com
   ServerAlias www.ixnfo.com
   Redirect /forum https://forum.ixnfo.com/
</VirtualHost>

<VirtualHost *:443>
   ServerName ixnfo.com
   ServerAlias www.ixnfo.com
   DocumentRoot /var/www/html
   SSLEngine On
   ...
</VirtualHost>

2) Перенаправление с использованием .htaccess.
Аналогично как и в первом варианте, в нужную директорию сайта положим файл .htaccess и добавим в него строку (чтобы веб-сервер учитывал файл .htaccess, нужно в конфигурации сайта выше указать опцию AllowOverride All):

Redirect /forum https://forum.ixnfo.com/

3) И не рекомендуемый способ, используя mod_rewrite, содержимое нужно добавить в файл .htaccess:

# Включение функции Rewrite
RewriteEngine On
# Проверяем что соединение не HTTPS
RewriteCond %{HTTPS} !=on
# Направляем в то же место, но уже HTTPS:
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Еще пример:

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_USER_AGENT} ^(.+)$
RewriteCond %{SERVER_NAME} ^ixnfo\.com$ [OR]
RewriteCond %{SERVER_NAME} ^www\.ixnfo\.com$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
Header add Strict-Transport-Security "max-age=300"
</IfModule>

Чтобы разрешить некоторым страницам открываться по http и https, добавим внутри верхнего примера:

RewriteCond %{REQUEST_URI} !^/dir/
RewriteCond %{REQUEST_URI} !^/dir/file.php

Смотрите также:
Использование .htaccess
Как настроить SSL и HTTPS для WordPress
Установка Certbot в Ubuntu

Контроль доступа Apache2

Контроль доступа Apache2 версии 2.4 немного отличается от 2.2, например чтобы разрешить доступ всем, в версии 2.4 нужно указывать:

Require all granted

Разрешить доступ указанным IP-адресам:

Require local
Require ip 192.168.56.1 192.168.22.10

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

Require all granted
Require not ip 192.168.56.1

Разрешить указанному хосту:

Require host example.com

Запретить всем:

Require all denied

А в версии Apache2 2.2, разрешить доступ всем так:

Order allow,deny
Allow from all

Запретить всем:

Order deny,allow
Deny from all

Разрешить доступ указанным IP:

Order allow,deny
Allow from 192.168.56.1 192.168.22.10

Разрешить указанному хосту:

Order Deny,Allow
Deny from all
Allow from example.com

После изменений в конфигурации Apache2 необходима перезагрузка (если изменения были в файле .htaccess, то перезагрузка не требуется):

sudo service apache2 restart

Смотрите также:
Использование .htaccess

Решение ошибки Invalid command ‘RewriteEngine’

Заметил однажды ошибку после установки FreePBX:

Invalid command ‘RewriteEngine’, perhaps misspelled or defined by a module not included in the server configuration

Для её решения нужно активировать модуль rewrite в apache2:

sudo a2enmod rewrite

И перезапустить apache2 чтобы применились изменения:

sudo service apache2 restart

Все.

Решение ошибки «Invalid command ‘AuthGroupFile'»

Заметил однажды следующую ошибку:

AH00526: Syntax error on line 26 of /etc/apache2/sites-enabled/000-default.conf:
Invalid command ‘AuthGroupFile’, perhaps misspelled or defined by a module not included in the server configuration
Action ‘configtest’ failed.
The Apache error log may have more information.

Решается она просто активацией модуля:

sudo a2enmod authz_groupfile

Перезапустим apache2 чтобы применить изменения:

sudo service apache2 restart

Готово.

Решение ошибки «client denied by server configuration»

Заметил однажды в браузере ошибку открытия установленного GoIP SMS крипта:

[authz_core:error] [pid 23415] [client 192.168.56.1:50388] AH01630: client denied by server configuration: /usr/local/goip/

Как оказалось работа скрипта предполагалась в apache2 версии 2.2 и в файле /etc/apache2/conf-enabled/goip.conf были указаны параметры:

Order allow,deny
Allow from all

А в моем случае был установлен apache2 версии более новой 2.4, в котором управление доступом настраивается немного иначе, и чтобы устранить ошибку изменим указанные выше параметры на:

Require all granted

Либо чтобы ограничить доступ оп IP, разрешив локально и указанным адресам:

Require local
Require ip 192.168.56.1 192.168.22.10

И перезапустим apache2 чтобы применить изменения:

sudo service apache2 restart

Смотрите также:
Контроль доступа Apache2

Решение ошибки Permission denied: .htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable

Заметил как-то следующую ошибку:

[Mon Sep 05 10:24:38 2016] [crit] [client 192.168.1.1] (13)Permission denied: /home/user/public_html/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable

До появлением ошибки я перемещал файлы через sudo (от root пользователя) и чтобы вернуть права выполнил команду:

sudo chown user:user -R /home/user/public_html

Которая изменила владельца на указанного во всех подпапках и файлах, однако на саму директорию public_html (не её содержимое) должен был быть указан другой владелец, из-за чего apache2 и писал что доступ запрещен. По этому если указать на public_html пользователя и группу от которого работает apache2, то ошибка исчезнет.
Может также помочь указание прав 777 на эту папку, это даст полный доступ всем пользователям (но этот вариант лучше не использовать в целях безопасности).

Мониторинг параметров Apache2 в Zabbix

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

sudo apt-get install curl

Активируем модуль информации об apache2 (обычно он активирован изначально):

sudo a2enmod info

Откроем файл конфигурации модуля и укажем IP-адрес zabbix сервера чтобы разрешить ему просмотр информации об apache2 (если apache2 на локальной машине, то доступ обычно разрешен, указанием local или 127.0.0.1):

sudo nano /etc/apache2/mods-enabled/status.conf

В редакторе nano CTRL+X используются для выхода и y/n для сохранения или отмены изменений. Пример указания IP:

<Location /server-status>
    SetHandler server-status
    Require local
    Require ip 192.168.1.5
</Location>

Перезапустим web-сервер чтобы применить изменения:

sudo service apache2 restart

Теперь информация об apache2 доступна через браузер по ссылке http://HOST/server-status

Перейдем к Zabbix. Создадим папку для скриптов если ее нету:

mkdir /etc/zabbix/scripts/
chown root:zabbix -R /etc/zabbix/scripts/
chmod 750 /etc/zabbix/scripts/

В файле конфигурации zabbix сервера укажем путь к этой папке:

sudo nano /etc/zabbix/zabbix_server.conf
ExternalScripts=ПУТЬ

Теперь приведу содержимое самого скрипта:

#!/bin/bash
if [[ -z "$1" || -z "$2" || -z "$3" ]]; then
  exit 1
fi
##### PARAMETERS #####
RESERVED="$1"
METRIC="$2"
URL="$3"
STATSURL="${URL}?auto"
#
CACHE_TTL="55"
CACHE_FILE="/tmp/zabbix.apache2.`echo ${URL} | md5sum | cut -d" " -f1`.cache"
EXEC_TIMEOUT="2"
NOW_TIME=`date '+%s'`
##### RUN #####
if [ -s "${CACHE_FILE}" ]; then
  CACHE_TIME=`stat -c"%Y" "${CACHE_FILE}"`
else
  CACHE_TIME=0
fi
DELTA_TIME=$((${NOW_TIME} - ${CACHE_TIME}))
#
if [ ${DELTA_TIME} -lt ${EXEC_TIMEOUT} ]; then
  sleep $((${EXEC_TIMEOUT} - ${DELTA_TIME}))
elif [ ${DELTA_TIME} -gt ${CACHE_TTL} ]; then
  echo "" >> "${CACHE_FILE}" # !!!
  DATACACHE=`curl -sS --insecure --max-time ${EXEC_TIMEOUT} "${STATSURL}" 2>&1`
  echo "${DATACACHE}" > "${CACHE_FILE}" # !!!
  echo "URL=${URL}"  >> "${CACHE_FILE}" # !!!
  chmod 640 "${CACHE_FILE}"
fi
#
if [ "${METRIC}" = "accesses" ]; then
  cat "${CACHE_FILE}" | grep -i "accesses" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "kbytes" ]; then
  cat "${CACHE_FILE}" | grep -i "kbytes" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "cpuload" ]; then
  cat "${CACHE_FILE}" | grep -i "cpuload" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "uptime" ]; then
  cat "${CACHE_FILE}" | grep -i "uptime" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "avgreq" ]; then
  cat "${CACHE_FILE}" | grep -i "ReqPerSec" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "avgreqbytes" ]; then
  cat "${CACHE_FILE}" | grep -i "BytesPerReq" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "avgbytes" ]; then
  cat "${CACHE_FILE}" | grep -i "BytesPerSec" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "busyworkers" ]; then
  cat "${CACHE_FILE}" | grep -i "BusyWorkers" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "idleworkers" ]; then
  cat "${CACHE_FILE}" | grep -i "idleworkers" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "totalslots" ]; then
  cat "${CACHE_FILE}" | grep -i "Scoreboard" | cut -d':' -f2 | sed -e 's/ //g' | wc -c | awk '{print $1-1}'
fi
#
exit 0

Сделаем файл скрипта исполняемым:

chown root:zabbix /etc/zabbix/scripts/apache2-status.sh
chmod 550 /etc/zabbix/scripts/apache2-status.sh

Пример проверки скрипта:

sudo -u zabbix /etc/zabbix/scripts/apache2-status.sh none accesses http://HOST/server-status

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

sudo nano /etc/zabbix/zabbix_agentd.conf

И укажем следующие параметры:

UserParameter=apache2[*],/etc/zabbix/scripts/apache2-status.sh "none" "$1" "$2"

Некоторыми командами можно посмотреть количество процессов apache2 и соединений на 80 порт, для этого не нужен скрипт, например можно еще указать:

UserParameter=apache2.count_processes,ps aux | grep apache | wc -l
UserParameter=connections_on_80_port,netstat -na | grep :80 | wc -l

Перезапустим zabbix агент чтобы применить изменения:

sudo /etc/init.d/zabbix-agent restart

Проверим:

zabbix_get -s 127.0.0.1 -k "apache2[accesses,http://HOST/server-status]"

Теперь создадим шаблон и добавим элементы данных, пример создаваемых элементов данных:

apache2[КЛЮЧ,http://HOST/server-status]

Экспортировал готовый шаблон — apache2-status

К наблюдаемому хосту также обязательно добавим макрос:

Макрос: {$APACHE_STATS_URL}
Значение: http://HOST/server-status

Готово.

Количество процессов apache2 можно получать от Zabbix-агента создав на Zabbix-сервере элемент данных с ключом:

proc.num[apache2]

Понижение версии Apache 2.4 до 2.2

Пришлось как-то раз понизить чтобы заработал веб-интерфейс биллинга ABillS.

Для начала любой из команд удалим apache2 если он установлен:

sudo aptitude remove apache2
sudo apt-get remove apache2

Создадим файл в папке /etc/apt/sources.list.d/:

sudo nano /etc/apt/sources.list.d/ubuntu1204.list

Вставим в него текст:

deb http://ru.archive.ubuntu.com/ubuntu/ precise main

Создадим еще файл:

sudo nano /etc/apt/preferences.d/apache22

Вставим в него содержимое:

Package: apache*
Pin: release a=precise
Pin-Priority: 500

Выполним:

sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install apache2

Все.