Сегодня сайт некоторое время был недоступен – совершался переход на новую платформу. Теперь уже никакого front-end и back-end, держать apache оказалось экономически не выгодно – поедал много памяти на пиковых нагрузках, даже зачастили письма от хостера “Мало памяти! ну купите наш новый тариф? Позязя…”. Тариф я покупать не стал, решил немного оптимизировать это дело. После чего можно поискать варианты услуги продвижения сайта.
Конфигурацию с Apache2+nginx отмёл, так как потребление памяти меня не устраивало. Читал о других веб-серверах, которые не так сильно нагружают систему. Разделялся между nginx и lighthttpd, выбрал первое.

Предполагаемые проблемы:
- Работа с php, есть решения с FastCGI (более новая технология, чем CGI, позволяющая повысить производительность и безопасность), такие как php5-fpm.
- Несовместимость с htaccess, придется переписывать конфиги, благо есть много онлайн-конверторов, переписать правила преобразования mod_rewrite не составит большого труда;
Ну да ладно о трудностях, начнём ставить. Отключать apache2 я пока не спешу, займусь установкой и конфигурированием свежих версий nginx и его друзей.
Допишем новые источники пакетов:
# nano /etc/apt/sources.list
deb http://nginx.org/packages/debian/ squeeze nginx
deb-src http://nginx.org/packages/debian/ squeeze nginx
deb http://packages.dotdeb.org squeeze all
deb-src http://packages.dotdeb.org squeeze all
Для Debian7 меняем squeeze на wheezy
Устанавливаем новые ключи для доступа в репозитории:
# wget http://www.dotdeb.org/dotdeb.gpg -O- |apt-key add -
# gpg --keyserver hkp://keys.gnupg.net --recv-keys ABF5BD827BD9BF62
# gpg -a --export 7BD9BF62 | apt-key add -
Проиндексируем:
# apt-get update
# apt-get upgrade
Ставим пакеты:
# apt-get install nginx php5-cli php5-common php5-cgi php5-fpm php5-mysql php5-gd php5-apc memcached php5-memcached
Изменим немного конфиг nginx для работы с PHP
# nano /etc/nginx/nginx.conf
user www-data; #у меня по дефолту стоял nginx
worker_processes 2; #обычно равно удвоенному количеству ядер
Для тонкой настройки есть параметры оптимизации, мы их сейчас пока не затрагиваем, нам нужно, чтобы конструкция запустилась.
Закомментим строчку include /etc/nginx/conf.d/*.conf
;
Допишем инклуд всех виртуальных хостов, которые будем держать в sites-enabled
include /etc/nginx/sites-enabled/*;
Так, готово.
Создадим директории:
# mkdir /etc/nginx/sites-enabled/
# mkdir /etc/nginx/sites-available/
Создадим конфиг первого хоста (в будущем возьмем его за основу шаблоном)
# nano /etc/nginx/sites-available/litl-admin
server {
listen 80;
server_name litl-admin.ru www.litl-admin.ru;
root /путь/до/www/каталога;
charset utf-8;
error_log /путь/до/логов/ошибок;
access_log /путь/до/логов/доступа;
index index.php index.html;
#настраиваем каталоги
location / {
fastcgi_pass unix:/var/run/php.sock; #общаться можно через unix-сокет или через tcp-сокет с указанием IP:PORT;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
try_files $uri $uri/ /index.php?q=$url&$args; #подстановка переменных для WordPress-движка.
}
В разных location настраиваются разные папки. Например, если нужно сделать basic auth, поступаем так:
Ближе к директиве server { }
, но внутри нее описываем location:
location /secret {
auth_basic "Hello";
auth_basic_user_file $document_root/path/.htpasswd;
}
Не забываем при этом закрыть все файлы .htaccess и .htpasswd от чтения в deny all
location ~ /\.ht
{
deny all;
}
Так, теперь пихнем символическую ссылку в sites-enabled, так как только оттуда цепляются вихосты. Это очень удобно, кстати. Нужно отключить сайт – грохнули симлинк и всё.
# ln -s /etc/nginx/sites-available/litl-admin /etc/nginx/sites-enabled/litl-admin
А редактировать можно любой из них.
Немного настроим PHP:
# nano /etc/php5/fpm/php.ini
Находим, раскомментим и поменяем строчку на:
cgi.fix_pathinfo=0
Эта бага позволяет выполнять уязвимый код из изображений и других файлов, поэтому так её исправляем.
Теперь ищем параметр и выставляем его в:
short_open_tag = On
Теперь PHP исполняются коды как с <?php ?>
так и <? ?>
, что часто используется в Bitrix-CMS, без этого просто всё рушится.
Настроим пул PHP:
# nano /etc/php5/fpm/pool.d/www.conf
Меняем прослушиваемый сокет:
listen = /var/run/php.sock
Можно изменить количество сервисов, выполняющих код, но это уже оптимизация производительности, выходит за рамки статьи (для любознательных – параметры pm.*)
Добавим ведение логов для скриптов, выполняющихся дольше 30 секунд (возможно нужно что-то оптимизировать?):
slowlog = /var/log/php-fpm/$pool.log.slow
request_slowlog_timeout = 30s
Кстати, в некоторых случаях потребуется выполнять PHP-код из других файлов (например, скрипты с расширением .html), добавим это расширение в файл пула:
security.limit_extensions = .php .html
Ну вроде всё. Рестартим сервисы:
# /etc/init.d/php5-fpm restart
# /etc/init.d/nginx restart
Если что-то не так – смотрим в логи.
Кстати, производительность немного повысилась (сравнивал утилитой ab, о которой напишу позже). Почти семикратное возрастание производительности. Количество провалов уменьшилось на 100%. Бинго!
Comments: