Ошибка nginx при подключении к php5-fpm.sock завершилась ошибкой (13: Отказано в доступе)


290

Я обновляю nginx до 1.4.7 и php до 5.5.12 , после этого я получил ошибку 502 . До обновления все отлично работает.

Nginx-error.log

2014/05/03 13:27:41 [crit] 4202#0: *1 connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied) while connecting to upstream, client: xx.xxx.xx.xx, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "xx.xx.xx.xx"

nginx.conf

user  www www;
worker_processes  1;

        location / {
            root   /usr/home/user/public_html;
            index  index.php index.html index.htm;
        }
        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME    /usr/home/user/public_html$fastcgi_script_name;
            include fastcgi_params;
        }

3
Этот отчет об ошибке объясняет, почему это происходит: bugs.php.net/bug.php?id=67060
Мэтт Купер

1
Каждый приходит сюда из убунту 14 до 16 обновления вы должны изменить носок к UNIX: /var/run/php/php7.0-fpm.sock
Karussell

Ответы:


626

У меня была похожая ошибка после обновления php. PHP исправил ошибку безопасности, когда oимел rwразрешение на файл сокета.

  1. Откройте /etc/php5/fpm/pool.d/www.confили /etc/php/7.0/fpm/pool.d/www.conf, в зависимости от вашей версии.
  2. Раскомментируйте все строки разрешений, например:

    listen.owner = www-data
    listen.group = www-data
    listen.mode = 0660
  3. Перезапустите fpm - sudo service php5-fpm restartилиsudo service php7.0-fpm restart

Примечание : если ваш веб-сервер работает от имени пользователя, отличного от www-data, вам необходимо соответствующим образом обновить www.confфайл


11
Учитывая, что это делает сокет доступным для записи абсолютно всем, я не могу не думать, что это ужасное решение.
Шадур

11
Этот подход восстанавливает небезопасную конфигурацию по умолчанию, исправленную в bugs.php.net/bug.php?id=67060 - вместо этого рассмотрите исправление listen.owner, предложенное artooro.
Крис Берджесс

2
Очень запутанно. Почему бы не отредактировать свой ответ, чтобы он был правильным, (Перейти к / etc ...), а затем прокомментировать, как существует менее безопасный способ, который работает только до перезагрузки (Перейти к / var / ..).
SamGoody

1
@Tecnocat Почему это менее безопасно? Я думаю, что они одинаковы. www-data и 660. Итак, я не понимаю, в чем дело?
Ксандер

13
sudo usermod -aG www-data nginxпозволяет nginx получить доступ к файлу
AnthumChris

107

Все исправления, упомянутые в настоящее время здесь, в основном, снова и снова дают дыру в безопасности.

В итоге я добавил следующие строки в файл конфигурации PHP-FPM.

listen.owner = www-data
listen.group = www-data

Убедитесь, что www-data - это пользователь, от имени которого работает работник nginx. Для Debian это www-данные по умолчанию.

Выполнение этого не приводит к проблеме безопасности, которую должно было исправить это изменение .


16
Чтобы проверить имя пользователя nginxps aux|grep nginx
SamGoody

2
В Ubuntu по адресу /etc/php5/fpm/php.ini
Экстрактор реальности

1
@RealityExtractor Я так не думаю. Этот файл содержит только общие настройки PHP, ничего не связанного с менеджером процессов FPM.
Мартейн Химельс

4
Мне также пришлось удалить вручную /var/run/php5-fpm.sock, так как он был уже создан www-data. Просто хедз-ап ...
Гиль Беркерс

1
Это правильное решение с точки зрения безопасности.
jschorr

45

Решение @ Xander работает, но не сохраняется после перезагрузки.

Я обнаружил , что мне пришлось изменить , listen.modeчтобы 0660в /etc/php5/fpm/pool.d/www.conf.

Образец с www.conf:

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions. 
; Default Values: user and group are set as the running user
;                 mode is set to 0660
;listen.owner = www-data
;listen.group = www-data
;listen.mode = 0660

Редактировать: Согласно @Chris Burgess, я изменил это на более безопасный метод.

Я удалил комментарий для listen.mode, .group и .owner:

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

