Как создается папка сокета php-fpm ({/var,}/run/php-fpm) на Linux?

Вопрос или проблема

Я настраиваю несколько версий 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 на своей системе, не прибегая к сомнительным методам и обходным путям.

Оцените материал
Добавить комментарий

Капча загружается...