В данной статье я рассмотрю один из самых быстрых способов настройки smtp-демона для нашего вебсервера. Если вам нужен сервер, который ещё и должен принимать почту — проходите мимо. Эта статья подойдёт для тех, кто принимает почту гуглом или яндексом (на своём домене, само собой), но не хочет дергать их SMTP серверы, чтобы слать письма.

Continue Reading

Zend Guard представляет собой серверный модуль для интерпретатора PHP, который позволяет осуществлять запуск закодированных с помощью Zend Encoder и Zend SafeGuard Suite PHP-скриптов.
Для установки Zend Guard на свой сервер Вам необходимо загрузить нужный пакет с сайта разработчика - [urlspan]zend.com[/urlspan]. Для загрузки пакета Вам потребуется пройти регистрацию на сайте разработчика, также Вы можете скачать пакет по прямым адресам приведенным ниже.

Скачайте файл дистрибутива:

ZendGuardLoader (PHP 5.3)

# wget http://downloads.zend.com/guard/5.5.0/ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz
# wget http://downloads.zend.com/guard/5.5.0/ZendGuardLoader-php-5.3-linux-glibc23-i386.tar.gz

ZendGuardLoader (PHP 5.4)

32-x битная система:

# wget [urlspan]http://downloads.zend.com/guard/6.0.0/ZendGuardLoader-70429-PHP-5.4-linux-glibc23-i386.tar.gz[/urlspan]

64-x битная система:

# wget [urlspan]http://downloads.zend.com/guard/6.0.0/ZendGuardLoader-70429-PHP-5.4-linux-glibc23-x86_64.tar.gz[/urlspan]

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

# tar -xvf ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz

Копируем модуль в директорию модулей PHP:

# cp ZendGuardLoader-php-5.3-linux-glibc23-x86_64/php-5.3.x/ZendGuardLoader.so /usr/lib/php5/modules/
# chmod -R 755 /usr/lib/php5/ZendGuardLoader-php-5.3-linux-glibc23-x86_64/

Редактируем файл zend.ini добавив следующие строки:

# mcedit  /etc/php5/conf.d/zend.ini

zend_extension=/usr/lib/php5/modules/ZendGuardLoader.so
zend_optimizer.optimization_level=15
########### Проверить ###############
# полный путь до модуля
zend_extension=/usr/local/lib/Zend/ZendGuardLoader.so
zend_loader.obfuscation_level_support=3
zend_loader.enable = 1
# отключить проверку лицензии (из соображений производительности)
zend_optimizer.disable_licensing = 0
# путь к файлу лицензии
zend_loader.license_path = "/var/www/user/config"
#####################################
или
# echo 'zend_extension=/usr/local/ZendGuardLoader-php-5.3-linux-glibc23-ч86_64/php-5.3.x/ZendGuardLoader.so' > /etc/php5/conf.d/zend.ini

Пеерзапускаем web-сервер Apache:

# /etc/init.d/apache2 restart

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

# php -m |grep Zend

Zend Guard Loader
[Zend Modules]
Zend Guard Loader
# php -v
PHP 5.3.3-7+squeeze19 with Suhosin-Patch (cli) (built: Feb 18 2014 13:59:15)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
 with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH
1

По умолчанию вместо русского и других языков, отличных от английского, в консоли будут отображаться различные крокозябры, что затрудняет работу с IRC-клиентами на стороне сервера, скриптами, содержащими UTF8 и т. д.

Из-под root проверим установленные на сервере locale

#locale -a

В ответ получаем

C
C.UTF-8
de_DE.utf8
en_US.utf8

Конфигурация локалей.

dpkg-reconfigure locales

Добавить в  первом появившемся окне программа предложит Вам выбрать список локалей, которые вам потребуется. Чтобы сгенерировать выбрать русский «ru_RU.UTF-8» выберем её.

В следующем окне будет предложено выбрать «Default locale for the system environment», т. е. язык по умолчанию для Вашего сервера. Можете выбрать русский «ru_RU.UTF-8» или же оставить английский «en_US.UTF-8».

Дальше программа начнет собственно генерацию локалей, в зависимости от их количества это может занять много времени. В это время не надо завершать сессию работы с сервером (но можно запустить команду из-под screen).

