В Debian Wheezy php-fpm присутній в основному репозиторії. А це означає, що більше не доводиться користуватися сторонніми репозиторіями, типу DotDeb, для настройки та використання цього чудового модуля.
Як і в будь-якому іншому випадку, в першу чергу потрібно встановити необхідні пакети. Відносно додаткових модулів, вибір, в основному, залежить від технічних вимог до сайту. У цьому прикладі буде встановлений як сам модуль php-fpm, так і модулі для роботи з mysql, зображеннями (бібліотека gd), curl, який потрібно для багатьох cms.
Файли розміщуються в каталозі / etc / php5 / fpm /.
Php-fpm спочатку поставляється з одним пулом www як приклад роботи. Можна відредагувати конфігураційний файл цього пулу для себе, або створити новий пул, грунтуючись на конфігурації існуючого.
Давайте відкриємо конфігураційний файл /etc/php5/fpm/pool.d/www.conf. розглянемо деякі змінні і підберемо для них значення.
Перша змінна - це ім'я пулу. Ім'я полягає в квадратні дужки.
Якщо вам потрібно створити новий пул, то створіть в папці /etc/php5/fpm/pool.d/ файл, poolname.conf, і вкажіть в ньому ім'я пулу в квадратних дужках: [poolname]. Файл може не збігатися з ім'ям пулу. Зроблено це тільки для зручності. 🙂
Слід мати на увазі, що ім'я пулу не може збігатися з ім'ям користувача - власника сайтів або будь-якого іншого користувача, існуючого в системі.
Далі йдуть змінні:
user = www-data
group = www-data
Як значення цих змінних вказується користувач і група, від імені яких буде працювати пул. Тут встановіть ім'я користувача і групи, хто є власником файлів вашого сайту. Тобто, користувач, в чиїй домашньої директорії зберігається ваш сайт.
Це вирішить проблему з правами доступу до файлів сайту. Вам не доведеться турбуватися, виставляти кожен раз права на запис в якусь папку сайту для веб-сервера, і так далі.
Ми залишаємо 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. вказавши повний шлях до балці.
Визначати, які запити вважати повільними, допоможе змінна request_slowlog_timeout. Тут потрібно вказати час, після закінчення якого інформація про повільне запиті буде записана в лог-файл. наприклад:
Останнім кроком в налаштуванні php-fpm буде установка деяких додаткових параметрів php.ini, які будуть прописані безпосередньо в конфігураційному файлі пулу.
Каталог для розміщення тимчасових файлів:
Каталог для зберігання файлів сесій:
З міркувань безпеки, доступ до цих каталогів повинен бути тільки у користувача, з правами якого запускається пул php-fpm. Також не слід використовувати один каталог і для зберігання файлів сесій, і для тимчасових файлів.
Обмеження пам'яті для виконання скриптів слід підбирати, виходячи з вимог сайту. Для початку:
Обов'язковий параметр, який усуває вразливість:
Змінні sendmail_path і open_basedir не вказуються спеціально. Вони будуть передані в якості параметрів fast-cgi в конфігураційному файлі nginx. Таким чином, для кожного конкретного сайту можна визначити свою настройку. 🙂
Після того, як всі необхідні параметри прописані, слід перезавантажити конфігурацію php-fpm командою:
Обробка php скриптів за допомогою nginx
Залишається налаштувати nginx для роботи з php-fpm. Конфиг не представляє собою якусь особливо складну конструкцію.
Давайте розглянемо детально деякі параметри.
try_files $ uri = 404; відобразить помилку 404 в браузері користувача, замість повідомлення no input file specified. в разі, коли дана помилка має місце.
fastcgi_pass - шлях до сокета php-fpm. Пам'ятайте, яке ім'я ми йому дали в конфіги? /run/php-$pool.sock. Тільки ось nginx не розуміє змінних fpm, тому вказуємо шлях як є: /run/php-www.sock. 🙂
Перераховуємо каталоги для open_basedir: каталог з сайтом, каталог для збереження тимчасових файлів, каталог для файлів сесій.
Якщо потрібно передати кілька параметрів, до робити це слід так:
Як можна помітити, параметри розділяються за допомогою розриву рядків: n.
Зберігаємо всі виконані зміни і перезапускаємо nginx.
Так само, можемо налаштувати PHP-FPM, для автоматичної перезавантаження, якщо є проблеми. У цьому прикладі перезапуск буде проведений, якщо десять дочірніх процесів помирають протягом 1 хвилини, і ми очікуємо 10 секунд перед перезапуском.
Це глобальна конфігурація і належить /etc/php5/fpm/php-fpm.conf:
- Налаштування xCache
- [Urlspan] Зміни nginx для php-fpm [/ urlspan]