Связка nginx, php-fpm, php-apc позволяет ускорить работу сайта при правильной настройке по сравнению с apache и снизить нагрузку на сервер. Особенно это актуально при настройке работы сайтов с большим количеством посещений. Это сочетание компонентов в последнее время становится все более популярным, но настройка при этом достаточно несложная и делается быстро. Давайте посмотрим пример настройки на Debian’e. Настроим nginx с кэшем + php-fpm + php-apc.
Для начала вспомним, что это за компоненты. Nginx — это быстрый и гибкий веб-сервер, который к тому же позволяет использовать кеширование. Php-fpm — это PHP FastCGI Process Manager, менеджер процессов FastCGI для PHP. FastCGI — это бинарный протокол клиент-серверного взаимодействия, позволяющий обрабатывать запросы многопоточно, в отличие от однопоточного CGI. А php-apc — это Alternative PHP Cache, свободный фреймворк для кеширования байт-кода PHP в памяти, что в разы может ускорить выполнение PHP, при неоднократном использовании кода, естественно. Таким образом, ускорение должно быть в нескольких местах. Первое — кэш nginx’а, второе — более быстрая отдача статики при помощи nginx’а по сравнению с apache, третье — кэширование байт-кода PHP, четвертое — более быстрое исполнение кода php при помощи php-fpm по сравнению со связкой apache + mod_php5.
Установка пакетов
Устанавливаем пакеты:
apt-get install nginx php5-fpm php-apc php5-mysql
Всё необходимое установится по зависимостям
Настройка nginx
После установки пакетов необходимо задать настройки для nginx. Создаем файл настроек nginx для нашего сайта, назовем его «site»
touch /etc/nginx/sites-available/site
В файл запишем следующее:
server { # Слушаем 80 порт по IPv4 listen 0.0.0.0:80; # Название сайта (доменное имя) server_name site; # Индексный файл index index.php; # Корневая директория сайта root /var/www/site; # Запрещаем доступ к файлам .htaccess и .htpasswd location ~ /\.ht { deny all; } # Отдача статики location ~ \.(jpg|jpeg|ico|gif|css){ # Отключаем записи об отдаче статических файлов # Это поможет снизить количество операций записи на диск access_log off; expires max; root /var/www/site; } location ~ \.php { include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php-fpm-site; fastcgi_index index.php; # Включаем кэш nginx, подключаем зону my-cache proxy_cache my-cache; # Таймауты хранения страниц в кэше в зависимости # от ответа сервера. 200 и 302 - 60 минут, 404 - 1 минута proxy_cache_valid 200 302 60m; proxy_cache_valid 404 1m; # Директория для временного хранения proxy_temp_path /var/cache/nginx/tmp; } }
Теперь сделаем символическую ссылку, чтобы сайт заработал.
ln -s /etc/nginx/sites-available/site /etc/nginx/sites-enabled
В файл /etc/nginx/nginx.conf надо добавить кэш, который мы уже записали для использования. В начало секции http вставляем следующую строчку:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my-cache:8m max_size=128m inactive=600m;
Эта строчка означает следующее: директория для хранения кэша — /var/cache/nginx. levels — уровни кэширования 1:2, это уровни вложенности директорий в директории для хранения кэша. Параметр keys_zone определяет название и объем зоны кэша (зон может быть несколько). Зона размером 1 мегабайт может хранить 8000 ключей. Параметр max_size определяет максимальный объем кэша, когда кэш достигнет этого объема, то старые файлы из кэша будут удаляться, чтобы освободить место. Если данные не будут запрошены из кэша в течение времени, указанного в параметре inactive (в нашем случае 600 минут), то они будут удалены из кэша. Если параметр inactive не указан, по умолчанию время составляет 10 минут.
Настройка php-fpm
Настройки php-fpm находятся в директории /etc/php5/fpm. В этой директории есть поддиректория pool.d, в которой хранятся файлы для работы с сайтами. Нам нужно создать файл для нашего сайта. Назовем его site.conf
touch /etc/php5/fpm/pool.d/site.conf
В этот файл записываем следующее:
[site] # Сокет-файл для обмена данными с nginx listen = /var/run/php-fpm-site.sock # Максимально доступное в системе количество соединений listen.backlog = -1 # Владелец сокета и группа владения listen.owner = www-data listen.group = www-data # Права, устанавливаемые при создании сокета listen.mode = 660 user = www-data group = www-data # Количество процессов будет контролироваться динамически pm = dynamic pm.max_children = 30 pm.start_servers = 2 pm.min_spare_servers = 2 pm.max_spare_servers = 5 pm.max_requests = 50 env[HOSTNAME] = site env[PATH] = /usr/local/bin:/usr/bin:/bin env[TMP] = /tmp env[TEMP] = /tmp env[TMPDIR] = /tmp
Теперь можно запускать php-fpm командой
service php5-fpm start
И после этого так же запустить nginx
service nginx start
Давайте создадим директорию /var/www/site, если она еще не создана:
mkdir -p /var/www/site
А в этой директории создадим файл /var/www/site/index.php со следующим содержимым:
Теперь в браузере откроем наш сервер по доменному имени. Например, «http://site». Должна открыться страница с информацией о сервере. Там же перечислены все модули, которые используются. В этом списке должен присутствовать модуль apc, и его статус должен быть «Enabled».
Настройка php-apc
Конфигурационный файл apc находится по следующему пути: /etc/php/fpm/conf.d/20-apc.ini
В принципе, с настройками по умолчанию этот модуль уже можно использовать, но если хотите настроить его более тонко, то описание всех параметров можно посмотреть здесь.
В целом конфигурация готова, можно разворачивать сайт и настраивать все эти компоненты более детально, в зависимости от того, как устроен сайт и какая статистика будет накоплена в процессе его работы.
Не удается настроить кэш в Nginx. Не совсем понимаю как работает my-cache в вашем примере и что это вообще. Переменная, которая используется в proxy_cache_path? У меня Nginx не запускается с таким конфигом…
my-cache — это название кэш-зоны, которая определяется в файле nginx.conf и потом используется в файле /etc/nginx/sites-available/site.
Что nginx пишет в лог?