Для проверки установленной по умолчанию локализации

#locale

В результате  получим

LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=

Выйдите из shell и вновь авторизуйтесь. Теперь кириллица должна работать правильно.

xCache — это программа из серии тех, что кешируют байт-код php для оптимизации и ускорения выполнения скриптов. Как, например, eAccelerator или PHP-APC.

В статье будет рассматриваться базовая настройка. А дальше можно подкручивать параметры в соответствии с собственными пожеланиями.

Нет смысла долго задерживаться на установке: всё делается стандартно.

aptitude install php5-xcache

Основные настройки кэша

Первоочередной задачей будет указание основных настроек для работы. Откройте в вашем любимом редакторе файл /etc/php5/mods-available/xcache.ini. Все параметры собраны по группам. В данный момент нам нужна группа [xcache]

xcache.size = 32M

Данная директива указывает общий объём памяти для кэша. По-умолчанию 16 мегабайт.

xcache.count = 1

Указывается по количеству процессоров (ядер). Два ядра — ставим 2. И так далее. Или два одноядерных процессора.

xcache.ttl = 0

Время жизни кэша. Иногда может потребоваться очистка кэша через определённый промежуток времени. Значение указывается в секундах.

Рассмотрим параметры, необходимые для кэширования переменных. В определённых условиях, это тоже может пригодится.

xcache.var_size = 8M

Общий объём памяти, выделяемой для кэша переменных. По-умолчанию 0 — отключено.

xcache.var_count = 1

Эта переменная аналогична xcache.count.

xcache.var_ttl = 0

Тут тоже можно привести аналогию с переменной xcache.ttl: задаёт время жизни кэша переменных.

xcache.var_maxttl = 0

Эта переменная указывает максимальное время жизни кэша.

XCache Optimizer

Иногда может потребоваться включить встроенный в xCache оптимизатор. Для этого следующую директиву нужно перевести из состояния off в состояние on.

xcache.optimizer = on

Админ-панель для xCache

xCache поставляется вместе с панелью управления, позволяющей просматривать статистику. У меня связка nginx+php-fpm, пример будет написан с учётом этого.

Прежде всего настраиваем nginx. Здесь потребуется использование alias для location.

location /x/ {
alias /usr/share/xcache/admin/;

location ~ .php$ {
fastcgi_index index.php;
fastcgi_pass unix:/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/usr/share/xcache/admin/:/var/php-temp-dir/";
fastcgi_param SCRIPT_FILENAME $request_filename;
}
}

Прописываем конфигурацию для любого виртуального хоста, перезапускаем nginx: service nginx reload. Далее в браузере открываем страницу http://example.com/x/mkpassword.php. Example.com замените на адрес вашего сайта, для которого вы создали алиас.

При помощи данного скрипта нужно создать md5-хеш пароля, который будет использоваться при аутентификации в админ-панели xCache. Достаточно указать пароль, нажать кнопку «Отправить запрос» и полученный результат скопировать.

После всех этих действий открываем файл /etc/php5/mods-available/xcache.ini, в группе [xcache.admin] редактируем необходимые параметры.

xcache.admin.user = «username»

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

xcache.admin.pass = «…»

Здесь в кавычках нужно указать md5-хеш пароля пользователя.

Сохраняем отредактированный файл и перезапускаем apache, php-cgi или php-fpm.

Теперь админка xcache должна быть доступна по адресу http://example.com/x/. Попробуйте авторизоваться и просмотреть статистику.

OpenVPN — это технология, позволяющая обезопасить использование интернета, создавая зашифрованный канал типа «сервер-клиент», и обеспечивающая защищённую передачу информации от сервера OpenVPN до клиента. Отлично подходит в случае использования публичных wifi точек доступа, где информация может быть перехвачена третьими лицами. Или в случае, когда ваш ip заблокирован на определённом сайте и нужно безопасно обойти это ограничение.
Continue Reading

В Debian Wheezy php-fpm присутствует в основном репозитории. А это значит, что больше не приходится пользоваться сторонними репозиториями, типа DotDeb, для настройки и использования этого замечательного модуля.