/ var / run содержит только информацию о работающей системе с момента последней загрузки, например, вошедшие в систему пользователи и работающие демоны. ( http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard#Directory_structure ).

Примечание:

Мои php5-fpm -vотчеты: PHP 5.4.28-1+deb.sury.org~precise+1. Проблема действительно произошла и после недавнего обновления.


5
Этот подход восстанавливает небезопасную конфигурацию по умолчанию, исправленную в bugs.php.net/bug.php?id=67060 - вместо этого рассмотрите исправление listen.owner, предложенное artooro.
Крис Берджесс

Если listen.acl_groupsустановлено, listen.ownerи listen.groupигнорируются. Я установил listen.acl_groups =, затем проблема 502 / разрешения исчезла. Обнаружив его после раскомментирования listen.строк, как указано выше, проблема 502 не исчезла, и было systemctl status php-fpmпоказано предупреждение WARNING: [pool www] ACL set, listen.owner = 'nobody' is ignored.
idoimaging

37

Если вы попробовали все в этом посте, но не смогли заставить PHP работать, это то, что исправило это для моего случая:

Убедитесь, что эти строки не закомментированы в /etc/php5/fpm/pool.d/www.conf:

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

Убедитесь, что / etc / nginx / fastcgi_params выглядит следующим образом:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  PATH_INFO          $fastcgi_script_name;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

Эти две строки отсутствовали в моем / etc / nginx / fastcgi_params, убедитесь, что они есть!

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  PATH_INFO          $fastcgi_script_name;

Затем перезапустите php5-fpm и nginx. Должен сделать свое дело.


2
Спасибо вам большое! Я терял все свои надежды, это спасло мою задницу.
Диего Кастро

1
Ты мой герой, ты спас день!
jeppeb

1
Нет слов, которые могли бы описать, как я благодарен! После обновления пакетов все пошло капутом, и это спасло день.
Никола Прокопич

Я хочу дать вам больше одного +
g9m29

28

На самом деле, «listen.mode» должен быть: «0660», а не «0666», как «Другое для записи» или «Другое для чтения», здесь никогда не будет хорошим выбором.

Поэтому постарайтесь выяснить, под каким пользователем / группой работает ваш веб-сервер. Я использую CentOs, и он запускается от имени пользователя "nginx". Поэтому добавьте в свой php-fpm.conf:

listen.owner = nginx
listen.group = nginx
listen.mode = 0660

наконец перезапустите php-fpm


Как бы то ни было, в моей системе Ubuntu 12.04 есть пользователь и группа www-data.
Брэд

1
Для меня в CentOS это помогло установить пользователя как «nobody», а группу как «nginx». Возможно, это не значительное улучшение, но я бы предпочел предоставить как можно более ограниченные разрешения.
Kzqai

23

Проверьте, какой пользователь запускает nginx. Начиная с Ubuntu 12.04, nginx запускается пользователем nginx, который не является членом группы www-data.

usermod -a -G www-data nginx

и перезапуск демонов nginx и php5-fpm решает проблему.


Это исправление кажется самым чистым и безопасным. Работал на Ubuntu 14.04, Nginx 1.7.10, PHP 5.5.9-1ubuntu4.6 (fpm-fcgi)
AnthumChris

12

В качестве альтернативы расширению прав доступа в вашей конфигурации php, вы можете изменить пользователя, указанного в вашей конфигурации nginx.

В первой строке вашего выдержки из nginx.conf пользователь и группа указаны как www и www соответственно.

user  www www;

Между тем, ваш php config, вероятно, указывает пользователя и группу www-данных:

listen.owner = www-data
listen.group = www-data

Вы можете изменить строку в вашем nginx.conf на любую из следующих, затем:

user www-data www;
user www-data www-data; # or any group, really, since you have the user matching
user www www-data; # requires that your php listen.mode gives rw access to the group

Большое спасибо!
Алин Матос

Большое спасибо! Изменить nginx.conf необходимо.
LCB

7

Необходимо также учитывать ваши индивидуальные пулы FPM, если таковые имеются.

Я не мог понять, почему ни один из этих ответов не работал для меня сегодня. Это был сценарий «установил и забыл» для меня, когда я забыл, что listen.user и listen.group дублируются для каждого пула.

Если вы использовали пулы для разных учетных записей пользователей, как я, где каждая учетная запись пользователя владеет своими процессами и сокетами FPM, установка только параметров конфигурации listen.owner и listen.group по умолчанию для nginx просто не будет работать. И очевидно, что позволить 'nginx' владеть ими всем тоже недопустимо.

Для каждого пула убедитесь, что

listen.group = nginx

В противном случае вы можете оставить владение бассейном и тому подобное в одиночку.


Спасибо. Если Ngnix работает для разных учетных записей, его следует изменить следующим образом: «listen.group = nginx»
MURATSPLAT

6

Я только что получил эту ошибку снова сегодня, когда я обновил свой компьютер (с обновлениями для PHP) под управлением Ubuntu 14.04 . Файл конфигурации дистрибутива /etc/php5/fpm/pool.d/www.confв порядке и не требует никаких изменений в настоящее время.

Я обнаружил следующие ошибки:

dmesg | grep php
[...]
[ 4996.801789] traps: php5-fpm[23231] general protection ip:6c60d1 sp:7fff3f8c68f0 error:0 in php5-fpm[400000+800000]
[ 6788.335355] traps: php5-fpm[9069] general protection ip:6c5d81 sp:7fff98dd9a00 error:0 in php5-fpm[400000+7ff000]

Странно было то, что у меня есть 2 сайтов , работающих , которые используют PHP-FPM на этой машине один был отлично работает , а другой (Крошечный Крошечные RSS установки) дал мне 502, где и были отлично работает до того .

Я сравнил оба конфигурационных файла и обнаружил, что их fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;не хватает для затронутого сайта.

Оба файла конфигурации теперь содержат следующий блок и снова работают нормально:

location ~ \.php$ {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include /etc/nginx/snippets/fastcgi-php.conf;
}

Обновить

Следует отметить, что Ubuntu поставляет два файла параметров, связанных с fastcgi, а также фрагмент конфигурации, который доступен начиная с Vivid, а также в версии PPA . Решение было обновлено соответственно.

Разница между файлами параметров fastcgi:

$ diff -up fastcgi_params fastcgi.conf
--- fastcgi_params      2015-07-22 01:42:39.000000000 +0200
+++ fastcgi.conf        2015-07-22 01:42:39.000000000 +0200
@@ -1,4 +1,5 @@

+fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
 fastcgi_param  QUERY_STRING       $query_string;
 fastcgi_param  REQUEST_METHOD     $request_method;
 fastcgi_param  CONTENT_TYPE       $content_type;

Фрагмент конфигурации в /etc/nginx/snippets/fastcgi-php.conf

# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

3
Большое спасибо. У меня та же проблема. Странно, что в комплект не входит эта строка. Я просто добавляю его в / etc / nginx / fastcgi_params и все снова работает.
Bukashk0zzz

5

Следующее простое исправление сработало для меня, обойдя возможные проблемы с разрешениями в сокете.

В вашей конфигурации nginx установите fastcgi_pass на:

fastcgi_pass   127.0.0.1:9000;

Вместо того

fastcgi_pass   /var/run/php5-fpm.sock;

Это должно соответствовать параметру listen = в /etc/php5/fpm/pool.d/www.conf, поэтому также установите это значение:

listen = 127.0.0.1:9000;

Затем перезапустите php5-fpm и nginx.

service php5-fpm restart

И

service nginx restart

Для получения дополнительной информации см .: https://wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm/


Хотя это может привести к возникновению проблемы, это не решение проблемы с носком.
Крис

5

Проблема в моем случае заключалась в том, что веб-сервер Nginx работал от имени пользователя nginx, а пул работал от имени пользователя www-data.

Я решил проблему, изменив пользователя, в котором работает Nginx, в /etc/nginx/nginx.confфайле (в вашей системе он может быть другим, у меня Ubuntu 16.04.1)

Изменить: user nginx;

чтобы: user www-data;

затем перезапустите Nginx: service nginx restart


4

Просто, но работает ..

listen.owner = nginx
listen.group = nginx

chown nginx:nginx /var/run/php-fpm/php-fpm.sock

Как я понимаю, это не переживет перезагрузку, так что это скорее временное исправление.
Крис

4

Я исправил ту же проблему в Amazon Linux AMI 2016.09 (Centos 7), выполнив следующие действия.

Откройте ваши файлы www.conf (Пример: sudo nano /etc/php-fpm.d/www.conf) Наконец, найдите строки, которые устанавливают listen.owner и listen.group, и измените их значения с «nobody» на «nginx». «:

listen.owner = nginx
listen.group = nginx
listen.mode = 0666

Наконец, найдите строки, которые устанавливают пользователя и группу, и измените их значения с «apache» на «nginx»:

user = nginx
group = nginx

Перезапустите php-fpm (sudo service php-fpm restart)


2
Используйте 660 вместо 666. 666 небезопасен и был исправлен этим патчем bugs.php.net/…
Xander

3

Самое важное, что пользователь использует nginx, тогда вам нужно указать и его

в вашем nginx.conf

user www-data;
worker_processes  1;

        location / {
            root   /usr/home/user/public_html;
            index  index.php index.html index.htm;
        }
        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME    /usr/home/user/public_html$fastcgi_script_name;
            include fastcgi_params;
        }

