Решение ошибки 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

Установка и настройка веб-сервера Apache2

Apache HTTP-сервер — назван именем племён североамериканских индейцев Апачи, также является сокращением «a patchy server» — свободный веб-сервер.

Пример команды установки в Ubuntu:

sudo apt-get install apache2

Пример установки в CentOS:

yum install httpd

Проверяем открыв в браузере адрес http://имяхоста
Обычно должна появится стандартная надпись «It works!«.

Директория хранения вэб файлов — /var/www/
Директория конфигурационных файлов — /etc/apache2/

Для каждого сайта создается отдельный виртуальный хост. Стандартный файл виртуального хоста находится по адресу /etc/apache2/sites-available/000-default.conf

Допустим у нас есть домен example.net. Создаем новый файл в директории /etc/apache2/sites-available/example.conf и прописываем в него настройки:

<VirtualHost *:80>
     ServerAdmin admin@example.net
     ServerName example.net
     ServerAlias www.example.net
     DocumentRoot /var/www/example.net/

     <Directory /var/www/example.net>
     Options -Indexes
     AllowOverride All
     Order allow,deny
     allow from all
     </Directory> 

     #можно ограничить доступ по IP к некоторым директориям, например админке таким способом:
     <Directory /var/www/example.net/admin>
     Order allow,deny
     allow from 127.0.0.1 192.168.0.47 172.16.30.5
     </Directory>

     ErrorLog /var/log/example.net.error.log
     CustomLog /var/log/example.net.access.log combined
</VirtualHost>

Опишу опции которые я указывал выше:
-Indexes — в случае отсутствия индексных файлов index.php, index.html и т.д. не будет отображаться содержимое каталогов.
FollowSymLinks — разрешает переходить по символическим ссылкам.
-MultiViews — в случае указания например несуществующей директории http://example.net/img/ включение этой директивы позволит переадресовывать на файл http://example.net/img.php или http://example.net/img.jpg и т.д. если какой нибудь из них существует, такие манипуляции могут плохо сказаться на индексации ссылок поисковиками, поэтому эту директиву лучше отключить.
AllowOverride All — разрешает использование дополнительных файлов конфигурации .htaccess.

Далее делаем ссылку на этот файл в директорию /etc/apache2/sites-enabled/. Сделать это можно командами (вторая для удаления):

a2ensite example
a2dissite example

Если нужно активировать какие нибудь модули, можно это также сделать например командами (первая команда для подключения, вторая — отключения):

a2enmod rewrite
a2dismod rewrite

Теперь создаем директорию для сайта и копируем в нее файлы.

mkdir /var/www/example.net

Редактируем некоторые параметры безопасности веб сервера:
sudo nano /etc/apache2/conf.d/security

ServerTokens OS
на:
ServerTokens Prod

ServerSignature On
на:
ServerSignature Off

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

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

Если на сервере используется много IP-адресов, а apache2 должен работать не на всех, то можно указать в /etc/apche2/ports.conf на каких ему работать, также можно изменить порт, например:

Listen 192.0.3.1:80
Listen 192.0.1.10:8080

Чтобы работал на всех:

Listen 80