Установка модуля PageSpeed

На тесте утановлю модуль PageSpeed в Ubuntu Server 14.04.5 LTS и CentOS

Страница загрузки с разными версиями модуля https://modpagespeed.com/doc/download
https://developers.google.com/speed/pagespeed/module/

И так, скачаем стабильную версию для Debian/Ubuntu:

sudo wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_amd64.deb

Или для CentOS/Fedora:

https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_x86_64.rpm

Установим в Ubuntu, модуль автоматически активируется:

sudo dpkg -i mod-pagespeed-*.deb
sudo apt-get -f install

В CentOS так:

sudo yum install at
sudo rpm -U mod-pagespeed-*.rpm

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

sudo service apache2 restart
sudo /etc/init.d/apache2 restart

Все, модуль установлен.

Обновлять в дальнейшем он будет вместе с системой командами:

sudo apt-get update
sudo apt-get upgrade

При необходимости деактивировать/активировать модуль можно командами:

sudo a2dismod pagespeed
sudo a2enmod pagespeed

Либо полностью удалить:

sudo apt-get remove mod-pagespeed-stable
sudo yum remove mod-pagespeed-stable

Файлы конфигурации модуля находятся по адресам:
etc/apache2/mods-available/pagespeed.conf
/etc/httpd/conf.d/

Решение ошибки 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://ХОСТ/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://ХОСТ/server-status

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

sudo nano /etc/zabbix/zabbix_agentd.conf

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

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

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

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

Проверим:

zabbix_get -s 127.0.0.1 -k "apache2[accesses,http://ХОСТ/server-status]"

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

apache2[КЛЮЧ,http://ХОСТ/server-status]

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

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

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

Все.

Понижение версии 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

Все.

Как включить cURL

Для включения расширения cURL в Linux Ubuntu/Debian необходимо сначала его установить командой:

sudo apt-get install php5-curl

После установки будет создан конфигурационный файл /etc/php5/apache2/conf.d/curl.ini который подгрузит расширение cURL при следующей перезагрузке Apache2 сервера.

Команда для перезагрузки Apache2 сервера:

sudo /etc/init.d/apache2 restart

Рекомендую перезагрузить дважды так как замечал что после установки и одной перезагрузки Apache2, расширение не загрузилось.

В Windows системах cURL обычно идет в комплекте с PHP и для включения необходимо раскомментировать строку extension=php_curl.dll в файле php.ini. После чего перезагрузить службу Apache2.

Настройка HTTPS в Apache

Приведу пример настройка HTTPS в Apache.
Создадим ключ и сертификат:

openssl req -new -x509 -days 365 -keyout server.key -out server.pem

На вопрос «Enter PEM pass phrase:» вводим пароль и запоминаем его. На остальные вопросы можно просто нажимать Enter соглашаясь с предложенными вариантами, только на вопрос «Common Name (e.g. server FQDN or YOUR name):» вводим имя сайта, для которого создается сертификат, например www.example.com.
После ответов на вопросы в директории появятся два файла server.pem и server.crt (ключ и сертификат).
Apache при загрузке будет спрашивать пароль от ключа ранее нами введенный, поэтому снимаем пароль с ключа:

cp server.key{,.orig}
openssl rsa -in server.key.orig -out server.key
rm server.key.orig

Скопируем файлы в директорию /etc/ssl и выставим файлу ключа права чтения только для администратора:

sudo cp server.pem /etc/ssl/certs/
sudo cp server.key /etc/ssl/private/
sudo chmod 0600 /etc/ssl/private/server.key

Активируем ssl модуль apache2:

sudo a2enmod ssl

Включаем настройки default-ssl:

sudo a2ensite default-ssl

Отредактируем файл настроек /etc/apache2/sites-enabled/default-ssl.conf:
После директивы SSLEngine on добавим строку SSLProtocol all -SSLv2 запретив использование устаревшего протокола SSLv2.
Изменим пути к фалам:

SSLCertificateFile  /etc/ssl/certs/server.pem
SSLCertificateKeyFile /etc/ssl/private/server.key

Перезапустим Apache2 чтобы изменения вступили в силу:

sudo service apache2 restart

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

Если нужно использовать только HTTPS и запретить HTTP, то активируем mod_rewrite:

sudo a2enmod rewrite

И отредактируем файл /etc/apache2/sites-enabled/000-default.conf, все содержимое в этом случае можно удалить и прописать следующее:

<VirtualHost *:80>
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

Снова перезапустим Apache2 чтобы изменения вступили в силу:

sudo service apache2 restart

Теперь например при открытии адреса http://www.example.com, сервер автоматически будет переадресовывать на https://www.example.com.

Установка и настройка libapache2-mod-evasive

Модуль libapache2-mod-evasive может помочь защитится веб-серверу Apache от от атак медленного чтения, а так же некоторых других направленных атак.

Установка в Linux Ubuntu/Debian:

sudo apt-get install libapache2-mod-evasive

Создаем конфиг файл:

sudo nano /etc/apache2/mods-available/mod-evasive.conf

Пример содержимого:

<IfModule mod_evasive20.c>
#Размер таблицы адресов
DOSHashTableSize 4096
#Количество одновременно открытых одинаковых страниц сайта для каждого хоста в интервал времени
DOSPageCount 5
#Количество открытых страниц сайта для каждого хоста в интервал времени
DOSSiteCount 50
#Интервал времени для DOSPageCount в секундах
DOSPageInterval 1
#Интервал времени для DOSSiteCount в секундах
DOSSiteInterval 1
#Период блокировки хоста в секундах
DOSBlockingPeriod 10
#Файл логов
DOSLogDir /var/log/mod_evasive.log
#Email для уведомлений о блокировке
DOSEmailNotify test@example.com
#Список адресов для которых не будут работать ограничения
DOSWhitelist 127.0.0.1
DOSWhitelist 192.168.1.1
</IfModule>

Активируем модуль:

sudo a2enmod mod-evasive

Перезагружаем apache:

/etc/init.d/apache2 restart

Проверяем:

sudo apachectl -t -D DUMP_MODULES|grep evasive

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

perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl