Кратко, rootkit — это набор программ призванный спрятать некую негативную деятельность или присутствие взломщика в системе.

Таким образом, в случае, если на сервере происходит некая посторонняя деятельность (рассылка спама, на сайтах появляются файлы, которые вы не создавали, повышенная нагрузка, которую не понятно что создает), особенно после того, как сервер взламывали тем или иным способом, то стоит попробовать поискать код. Это можно сделать с помощью антивируса или специального ПО для обнаружения руткитов. Наверное, самой известной программой для поиска руткитов является rkhunter.

Установка rkhunter

Будем устанавливать rkhunter 1.4.0 под Debian 7.

В общем-то, установка не должна составить трудностей, так как оказалось, что rkhunter версии 1.4.0-1 есть в официальных репозиториях Debain 7. Устанавливаем:

# apt-get install rkhunter

Либо можно установить вручную скачав архив с официального сайта:

cd ~ wget http://sourceforge.net/projects/rkhunter/files/rkhunter/1.4.0/rkhunter-1.4.0.tar.gz tar xfz rkhunter-1.4.0.tar.gz cd rkhunter-1.4.0 sh installer.sh --layout default --install

Вывод последней команды:

Checking system for:
Rootkit Hunter installer files: found
A web file download command: wget found
Starting installation:
Checking installation directory «/usr/local»: it exists and is writable.
Checking installation directories:
Directory /usr/local/share/doc/rkhunter-1.4.0: creating: OK
Directory /usr/local/share/man/man8: creating: OK
Directory /etc: exists and is writable.
Directory /usr/local/bin: exists and is writable.
Directory /usr/local/lib: exists and is writable.
Directory /var/lib: exists and is writable.
Directory /usr/local/lib/rkhunter/scripts: creating: OK
Directory /var/lib/rkhunter/db: creating: OK
Directory /var/lib/rkhunter/tmp: creating: OK
Directory /var/lib/rkhunter/db/i18n: creating: OK
Installing check_modules.pl: OK
Installing filehashsha.pl: OK
Installing stat.pl: OK
Installing readlink.sh: OK
Installing backdoorports.dat: OK
Installing mirrors.dat: OK
Installing programs_bad.dat: OK
Installing suspscan.dat: OK
Installing rkhunter.8: OK
Installing ACKNOWLEDGMENTS: OK
Installing CHANGELOG: OK
Installing FAQ: OK
Installing LICENSE: OK
Installing README: OK
Installing language support files: OK
Installing rkhunter: OK
Installing rkhunter.conf: OK
Installation complete

Прочие параметры инсталлятора rkhunter вы можете узнать воспользовавшись командой:

sh installer.sh --help

Каким способом установки пользоваться — решать вам. Первый способ проще, второй потенциально позволяет установить более свежую версию.

Также стоит установить программу unhide, которая позволяет искать скрытые процессы и порты:

apt-get install unhide

Настройка rkhunter

Будем считать, что использовали способ установки из репозитория.

Конфигурационные файлы:

/etc/default/rkhunter — можно настроить периодические задачи (обновление, проверка, отчеты),
/etc/rkhunter.conf — основной конфигурационный файл

Справочная информация может быть найдена в директории /usr/share/doc/rkhunter и с помощью команды man rkhunter. Кое-какие скрипты есть в директории /usr/share/rkhunter.

Параметры, которые можно задать в /etc/default/rkhunter (параметры могут принимать значения true или false):

CRON_DAILY_RUN="« — по умолчанию значение true. Позволяет ежесуточно запускать проверку.
CRON_DB_UPDATE=»" — по умолчанию значение true. Позволяет включить еженедельные обновления баз.
DB_UPDATE_EMAIL="false" — отправлять ли отчеты об еженедельном обновлении баз. По умолчанию — false.
REPORT_EMAIL="root" — адрес электронной почты, куда отправлять отчеты. По умолчанию — root.
APT_AUTOGEN="false« — позволяет включить автоматическое обновление баз.
NICE=»0" — позволяет управлять приоритетом процесса.
RUN_CHECK_ON_BATTERY="false" — следует ли проводить автоматические проверки в случае работы компьютера от батареи.

В /etc/rkhunter.conf можно поправить следующие настройки:

PKGMGR=DPKG — судя по документации, в Debian данный параметр особого эффекта не дает, так что можно оставить по умолчанию.
DISABLE_TESTS="apps" — отключает проверку актуальности версий софта, с этим прекрасно справляются разработчики Debian.
SUSPSCAN_DIRS="/tmp /var/tmp" — указываем в какой директории искать подозрительные файлы.
OS_VERSION_FILE="/etc/debian_version" — где искать файл с версией ОС.
USE_LOCKING=1 — позволяет спользовать блокировку для защиты от ошибок в случае если запущено несколько процессов rkhunter в Debian. Может пригодиться, если вы запускаете rkhunter автоматически с помощью cron.
DISABLE_UNHIDE=2 — отключает использование утилиты unhide.rb написанной на ruby.

Подготовка rkhunter к первому поиску руткитов

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

Прежде всего, необходимо создать базу знаний о текущих файлах, чтобы потом было с чем сравнивать. То есть необходимо быть уверенным, что система чистая. Лучшим вариантом будет выполнить это действие сразу после настройки системы. База создается командой:

rkhunter --propupd

Базу можно будет найти по следующему пути: /var/lib/rkhunter/db/rkhunter.dat

Далее требуется обновить базу знаний, содержащую, в том числе, информацию о новых руткитах. Следует выполнить после предыдущей операции и перед первой проверкой. Стоит периодически обновлять базу знаний, но это можно делать не слишком часто. Команда:

rkhunter --update

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

rkhunter -c -sk

Результат:

System checks summary
=====================

File properties checks...
Files checked: 135
Suspect files: 0

Rootkit checks...
Rootkits checked : 309
Possible rootkits: 0

Applications checks...
All checks skipped

The system checks took: 6 minutes and 21 seconds

All results have been written to the log file (/var/log/rkhunter.log)

One or more warnings have been found while checking the system.
Please check the log file (/var/log/rkhunter.log)

На самом деле вывод более подробный, представлена только финальная часть. Как видно, лог можно найти по пути /var/log/rkhunter.log

Возможные ключи

Команды

-c, --check — выполнить поиск руткитов, результат будет выведен на стандартный вывод, а также в лог-файл.
--unlock — эта комманда просто удаляет lock-файл.
--update — будет произведена проверка на наличие обновления базы знаний. Для работы данной команды требуется, чтобы в системе был установлен один из браузеров командной строки, к примеру, wget или lynx. Желательно выполнять данную команду с некой периодичностью. При использовании в cron стоит использовать также опцию --nocolors.
--propupd [{filename | directory | package name},...] — команда позволяющая добавить в базу данных о файлах системы информацию о файле, всех файлах в директории или пакете. Это необходимо для работы одного из тестов, который сравнивает файл в текущем состоянии с тем, которое было при создании базы. Помните, добавляемый в базу файл должен быть заведомо не зараженным.
--versioncheck — эта команда заставляет rkhunter проверить наличие новой версии программы для поиска руткитов. Браузер командной строки должен присутствовать в системе. Если используется в cron желательно использовать опцию --nocolors.
--list [tests | {lang | languages} | rootkits | perl | propfiles] — эта команда выводит некоторые поддерживаемые возможности программы. Tests — выведет названия доступных тестов, languages — покажет поддерживаемые языки, rootkits — отобразит списки руткитов из базы rkhunter. Perl — выведет список модулей perl которые могут понадобиться в работе rkhunter, список этот не обязательный, но желательный. Установить модули perl можно с помощью команды cpan или утилиты dh-make-perl, которую нужно устанавливать отдельно. propfiles — отобразит список имен файлов, которые использовались для генерации базы файлов. Если никаких опций не задано, то будут показаны все списки кроме propfiles.
-C, --config-check — будет проведена проверка конфигурационных файлов. Проверяются только включенные опции (enabled). Чтобы проверить все опции можно указать --enable all --disable none в командной строке.
-V, --version — будет выведена версия rkhunter.
-h, --help — эта команда отобразить экран с краткой справкой.

Параметры

Различных параметров достаточно много, поэтому мы посмотрим только часть из них. Те, которые показались автору статьи наиболее полезными.