в вашем www.conf

listen.owner = www-data
listen.group = www-data
;listen.mode = 0660

в вашем случае пользователь и группа "www", поэтому просто замените его.

  • перезапустите nginx и php fpm

2

Если у вас разные пулы для каждого пользователя, убедитесь, что пользователь и группа установлены правильно в файле конфигурации. Вы можете найти пользователя nginx в файле /etc/nginx/nginx.conf. Группа nginx такая же, как и у пользователя nginx.

user = [pool-user]
group = [pool-group]
listen.owner = [nginx-user]
listen.group = [nginx-group]

2

Также проверьте SELINUX (/ etc / selinux):

# getenforce

выключи это:

# setenforce 0

1
Вы никогда не должны снижать безопасность системы, чтобы заставить что-то работать, вместо этого используйте один из множества вариантов в других ответах, чтобы решить вашу проблему. Не отключайте selinux без веских на то причин!
SlyDave

2

В моем случае php-fpm вообще не работал, поэтому мне просто нужно было запустить службу 😂

service php7.3-fpm start
#on ubuntu 18.04

2

Просто посмотрите /etc/php5/php-fpm.conf pid = /var/run/php5-fpm.pidфайл IS PID

В файле /etc/php5/fpm/pool.d/www.conf

listen = /var/run/php5-fpm.sock IS SOCKET file

