Вопрос или проблема
Я настраиваю несколько версий php на CentOS7 (классическая и из репозиториев remi). Как установлено, классический php-fpm настроен на unix-сокете, в то время как (remi) php74-php-fpm будет слушать на TCP-сокете. Я изменил это, установив:
listen = /run/php-fpm/php74.sock
...
listen.owner = nobody
listen.group = nobody
listen.mode = 0666
что нормально, пока оба сервиса работают. Однако, если я остановлю оба сервиса, а затем запущу ТОЛЬКО php74-php-fpm, то папка сокета (/run/php-fpm) отсутствует, и сервис не запускается. Я посмотрел в очевидном месте (/usr/lib/tmpfiles.d/*) для создания папки, но там это не упоминается.
Я также вставил (через systemctl edit) строки:
[Service]
RuntimeDirectory=php-fpm
RuntimeDirectoryMode=0755
в php74-php-fpm.service, (строки взяты из классического php-fpm), полагая, что они заставят systemd создать папку при запуске, но этого не происходит.
Поэтому вопрос – как заставить создание папки при запуске php74-php-fpm? Я предпочел бы избегать всяких оболочечных хаков, так как считаю, что классический php-fpm использует несколько “стандартный” подход, который мне бы хотелось использовать.
Заранее спасибо & удачи.
Так что оказывается, что добавление:
[Service]
RuntimeDirectory=php-fpm
RuntimeDirectoryMode=0755
действительно заставляет создать папку /var/run/php-fpm, но это требуется только на Centos7.
И, конечно, я ошибся. Я менял настройки на смеси машин CentOS8 (где проблема не существует – нижняя часть объясняет почему) и машинах CentOS7, выполнил systemctl edit на машинах CentOS7, а затем проверил существование /run/php-fpm на машине CentOS8 (слишком много терминалов).
Что происходит: на CentOS8 php-fpm является стандартным для apache, и конфигурация remi www.conf, а также предоставленный файл конфигурации apache php74-php-fpm.conf отражают это, устанавливая папку сокета в /var/opt/remi/php74/run/php-fpm/ (несгораемая папка).
Однако на Centos7 mod_php является стандартным, и конфигурационный файл apache от remi не делает никаких положений для php-fpm (это нужно настраивать в конфигурационных файлах сайтов). Следуя настройкам классического php-fpm, я установил папку сокета в /run/php-fpm, что является временной и управляемой systemd – это делает необходимым изменить определение сервиса php74-php-fpm, чтобы создать папку при запуске.
Таким образом, похоже, что есть несколько методов управления временными директориями, что, на мой взгляд, запутанно и склонно к ошибкам, так как похоже, что люди используют оба метода без различимого обоснования. Но что я знаю.
Установите PHP, выполнив команду
sudo apt install php
Далее установите php-fpm
sudo apt install php-fpm
php-fpm будет установлен автоматически. Проверьте местоположение файла сокета, выполнив команду
find / -name "*fpm.sock"
Ответ или решение
Создание каталога сокетов PHP-FPM в Linux (особенно на CentOS7) представляет собой важный аспект конфигурации среды исполнения PHP. Когда вы устанавливаете несколько версий PHP-FPM, такая как версия из репозиториев Remi и встроенная версия, вы сталкиваетесь с различиями в управлении сокетами. Давайте разберем процесс создания папки сокетов, так как это важно для корректного функционирования PHP-FPM.
1. Понимание сокетов в PHP-FPM
PHP-FPM (FastCGI Process Manager) использует сокеты для взаимодействия между веб-сервером и PHP. Сокеты могут быть как UNIX (потенциально более безопасные и производительные), так и TCP (широко используемые и более стандартные для сетевых соединений). Ваша конфигурация указывает на использование UNIX-сокета в пути /run/php-fpm/php74.sock
, который будет создан во время запуска службы PHP-FPM.
2. Поиск и создание каталога сокетов
На CentOS7 система управления инициализацией Systemd распределяет задачи по созданию временных папок через механизм RuntimeDirectory
. Это позволяет службам автоматически создавать необходимые каталоги в момент их запуска.
Чтобы убедиться в успешном создании каталога, вы внесли коррективы в юнит-файл php74-php-fpm.service
, добавив:
[Service]
RuntimeDirectory=php-fpm
RuntimeDirectoryMode=0755
Эти строки указывают на то, что при запуске службы Systemd должен создать каталог /var/run/php-fpm
с правами доступа 0755
. Этот метод является стандартным и рекомендуется для создания временных директорий.
3. Почему это может не сработать
Если вы не увидели желаемого эффекта, стоит проверить следующее:
- Убедитесь, что вы изменили правильный юнит-файл, который используется вашей системой. В некоторых случаях может существовать несколько версий или переопределений юнитов.
- Возможно, необходимые зависимости или права доступа на систему не позволяют создавать папки по указанному пути.
- Запустите команду
systemctl daemon-reload
, чтобы убедиться, что изменения применены.
4. Различия между CentOS7 и CentOS8
Как вы сами заметили, подходы к настройке сокетов различаются между версиями операционной системы. В CentOS8 PHP-FPM используется как стандартное решение для Apache, и пути конфигурации уже настроены с учетом надежности (например, с использованием /var/opt/remi/php74/run/php-fpm/
). Это делает управление сокетами более предсказуемым.
В CentOS7, напротив, модуль PHP по умолчанию установлен как Apache, и вам, возможно, придется вручную настраивать конфигурацию PHP-FPM, что добавляет некоторые сложности.
5. Рекомендации по обеспечению стабильности конфигурации
- Ведение документации: Зафиксируйте все внесенные изменения в конфигурации для удобства дальнейшего администрирования и устранения неполадок.
- Мониторинг и логирование: Настройте логирование для PHP-FPM и вашего веб-сервера, чтобы упростить диагностику проблем.
- Использование непеременных директорий: Когда это возможно, выбирайте папки, которые не являются временными (например,
/var/run
), для хранения сокетов, чтобы избежать путаницы и проблем с доступностью.
Следуя вышеприведенным рекомендациям, вы сможете успешно установить и управлять несколькими версиями PHP-FPM на своей системе, не прибегая к сомнительным методам и обходным путям.