--appendlog — в случае использования данного параметра лог /var/log/rkhunter.log будет дополнен, а не перезаписан. По умолчанию, после того, как rkhunter отработает, основной лог перезаписывается, а предыдущее его содержимое сохраняется в файле rkhunter.log.log, при чем, хранится только один.
--cs2 — основная цветовая схема рассчитана на черный фон. Если же результат будет выведен на экран с белым фоном, то можно использовать альтернативную цветовую схему.
--cronjob — при указании данного параметра будут использованы следующие опции: --check, --nocolors и --skip-keypress, а также не будет вывода в стандартный выход. Поэтому в сочетание с данным параметром можно использовать --report-warnings-only.
--display-logfile — после того, как rkhunter закончит свою работу вывести содержимое лога. Вообще говоря, лог содержит более подробную информацию о найденных проблемах.
--lang — можно указать на каком языке выводить информацию в процессе проверки. Список доступных языков можно получить командой rkhunter --list lang. По умолчанию используется английский.
--logfile [file] — позволяет переопределить файл в который будет писаться лог. При необходимости ничего не писать в лог, можно задать в качестве пути /dev/null.
--nocolors — этот параметр позволяет включить черно-белый режим вывода результатов работы.
--nolog — подавляет запись чего-либо в лог.
--quiet — подавляет любой вывод. Может быть полезно при проверке только кода выхода. То есть если rkhunter используется из скрипта, к примеру.
--report-warnings-only — при этом выводятся только предупреждения. Может быть полезно при запуске через cron. Таким образом, предупреждения будут видны при подключении к серверу с помощью KVM, к примеру.
--sk, --skip-keypress — по умолчанию rkhunter после некоторых наборов тестов просит нажать клавишу “Ввод”. Чтобы таких запросов не поступало можно использовать эту опцию.
--syslog [facility.priority] — по умолчанию в syslog ничего не пишется. Если требуется отмечать время начала и окончания тестирования, можно использовать данный параметр.
--verbose-logging — этот параметр может использоваться, чтобы некоторые тесты писали в лог более подробную информацию. Это может пригодиться для повторного прогона, когда не понятно из-за чего возникло предупреждение. Требует дополнительного времени.

Автоматический поиск руткитов

Чтобы rkhunter начал автоматически проверять систему ежесуточно (у меня проверка начинается в 6:25) достаточно в файле /etc/default/rkhunter установить значение параметраCRON_DAILY_RUN равным true. В данном случае будет использоваться следующая команда:

/usr/bin/rkhunter --cronjob --report-warnings-only --appendlog

Как мы помним, --cronjob подразумевает под собой параметры --check, --nocolors и --skip-keypress. То есть в данном случае rkhunter запускается для проверки системы в черно-белом режиме отображения, не запрашивает каких-либо нажатий клавиш, при этом в консоль выводятся только предупреждения и лог будет дописываться, а не перезаписываться. Так как со временем файл лога будет увеличиваться  в размере, то не забудьте настроить его ротацию.

Если же вы хотите проводить поиск руткитов по другому расписанию и с другими параметрами, то команду запуска можно добавить в cron вручную.

Организация отказоустойчивой системы хранения данных — это, естественно, RAID. Стоит дать некоторое определение RAID: избыточный (резервный) массив собранный из независимых дисков. Рассматривая возможности покупки аппаратных RAID массивов, всегда приходится сталкиваться с достаточно высокой ценой. Однако, при выборе хранилища данных можно рассмотреть и другие альтернативы. Так, например, одно из возможных решений может быть реализовано на Linux (Debian) с применением недорогих комплектующих. Вот такое решение программного RAID массива мы сегодня и рассмотрим.

Постановка задачи:

  • Организовать отказоустойчивую систему хранения данных;

Условия:

  • быстрое развёртывание;
  • лёгкое управление;
  • минимальные потери при аппаратных сбоях;
  • возможность быстрого ремонта (замены) при аппаратных сбоях;
  • низкая стоимость;

Условия, которые мы поставили вполне выполнимы если мы будем использовать программный RAID массив. Для решения этой задачи не требуется высокопроизводительного и дорогостоящего оборудования, а также платного программного обеспечения.

Решение:

  • системный блок с установленным необходимым количеством жёстких дисков (наверняка, в закромах найдется старенький системник, можно использовать и новый с SATA дисками. Все зависит от того, какой дисковый объем и какая надёжность вам нужна)
  • операционная система Linux (почему именно она? Просто сейчас занимаюсь именно ей. Она бесплатна, всегда можно найти информацию по настройке и внедрению, открытые исходные коды)

Установим ее и приступим к «творению».

 apt-get install mdadm