Статья посвящается, большей частью, настройке php-fpm на debian, не рассматривая установку дополнительных сервисов, типа mysql, nginx и чего-то там ещё. Для nginx будет приведён лишь пример используемой мной конфигурации.

Установка

Как и в любом другом случае, первым делом нужно установить требуемые пакеты. Касательно дополнительных модулей, выбор, в основном, зависит от технических требований к сайту. В этом примере будет установлен как сам модуль php-fpm, так и модули для работы с mysql, изображениями (библиотека gd), curl, который требуется для многих cms.

apt-get install php5-fpm php5-mysqlnd php5-curl php5-gd

Конфигурационные файлы располагаются в каталоге /etc/php5/fpm/.

Настройка

Php-fpm изначально поставляется с одним пулом www в качестве примера работы. Можно отредактировать конфигурационный файл этого пула для себя, либо создать новый пул, основываясь на конфигурации существующего.

Давайте откроем конфигурационный файл /etc/php5/fpm/pool.d/www.conf, рассмотрим некоторые переменные и подберём для них значения.

Первая переменная — это имя пула. Имя заключается в квадратные скобки.

[www]

Если вам нужно создать новый пул, то создайте в папке /etc/php5/fpm/pool.d/ файл, poolname.conf, и укажите в нём имя пула в квадратных скобках: [poolname]. Имя файла может не совпадать с именем пула. Сделано это только для удобства. 🙂

Следует иметь в виду, что имя пула не может совпадать с именем пользователя — владельца сайтов или любого другого пользователя, существующего в системе.

Далее следуют переменные:

user = www-data
group = www-data

В качестве значения этих переменных указывается пользователь и группа, от имени которых будет работать пул. Здесь установите имя пользователя и группы, кто является владельцем файлов вашего сайта. То есть, пользователь, в чьей домашней директории хранится ваш сайт.

Это решит проблему с правами доступа к файлам сайта. Вам не придётся беспокоиться, выставлять каждый раз права на запись в какую-нибудь папку сайта для веб-сервера, и так далее.

listen = /var/run/php-$pool.sock

Оставляем unix-сокет. Переменная $pool будет заменена на имя пула.

listen.owner = www-data
listen.group = www-data

Тоже не требует изменений. Указывается пользователь и группа, которые становятся владельцами unix-сокета fpm при запуске. Необходимо, чтобы веб-сервер имел права на чтение сокета. Если изменить значения этих переменных на что-то другое, то пользователя www-data нужно будет добавить в группу владельца сокета и выставить права для чтения сокета группой.

В свою очередь, права на сокет устанавливаются переменной listen.mode. Не рекомендуется выставлять права 0666 из соображений безопасности.

pm = static. При старте fpm создаётся определённое количество процессов пула, которые обслуживают все поступающие запросы. Существуют также и другие варианты контроля дочерних процессов: dynamic и onedemand.

pm.max_children — количество создаваемых процессов. Необходимо вычислить сколько памяти занимает один процесс, потом разделить тот объем памяти который вы хотите выделить для php5-fpm, на объем одного процессора, получите количество pm.max_children (наример 1000мб/50мб=20)

Почему именно такой выбор? 🙂 Это самый экономный вариант. Каждый процесс пула будет занимать объём оперативной памяти, выделенный переменной memory_limit плюс несколько мегабайт на подключённые модули и т.п. При статичном варианте все запросы будут обрабатываться только созданными процессами, а новые порождаться (и занимать драгоценную память) не будут. В итоге получим фиксированное потребление памяти.

Вариант onedemand, по субъективным соображениям, не подходит потому, что каждый раз создание дочерних процессов при поступлении запросов будет занимать определённое время. Что скажется на работе сайтов.

pm.min_spare_servers = этот параметр начать с количество ядер процессора умножить на 2 (пример 1 ядро * 2 = 2)
pm.max_spare_servers = этот параметр количество ядер процессора * 1 (пример 1 *4 =4)
pm.start_servers = этот параметр вычисляется по формуле (pm.min_spare_servers+pm.max_spare_servers)/2 (пример (2+4)/2=4)
Итого на выходе получаем примерно конфигурацию для 1 ядерного процессора 1гб памяти (выделенные только под PHP5-FPM, возможно у вас 2Гб общей)
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 4

