Материал просмотрен 1,111 раз(а)

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

Конфигурацию с Apache2+nginx отмёл, так как потребление памяти меня не устраивало. Читал о других веб-серверах, которые не так сильно нагружают систему. Разделялся между nginx и lighthttpd, выбрал первое.

nginx

картинка с хабра. понравилась

Предполагаемые проблемы:

  1. Работа с php, есть решения с FastCGI (более новая технология, чем CGI, позволяющая повысить производительность и безопасность), такие как php5-fpm.
  2. Несовместимость с 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%. Бинго!