Вопрос или проблема
Я получаю эти ошибки на сервере (CentOs 7):
[proxy:debug] proxy_util.c(2209): [client 80.251.245.153:61902] AH00944: подключение fcgi://127.0.0.1/data/webs/dev/index.php к 127.0.0.1:8000
[proxy:debug] proxy_util.c(2246): [client 80.251.245.153:61902] AH02545: fcgi: определено UDS как /tmp/php56-fpm.sock
[proxy:debug] proxy_util.c(2418): [client 80.251.245.153:61902] AH00947: подключено /data/webs/dev/index.php к httpd-UDS:0
[proxy:error] (2)Нет такого файла или директории: AH02454: FCGI: попытка подключиться к сокету Unix /tmp/php56-fpm.sock (*) не удалась
[proxy_fcgi:error] AH01079: не удалось установить соединение с бэкендом: httpd-UDS
[proxy:debug] proxy_util.c(2171): AH00943: FCGI: соединение освобождено для (*)
Сокет существует, я пытался установить права 777, но это не сработало:
ls -l /tmp/php56-fpm.sock
-rw-rw----. 1 apache apache 0 Фев 17 16:11 /tmp/php56-fpm.sock
Настройка прослушивания www.conf PHP-FPM (целый файл здесь: https://pastebin.com/uD5GsMna):
listen=/tmp/php56-fpm.sock
Виртуальный хост:
<VirtualHost *:80>
ServerName dev.stavebninyfranek.com
DocumentRoot "/data/webs/dev"
<FilesMatch "\.php$">
SetHandler "proxy:unix:/tmp/php56-fpm.sock|fcgi://127.0.0.1"
</FilesMatch>
</VirtualHost>
Мои конфигурационные файлы (httpd.conf): https://pastebin.com/XS6cDuFQ
Я пытался изменить сокет, изменить права на пользователя apache:apache, но я не знаю, где проблема.
Спасибо
Это может быть вызвано конфигурацией systemd для Apache. Например, на Centos 7 и Ubuntu 18.04+ по умолчанию служба Apache (см. systemctl cat apache2
) настроена с:
PrivateTmp=true
Это означает, что процесс Apache получает свою собственную подкаталог в /tmp, доступный как /tmp, и поэтому не может видеть файлы в /tmp, добавленные другими программами (ищите подкаталог /tmp, который начинается с “systemd-private” и включает “apache2.service” – это он), и то же самое для /var/tmp. Решение будет не использовать /tmp или /var/tmp для ваших сокетов php-fpm (это более безопасно, чем установка PrivateTmp=false
для Apache).
paulie.
Измените пользователя и группу на вашего текущего пользователя apache
/etc/php-fpm.d/www.conf
** пользователь и группа должны быть такими же, как в /etc/http/conf/http.conf
Затем выполните
chown -R user.user /run/php-fpm/www.conf
** измените на вашего пользователя
Я считаю, что вышеуказанное относится к centOS, потому что я пользователь Debian. Это на самом деле одно из решений проблемы ‘503 error service unavailable’, вызванной проблемой с правами сокета php8. Поэтому ваш сокет в apache будет находиться по адресу:
chown -R user.user /var/run/php/php8.1-fpm.sock
У меня возникла такая же проблема после обновления Apache с 2.4.10 до 2.4.24. С старым Apache соединение с fcgi работало с сокетом в /tmp
, в то время как новый Apache выдавал ошибку (2)Нет такого файла или директории
. Перемещение сокета в /var/run
решило проблему.
Изучая исходный код для mod_proxy
, я обнаружил, что в новой версии Apache путь должен быть относительным к тому, что указано в DefaultRuntimeDir
. В моей конфигурации это установлено в /etc/apache2/apache2.conf
, и он также использует некоторые определения из /etc/apache2/envvars
.
Убедитесь, что “listen” пользователь и группа в вашем /etc/php/php-fpm.d/www.conf
(или в аналогичном месте или пуле PHP-FPM в вашей системе) установлены для соответствия тем, которые у вашего веб-сервера:
; Установите права для unix-сокета, если он используется. В Linux необходимо установить права на чтение/запись,
; чтобы разрешить соединения от веб-сервера. Многие
; системы, производные от BSD, позволяют соединения вне зависимости от прав. Владелец
; и группа могут быть указаны либо по имени, либо по их числовым идентификаторам.
; Значения по умолчанию: пользователь и группа устанавливаются как исполняющий пользователь
; режим устанавливается на 0660
listen.owner = http
listen.group = http
listen.mode = 0660
В зависимости от вашего веб-сервера и ОС, это могут быть http
, www-data
, httpd
или что-то другое.
Я решил эту проблему, когда я использовал
/var/run/php5-fpm.sock
вместо /tmp/
и это сработало. Но почему нельзя использовать другую папку вместо /var/run/
?
В моем случае, при изменении версии PHP, например, на PHP7.4 для конкретного сайта в Ispconfig 3.2.2, файл webxx.conf
должен был быть создан в /etc/php/7.4/fpm/pool.d/
, но вместо этого он был создан в корне /
.
Так что сейчас я просто переместил файл webxx.conf
в /etc/php/7.4/fpm/pool.d/
и перезапустил PHP7.4-fpm sudo systemctl restart php7.4-fpm
, и это работает корректно.
Ответ или решение
Ошибка 503 PHP-FPM – Попытка подключения к сокету Unix не удалась
Ошибка 503 "Service Unavailable" с сообщением о неудачной попытке подключения к сокету Unix свидетельствует о том, что веб-сервер (в вашем случае Apache) не может получить доступ к PHP-FPM через указанный сокет. Ваша конфигурация, судя по приведенным логам и настройкам, имеет несколько направлений для диагностики и исправления проблемы. Давайте подробнее рассмотрим основные возможные причины и способы их решения.
1. Проверка конфигурации сокета
Согласно логам, Apache пытается подключиться к сокету /tmp/php56-fpm.sock
, который существует, но у него могут быть неправильные права доступа. Ваша команда ls -l /tmp/php56-fpm.sock
показывает, что права установлены следующим образом: -rw-rw----. 1 apache apache
. Это означает, что доступ к сокету имеют только пользователь apache
и группа apache
.
Поскольку apache
и php-fpm
могут работать от разных пользователей, необходимо убедиться, что они принадлежат к одной группе или что конфигурация PHP-FPM позволяет доступ к сокету.
2. Изменение конфигурации PHP-FPM
В файле конфигурации PHP-FPM (например, www.conf
), который находится в /etc/php-fpm.d/
или аналогичном каталоге, вами должны быть заданы правильные параметры для сокета:
listen = /tmp/php56-fpm.sock
listen.owner = apache
listen.group = apache
listen.mode = 0660
Убедитесь, что listen.owner
и listen.group
соответствуют учетной записи пользователя вашего веб-сервера. После внесения изменений перезапустите PHP-FPM:
sudo systemctl restart php-fpm
3. Проблемы с конфиденциальностью PHP-FPM
На CentOS 7 по умолчанию Apache запускается с параметром PrivateTmp=true
, что означает, что Apache создаёт собственный подкаталог в /tmp
, в котором не может видеть файлы, созданные другими процессами. Это может быть причиной, по которой ваша попытка подключения к сокету не удаётся. Чтобы решить эту проблему, рекомендуется изменить местоположение сокета на более подходящее, например, на /var/run/
.
Пример изменения конфигурации:
listen = /var/run/php56-fpm.sock
Не забудьте также создать соответствующие каталоги и задать правильные права доступа:
sudo mkdir -p /var/run/php
sudo chown apache:apache /var/run/php
sudo chmod 770 /var/run/php
Также не забудьте перезапустить как PHP-FPM, так и Apache.
4. Diagnostics and Further Considerations
Если ошибка 503 сохраняется, выполните следующее:
-
Проверьте статус PHP-FPM для получения возможных ошибок:
sudo systemctl status php-fpm
-
Проверьте логи PHP-FPM (обычно находятся в
/var/log/php-fpm/www-error.log
) для нахождения дополнительных подсказок по ошибкам. -
Если вы недавно обновили Apache, убедитесь, что ваша версия фактически поддерживает настройки сокета, используемые в вашей конфигурации.
Заключение
Ошибка 503 при подключении к сокету Unix значительно зависит от конфигурации вашего веб-сервера и PHP-FPM. Следуя предложенным рекомендациям, вы должны быть в состоянии диагностировать и исправить проблему. Важно проверить совместимость прав пользователей и групп, а также местоположения сокета, чтобы обеспечить правильную работу вашего веб-приложения.