Во время установки система попросит параметры для обслуживания уже установленных массивов или для будущих. Чтобы не заморачиваться оставьте предложенные параметры по-умолчанию (all). Далее необходимо подготовить жёсткие диски для соединения в массив, определимся, что будем использовать массив класса RAID 1. Один из наиболее надежных (полное зеркалирование) и не дорогое решение.

root# fdisk /dev/sdb 
Command (m for help):n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-41610, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-41610, default 41610):
Using default value 41610

Раздел у нас создан. Посмотрим его параметры.

Command (m for help): p
Disk /dev/sdb: 21.4 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk identifier: 0xda185917
Device Boot Start End Blocks Id System
/dev/sdb1 1 41610 20971408+ 83 Linux

Индификатор созданного раздела — 83, это стандартный раздел Linux. Он нам не подходит. Его необходимо сменить на «fd» (linux raid autodetect). Полный список можно посмотреть указав «L» вместо «fd», потом система задаст повторный вопрос.

Command (m for help): t
Selected partition 1
Hex code (type L to list codes):fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Раздел создан, указан необходимый тип, для проверки можно ввести команду «p» и посмотреть результат, если все устраивает, то пора записать разделы на диск и приступить ко второму жёсткому диску.

Command (m for help): p
Disk /dev/sdb: 21.4 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk identifier: 0xda185917
Device Boot Start End Blocks Id System
/dev/sdb1 1 41610 20971408+ fd Linux raid autodetect
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

Аналогично готовим второй жёсткий диск

После завершения подготовки дисков можно приступать к непосредственному созданию массива. Создание RAID массива выполняется с помощью программы
mdadm (ключ --create). Добавим опцию --level, для указания типа RAID массива, который хотим получить, в нашем случае первого (1) уровня. С помощью ключа --raid-devices укажем устройства, поверх которых будет собираться RAID массив.

root#  mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdd1 
mdadm: size set to 20971328K
mdadm: array /dev/md0 started.

Если во время сборки не хватает физических дисков, но вы планируете добавить их позже, т.е. собрать не полный RAID массив (degraded) можно указать слово missing вместо имени устройства. Для RAID 5 это может быть только один диск, для RAID 6 — не более двух, для RAID 1 сколько угодно, но должен быть как минимум один рабочий. Массив создан, теперь необходимо убедится, что собранный RAID массив собран правильно.

root#  cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]

md0 : active (auto-read-only) raid1 sdd1[1] sdb1[0]       20971328 blocks [2/2][UU]          resync=PENDING unused devices: <none>