если вы pid равным listen ( pid = /var/run/php5-fpm.sock and listen = /var/run/php5-fpm.sock) -> неверные настройки и закончите настройку/etc/php5/fpm/pool.d/www.conf

user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

2

У меня была похожая ошибка.

Все рекомендации не помогли.

Помогла только замена www-данных на nginx:

$ sudo chmod nginx:nginx /var/run/php/php7.2-fpm.sock

/var/www/php/fpm/pool.d/www.conf

user = nginx
group = nginx
...
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Эй @ Александр, тебе нужно использовать команду chown, чтобы сменить владельца на nginx. Это действительно очень помогло мне.
Пратик Гела

1

Просто добавьте, что в CentOS (и, возможно, в Red Hat и Fedora) файл, для которого необходимо изменить разрешения, находится по адресу:

/etc/php-fpm.d/www.conf


1

После обновления с Ubuntu 14.04 lts до Ubuntu 16.04 lts я нашел еще одну причину этой ошибки, которую я не видел раньше.

Во время процесса обновления я каким-то образом полностью потерял свой исполняемый файл php5-fpm. Все файлы конфигурации были целы, и мне потребовалось некоторое время, чтобы понять, что на service php5-fpm startсамом деле процесс не запускается, так как он не показывает никаких ошибок.

Мой момент пробуждения наступил, когда я заметил, что в нем нет файла сокета /var/run/php5-fpm.sock, как это должно быть, и при этом не netstat -anотображались процессы, прослушивающие порт, который я использовал в качестве альтернативы, пытаясь решить эту проблему. Поскольку файл / usr / sbin / php5-fpm также не существовал, я, наконец, был на правильном пути.

Чтобы решить эту проблему, я обновил php с версии 5.5 до 7.0. apt-get install php-fpmсделал трюк как побочный эффект. После этого и установки других необходимых пакетов все нормализовалось.


Однако это решение может иметь свои проблемы . Поскольку php развился совсем немного, возможно, что программное обеспечение сломается невообразимым образом. Поэтому, хотя я и пошел по этому пути, вы можете захотеть сохранить версию, которая вам нравится, еще ненадолго.

К счастью, кажется, что есть хороший способ для этого , как описано на сайте «Настройка Windows»:

add-apt-repository ppa:ondrej/php
apt-get purge php5-common
apt-get update
apt-get install php5.6

Более точное решение, каким бы оно ни было, я не пробовал. Я ожидаю, что следующие несколько дней скажут мне, должен ли я иметь.


0

Я несколько раз менял ОС на своем сервере, пытаясь получить наиболее удобную систему.

Раньше он работал очень хорошо в большинстве случаев, но, наконец, я получил ошибку 502 Gateway.

Я использую сокет php fpm для каждой учетной записи вместо того, чтобы хранить один и тот же для всех. Таким образом, если происходит сбой, по крайней мере, другие приложения продолжают работать.

Раньше у меня были пользовательские и групповые www-данные. Но это изменилось на моем Debian 8 с последней версией Nginx 1.8 и php5-fpm.

Пользователь по умолчанию - nginx, также как и группа. Чтобы убедиться в этом, лучше всего проверить файлы / etc / group и / etc / passwd. Они не могут лгать.

Именно там я обнаружил, что теперь у меня есть nginx в обоих и больше нет www-данных.

Возможно, это может помочь некоторым людям, все еще пытающимся выяснить, почему сообщение об ошибке продолжает появляться.

Это сработало для меня.


0

Тем, кто перепробовал все в этой теме и до сих пор застрял: это решило мою проблему. Я обновил /usr/local/nginx/conf/nginx.conf

  1. Раскомментируйте высказывание user

  2. сделай www-dataтак чтобы стало:user www-data;

  3. Сохраните его (требуется root-доступ)

  4. Перезапустите nginx


0

Если у вас есть декларации

pid = /run/php-fpm.pid

и

listen = /run/php-fpm.pid

в разных конфигурационных файлах, root будет владельцем этого файла.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.