pm.max_requests — количество обработанных запросов, после которого процессы php-fpm будут перезагружены. Позволяет избежать утечек памяти при использовании сторонних библиотек. 1000—3000 запросов в зависимости от загруженности и объёма памяти на сервере.

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

 

slowlog = /var/log/php-$pool-slow.log

Определять, какие запросы считать медленными, поможет переменная request_slowlog_timeout. Здесь нужно указать время, по истечении которого информация о медленном запросе будет записана в лог-файл. Например:

request_slowlog_timeout = 10s

Последним шагом в настройке php-fpm будет установка некоторых дополнительных параметров php.ini, которые будут прописаны непосредственно в конфигурационном файле пула.

Каталог для размещения временных файлов:

php_admin_value[upload_tmp_dir] = "/var/tmp_dir"

Каталог для хранения файлов сессий:

php_admin_value[session.save_path] = "/var/save_path"

По соображениям безопасности, доступ к этим каталогам должен быть только у пользователя, с правами которого запускается пул php-fpm. Также не следует использовать один каталог и для хранения файлов сессий, и для временных файлов.

Ограничение памяти для выполнения скриптов следует подбирать, исходя из требований сайта. Для начала:

php_admin_value[memory_limit] = 50M

Обязательный параметр, который устраняет [urlspan]уязвимость[/urlspan]:

php_admin_value[cgi.fix_pathinfo] = 0

Переменные sendmail_path и open_basedir не указываются специально. Они будут переданы в качестве параметров fast-cgi в конфигурационном файле nginx. Таким образом, для каждого конкретного сайта можно определить свою настройку. 🙂

После того, как все необходимые параметры прописаны, следует перезагрузить конфигурацию php-fpm командой:

service php5-fpm reload

Обработка php скриптов посредством nginx

Остаётся настроить nginx для работы с php-fpm. Конфиг не представляет собой какую-то особо сложную конструкцию.

location / {
root /var/www
...
location ~ .php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-www.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
fastcgi_ignore_client_abort off;
fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/sendmail -t -i -fmail@example.com";
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/example.com/:/var/save_path/:/var/tmp_dir/";
}
...
}

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

try_files $uri =404; отобразит ошибку 404 в браузере пользователя, вместо сообщения no input file specified, в случае, когда данная ошибка имеет место.

fastcgi_pass — путь к сокету php-fpm. Помните, какое имя мы ему дали в конфиге? /run/php-$pool.sock. Только вот nginx не понимает переменных fpm, поэтому указываем путь как есть: /run/php-www.sock. 🙂

fastcgi_pass unix:/run/php-www.sock;

Следующая переменная устанавливает путь к sendmail и параметр, указывающий адрес электропочты администратора сайта. Замените mail@example.com на что-то своё.

fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/sendmail -t -i -fmail@example.com";

Перечисляем каталоги для open_basedir: каталог с сайтом, каталог для сохранения временных файлов, каталог для файлов сессий.

fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/example.com/:/var/save_path/:/var/tmp_dir/";

Если требуется передать несколько параметров, до делать это следует так:

fastcgi_param PHP_ADMIN_VALUE "sendmail_path=/usr/sbin/sendmail -t -i -fmail@example.comnopen_basedir=/var/www/example.com/:/var/save_path/:/var/tmp_dir/";

Как можно заметить, параметры разделяются при помощи переноса строки: n.

Сохраняем все проделанные изменения и перезапускаем nginx.

service nginx reload
Посмотреть память отведенную PHP-FPM child processes
ps -ylC php5-fpm --sort:rss | awk '!/RSS/ { s+=$8 } END { printf "%s\n", "Total memory used by PHP-FPM child processes: "; printf "%dM\n", s/1024 }'

Так же ,можем настроить PHP-FPM, для автоматической перезагрузки, если есть проблемы. В этом примере перезапуск будет произведен, если десять дочерних процессов умирают в течение 1 минуты, и мы ожидаем  10 секунд перед перезапуском.

Это глобальная конфигурация и принадлежит /etc/php5/fpm/php-fpm.conf :

emergency_restart_threshold 10
emergency_restart_interval 1м
process_control_timeout 10s