Система сообщает, что создан RAID 1 массив, в который входят два устройства - sdd1 и sdb1. Проверка состояния нашего массива показывает [UU] — означает, что все в порядке, а ([_U] или [U_] означает, что массив поврежден. Имя нашего RAID массива md0.

Файловая система создана, но она еще не готова принимать к размещению данных. Можно посмотреть статус массива.

root# cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdd1[1] sdb1[0]
      20971328 blocks [2/2] [UU]
      [==>..................]  resync =10.7%(2260416/20971328) finish=8.4minspeed=36824K/sec
unused devices: <none>

Теперь нужно создать файл конфигурации нашего RAID массива. Система сама не запоминает какие RAID массивы ей нужно создать и какие компоненты в них входят. Эта информация находится в файле конфигурации mdadm.conf. Параметры, которые следует добавить в этот файл, можно получить при помощи команды mdadm --detail --scan --verbose.

root# mdadm --detail --scan --verbose 
ARRAY /dev/md0 level=raid1 num-devices=2 metadata=00.90 UUID=ddddad18:ae4cb9be:cb5f3c5d:d16ad809
 devices=/dev/hdb1,/dev/hdd1

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

root# mdadm --detail --scan --verbose | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf 

Настройка уведомления о состоянии RAID массива по email

Создаем новые диски с использование LVM

Теперь все готово.

 

 

apt-get install openssh-server rkhunter ssmtp mc htop iftop iotop nmap unhide lsb-release iptraf sshguard

 

для просмотра текущей нагрузки на сеть

iptraf

Поверяем установленную версию

cat /etc/issue

lsb_release -a

cat /etc/lsb-release

cat /etc/debian_version

Создание программного RAID на Debian

 Установка локалей под Debian

 Как научить сервер сообщать вам по почте о логине root

Защита ssh от брутфорса

Настройка автозагрузки правил iptables в Debian

для увеличения количества доступной памяти под Linux

Мониторинг работы системы

Импорт необходимых PGP ключей:

 wget -O - http://nginx.org/keys/nginx_signing.key|apt-key add  -

Для добавления репозиториев nginx необходимо вписать в конец файла /etc/apt/sources.list

deb http://nginx.org/packages/debian/ wheezy nginx
deb-src http://nginx.org/packages/debian/ wheezy nginx

>или выполнить в командной строке

echo "#Rep NGINX">> /etc/apt/sources.list
echo deb http://nginx.org/packages/debian/ wheezy nginx>> /etc/apt/sources.list
echo deb-src http://nginx.org/packages/debian/ wheezy nginx>> /etc/apt/sources.list

Обновляем репозитарии

 apt-get update

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

apt-get install nginx php5 php5-curl php5-cgi php5-fpm fcgiwrap php5-gd memcached php5-memcached siege php5-cli php5-common  mysql-server php5-mysql php5-suhosin
  • nginx — сам веб сервер.
  • php5-cli php5-common php5-sqlite  php5-cgi php5-fpm php5-gd — некоторые нужные для работы движков модули php.
  • mysql-server php5-mysql — база данных mysql и связь ее с php.
  • fcgiwrap — обработка perl скриптов.
  • php5-apc memcached php5-memcached — ускорители работы веб сервера.
  • siege — утилита для тестирования скорости работы сайта, понадобится при подборе количества обработчиков.
  • php5-suhosin — патч для PHP  предназначенный для повышения защиты сервера от действий злоумышленника.

Проверим версию установленного NGINX

nginx -v
 nginx version: nginx/1.6.2

Создаем каталог для сайтов и логов, также устанавливаем права

mkdir -p /usr/local/hosting/www && chmod -R a-rwx,u+rwX,g+rX /usr/local/hosting/www && chown www-data:www-data -R /usr/local/hosting/www
#Дирректория для кеша  mkdir /tmp/fcgi-cache/ && chown www-data:www-data -R /tmp/fcgi-cache/

 

2. Настройка Nginx

Несмотря на то, что конфигурация Nginx состоит из нескольких файлов, сам nginx начинает читать единственный файл: /etc/nginx/nginx.conf, все остальные подключаются директивой include.

Редактируем /etc/nginx/nginx.conf

# Пользователь с правами которого работает nginx
user www-data;
# Рекомендуется устанавливать по числу ядер
worker_processes 4;
pid /var/run/nginx.pid;
#worker_rlimit_nofile 8192;
events {
# Максимальное число подключений к серверу на один worker-процесс
worker_connections 1024;
# Эффективный метод обработки соединений, используемый в Linux 2.6+
use epoll;
}
http {
##
# Базовые настройки
    #Организовываем кеш для FastCGI сервера, я использую раздел в ram
    fastcgi_cache_path /tmp/fcgi-cache/ levels=1:2   keys_zone=one:10m;
    #Используем sendfile, но осторожно, если надо отдавать большие файлы,
    #то sendfile случается вредит
    sendfile on;
    #Расширяем буфера отдачи
    #output_buffers   32 512k;
    #Ограничиваем размер сегмента отправляемой за одну
    #блокируемую отдачу
    sendfile_max_chunk  128k;
    #Буфер отдачи которы используется для обрабатываемых данных
    postpone_output  1460;
    #Размер хеша для доменных имен.
    server_names_hash_bucket_size 64;
    #Размер данных принемаемых post запросом
    client_max_body_size 15m;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # При ошибках не говорим врагу версию nginx
        server_tokens off;
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
##
# Настройка логов
   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
##

# Настройки сжатия
     gzip on;
     gzip_disable "msie6";
     gzip_vary on;
     gzip_proxied any;
     gzip_comp_level 6;
     gzip_buffers 16 8k;
     gzip_http_version 1.1;
     gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    ssi on;
##
# Настройка виртуальных доменов
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

Настройка виртуального домена 

Создаем директории для доменов и шаблонов

mkdir /etc/nginx/sites-enabled
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/templates
mkdir /var/www/htdocs

Настройка шаблонов. 

Общий шаблон
mcedit  /etc/nginx/templates/default

# Типовые настройки общие для всех доменов (если не захочется экзотики)
##
index index.html index.php;
# Реализуем "красивые" ссылки для Drupal (и для ряда других CMS)
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
# Закрываем доступ к файлами .htaccess и .htpassword
location ~ /.ht {
deny all;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

Шаблон подключения обработки php
mcedit  /etc/nginx/templates/php

# Передаём обработку PHP-скриптов PHP-FPM
location ~ .php$ {
try_files $uri =404;
#PHP-FPM слушает на Unix сокете
#fastcgi_pass   unix:/tmp/wwwpool.sock;
fastcgi_pass   unix:/var/run/php5-fpm.sock;
#Использовать cache зона one
fastcgi_cache  one;
#Помещать страницу в кеш, после 3-х использований. Меньшее число вызвало у меня труднообъяснимые глюки
# на формах регистрации
fastcgi_cache_min_uses 3;
#Кешировать перечисленные ответы
fastcgi_cache_valid 200 301 302 304 5m;
#Формат ключа кеша - по этому ключу nginx находит правильную страничку
fastcgi_cache_key "$request_method|$host|$request_uri";
#Если не использовать эту опцию - то в форумах все будут сидеть под именем первого вошедшего на форум
# fastcgi_hide_header "Set-Cookie";
#Этот запрос заставит nginx кешировать все что проходит через него
# fastcgi_ignore_headers "Cache-Control" "Expires";
fastcgi_index  index.php;
#  fastcgi_intercept_errors on; # только на период тестирования
# Включаем параметры из /etc/nginx/fastcgi_param
include fastcgi_params;
# Путь к скрипту, который будет передан в php-fpm
fastcgi_param       SCRIPT_FILENAME  $document_root$fastcgi_script_name;
fastcgi_ignore_client_abort     off;
}

Шаблон подключения обработки Perl
mcedit  /etc/nginx/templates/perlcgi

#Все скрипты заканчивающиеся на pl и cgi
location ~ .(pl|cgi)$
{
#Не сжимаем скрипты
gzip off;
try_files $uri =404;
#Передаем скрипты на обработку fcgiwrap
fastcgi_pass unix:/var/run/fcgiwrap.socket;
# Используем стандартные параметры
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_ignore_client_abort off;
}
#Замена апачевской ScriptAlias
location /cgi-bin/ {
gzip off;
try_files $uri =404;
root /var/www/;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_ignore_client_abort off;
}

Шаблон подключения phpmyadmin
mcedit  /etc/nginx/templates/phpmyadmin

location /phpmyadmin {
root /var/www/;
index index.php index.html index.htm;
location ~ ^/phpmyadmin/(.+.php)$ {
try_files $uri =404;
root /var/www/;
fastcgi_pass unix:/tmp/wwwpool.sock;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
location ~* ^/phpmyadmin/(.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
root /var/www/;
}
}

Отключаем уязвимость forum.antichat.ru/thread222063-php-fpm.html
прописываем в /etc/php5/fpm/php.ini

cgi.fix_pathinfo=0

Создаем шаблон по умолчанию для своего домена:

mcedit /etc/nginx/sites-available/default

server {
# Папка с контентом сайта (удобно, когда совпадает с именем домена)
root /var/www/htdocs/;
# Настройка логов, каждому виртуальному домену - свой лог
access_log /var/log/nginx/default-access.log;
error_log /var/log/nginx/default-error.log;

# Подключаем все шаблоны для проверки, на реальных хостах будем использовать только нужные.
include /etc/nginx/templates/default;
include /etc/nginx/templates/php;
include /etc/nginx/templates/phpmyadmin;
include /etc/nginx/templates/perlcgi;
}

Создаем симлинк

ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/000-default

Удаляем стандартный default, если есть

 rm /etc/nginx/conf.d/default.conf

Проверяем правильность конфига

service nginx configtest

Testing nginx configuration: the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful
nginx.
Готово! перезапускаем Nginx

service nginx reload

Если все верно, то nginx начинает работать с новой конфигурацией, если нет — работа продолжается со старой, рабочей конфигурацией.

Проверка работоспособности php.
Создадим файл test.php в корневом каталоге сайта (в нашем случае это /var/www/htdocs/) следующего содержания:

 <?php phpinfo(); ?>
chmod 755 /usr/local/hosting/www/test.php && chown www-data:www-data /usr/local/hosting//www/htdocs/test.php

После чего переходим в браузере IP/test.php, если все верно — получаем параметры php на сервере, после чего удаляем этот фаил для безопасности.

Проверка работоспособности Perl.
Создадим файл test.cgi в корневом каталоге сайта (в нашем случае это /var/www/htdocs/) следующего содержания:

#!/usr/bin/perl -w
print "Content-type: text/htmlnn";
print "<html><head><title>Hello World!! </title></head>n";
print "<body><h1>Hello world</h1></body></html>n";
chmod 755 /var/www/htdocs/test.cgi && chown www-data:www-data /var/www/htdocs/test.cgi

После чего переходим в браузере IP/test.cgi, если все верно — получаем «Hello world».

Если все работает, то на этом этапе мы имеем рабочий веб сервер с поддержкой php и perl скриптов, дальше опишу некоторые нюансы донастройки отдельных его частей.

.htaccess !

В Nginx нет никакого аналога апачевского .htaccess, поэтому если работа сайта требует его наличия, то придётся переписывать его содержание в соответствии с синтаксисом nginx в основную конфигурацию домена. В нашем конфиге .htaccess был заменён следующим блоком:

location / { try_files $uri $uri/ /index.php?q=$uri&$args; }

Для преобразования .htaccess в синтаксис nginx можно воспользоваться [urlspan]онлайн-конвертором[/urlspan]

3. Настройка PHP-FPM

В Debian конфигурация PHP-FPM состоит из 2х частей: глобальной (/etc/php5/fpm/php-fpm.conf) и настройки пулов (/etc/php5/fpm/pool.d/*.conf). В данном примере глобальные настройки мы трогать не будем, а вот на настройке пулов остановимся чуть подробнее.

Пулы

Для начала разберёмся зачем нужны пулы. В случае разных требований сайтов к PHP-окружению (различные параметры php.ini, разное число обработчиков и т.д.) может потребоваться создание дополнительных пулов. Данная операция в PHP-FPM весьма тривиально:

Настройка каждого пула в Debian представлена своим файлом в каталоге /etc/php5/fpm/pool.d/. По умолчанию системе есть единственный пул «www» (файл: /etc/php5/fpm/pool.d/www.conf) именно его настройкой мы и займёмся.

Workers (обработчики)

Самая спорная часть в настройке пула, это количество обработчиков php-скриптов. На первый взгляд, кажется, что чем больше обработчиков, тем эффективней обрабатываются php-скрипты. Но это не так! Во-первых: большое число обработчиков расходует больше памяти (а для нашего сервера память весьма критичный ресурс), во-вторых: если обработчиков очень много и, так случилось, что все они реально заняты работой, то у сервера может просто не хватить ресурсов на другие задачи (даже есть вероятность, что подключение по SSH станет практически не возможным).

В идеале число обработчиков должно быть таким, что даже при стрессовой нагрузке LoadAvarage системы оставался в разумных пределах. Т.е. пусть лучше при высокой нагрузке пользователи периодически получают сообщения о недоступности сервиса (ошибка 502: Gateway timeout), чем полная недоступность сервера даже для администратора.

И так немного подредактируем стандартный пул mcedit /etc/php5/fpm/pool.d/www.conf

#Где будем слушать подключения, я предпочитаю сокеты, но если сервера разнесены, то прийдется использовать порт.
;listen = 127.0.0.1:9000
listen = /tmp/wwwpool.sock

# Выбираем динамический режим создания процессов, т.е.
# число запущенных процессов PHP-FPM будет зависеть от текущей нагрузки
pm = dynamic

# Максимальное количество дочерних процессов.
pm.max_children = 7

# Количество дочерних процессов, стартующих сразу при загрузке сервера. Т.к. время запуска каждого
# нового процесса отлично от нулевого, то выбираем значение больше 1, не смотря на экономию ресурсов
pm.start_servers = 3

# Минимальное чисто простаивающих процессов. Должен согласовываться по логике с предыдущими
# при экономии ресурсов будет удобно pm.start_servers = pm.min_spare_servers.
pm.min_spare_servers = 3

# Максимальное чисто простаивающих процессов. Естественно, что не более чем pm.max_children
# и не менее pm.min_spare_servers. Остальные будут выгружены.
pm.max_spare_servers = 4

# Если скрипт будет выполняться больше указанного времени, то отладочная информация по нему будет записана в файл "медленных" запросов
request_slowlog_timeout = 3s
# Определяет путь к файлу "медленных" запросов (обязательный параметр, в случае определения request_slowlog_timeout)
slowlog = /var/log/php-slow.log

Оптимальное число обработчиков зависит от ресурсов сервера, сложности php-скриптов, нагрузки, создаваемой на mysql-сервер и т.д. В любом случае оптимальное число обработчиков нужно подбирать на основе тестирования работы сайта. Методика тестирования неплохо описана тут, повторяться не буду.

Добавление пула

При увеличении числа обслуживаемых сайтов может понадобиться создание дополнительных пулов, для настройки различных параметров каждому сайту — своё. Данная операция в php-fpm, на наш взгляд, весьма тривиальна:
Нужно скопировать файл /etc/php5/fpm/pool.d/www.conf под новым именем (для примера назовём его newpool.conf)
Дать новому пулу имя: находим вверху нового файла строку [www] (имя первого пула) и меняем на [newpool]
Меняем адрес подключения к php-fpm (директива «listen»). Т.к. каждый адрес должен быть уникален, то нужно изменить:

listen = 127.0.0.1:9000

на

listen = 127.0.0.1:9001

Или, в случае использования unix-сокетов,

listen = /tmp/newpool.sock

Номера портов и путей к unix-сокетам во всех пулах должны быть разными!

Для применения параметров после изменения php.ini (для PHP-FPM полный путь к файлу выглядит так: /etc/php5/fpm/php.ini) или собственных настроек PHP-FPM требуется перезапуск сервиса

service php5-fpm restart

4. Установка phpmyadmin

Загрузим стабильную версию phpmyadmin с сайта [urlspan]www.phpmyadmin.net/home_page/downloads.php[/urlspan]

wget http://optimate.dl.sourceforge.net/project/phpmyadmin/phpMyAdmin/4.2.7/phpMyAdmin-4.2.7-all-languages.tar.gz

Распакуем сразу в нужную дирректорию и дадим нужные права.

tar -xzf phpMyAdmin-4.2.7-all-languages.tar.gz -C /var/www/
mv /var/www/phpMyAdmin-master-версия /var/www/phpmyadmin
chown www-data: /var/www/phpmyadmin -R

Скопируем файл с примером конфигурации и приведем его к следующему виду (сгенерировать blowfish_secret можно [urlspan]здесь[/urlspan]):

cp /var/www/phpmyadmin/config.sample.inc.php /var/www/phpmyadmin/config.inc.php
mcedit /var/www/phpmyadmin/config.inc.php
$cfg['blowfish_secret'] = ‘e%o$fd3}tC9[GxY$zY_+ddfTdss[i*JG]#GHt]alv’
$cfg['Servers'][$i]['auth_type'] = ‘http’;
$cfg['Servers'][$i]['controluser'] = ‘pma’;
$cfg['Servers'][$i]['controlpass'] = ‘fHUsMkId57NM’; // Сгенерируйте свой пароль
$cfg['Servers'][$i]['pmadb'] = ‘phpmyadmin’;
$cfg['Servers'][$i]['bookmarktable'] = ‘pma_bookmark’;
$cfg['Servers'][$i]['relation'] = ‘pma_relation’;
$cfg['Servers'][$i]['table_info'] = ‘pma_table_info’;
$cfg['Servers'][$i]['table_coords'] = ‘pma_table_coords’;
$cfg['Servers'][$i]['pdf_pages'] = ‘pma_pdf_pages’;
$cfg['Servers'][$i]['column_info'] = ‘pma_column_info’;
$cfg['Servers'][$i]['history'] = ‘pma_history’;
$cfg['Servers'][$i]['tracking'] = ‘pma_tracking’;
$cfg['Servers'][$i]['designer_coords'] = ‘pma_designer_coords’;
$cfg['Servers'][$i]['userconfig'] = ‘pma_userconfig’;
$cfg['SuhosinDisableWarning'] = ‘true’;

Затем создаем базу данных и пользователя необходимые для работы phpMyAdmin:

mysqladmin -p create phpmyadmin
 mysql -p
 CREATE USER 'pma'@'localhost' IDENTIFIED BY 'fHUsMkId57NM';
 GRANT ALL ON phpmyadmin.* TO 'pma'@'localhost';
 exit;

и необходимые для работы таблицы при помощи скрипта create_tables.sql:

mysql -p phpmyadmin < /var/www/phpmyadmin/examples/create_tables.sql

Теперь при обращении к любому хосту, в конфигурацию которого включен шаблон /etc/nginx/templates/phpmyadmin мы имеем возможность запустить phpMyAdmin, перейдя по адресу _http://имя_хоста/phpmyadmin