Не вдалося підключити 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
Усі, хто приходить сюди з оновлення ubuntu 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 - замість цього розглянемо виправлення, яке пропонував artooro.
Кріс Берджесс

2
Дуже заплутано. Чому б не відредагувати свою відповідь правильною (Перейти до / тощо ...), а потім прокоментувати, як існує менш безпечний спосіб, який працює лише до перезавантаження (Перейти до / 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-data за замовчуванням.

Зробити це таким чином не дозволяє проблема безпеки, яку ця зміна повинна була виправити .


16
Щоб перевірити ім'я користувача nginxps aux|grep nginx
SamGoody

2
У Ubuntu за адресою /etc/php5/fpm/php.ini
екстрактор реальності

1
@RealityExtractor Я так не думаю. Цей файл містить лише загальні параметри PHP, нічого, що стосується менеджера процесів FPM.
Martijn Heemels

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 я змінив це на більш безпечний метод.

Я видалив коментар для liste.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 - замість цього розглянемо виправлення, яке пропонував 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

Насправді, "liste.mode" має бути: "0660", а не "0666", як "Інше писане чи інше читабельне", тут ніколи не є хорошим вибором.

Тому спробуйте з’ясувати, яким користувачем / групою працює ваш веб-сервер. Я використовую CentO, і він працює як користувач "nginx" Тому додайте у ваш php-fpm.conf:

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

нарешті перезапустіть php-fpm


Чого варто, на моїй системі Ubuntu 12.04 користувач та група www-data.
Бред

1
Для мене в CentOS він працював над тим, щоб встановити користувача як "ніхто", а групу - "nginx". Можливо, це не є значним покращенням, але я вважаю за краще надавати якомога менше дозволів.
Kzqai

23

Перевірте, який користувач виконує nginx. Станом на Ubuntu 12.04 nginx працює користувачем nginx, який не є членом групи даних www.

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-конфігуратор, ймовірно, вказує користувача та групу 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, якщо такі є.

Я не міг зрозуміти, чому жодна з цих відповідей сьогодні не працює на мене. Це був сценарій встановлення та забуття для мене, коли я забув, що liste.user та liste.group дублюються на основі басейну.

Якщо ви використовували пули для різних облікових записів користувачів, як я, де кожен обліковий запис користувача має свої процеси FPM та сокети, встановлення лише параметрів конфігурації liste.owner та liste.group у параметрі "nginx" просто не працюватиме. І очевидно, дозволяти "nginx" володіти ними всім теж не прийнятно.

Для кожного басейну переконайтесь, що

listen.group = nginx

В іншому випадку ви можете залишити право власності на пул і таке в спокої.


Дякую. Якщо Ngnix працює для різних облікових записів користувачів, його слід змінити так: "liste.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;

Це має відповідати параметру прослуховування = у /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-дані користувача.

Я вирішив проблему, змінивши користувача, який працює у /etc/nginx/nginx.confфайлі Nginx (може бути різним у вашій системі, моя - 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) Нарешті, знайдіть рядки, які встановлюють liste.owner і liste.group, і змініть їх значення з "ніхто" на "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.pidIS-файл PID

У файлі /etc/php5/fpm/pool.d/www.conf

listen = /var/run/php5-fpm.sock IS SOCKET файл

якщо ви pid рівні liste ( 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

Привіт @Alexander, Вам потрібно використовувати команду 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.

Я використовую розетку 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. Збережіть його (потрібен кореневий доступ)

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


0

Якщо у вас є декларації

pid = /run/php-fpm.pid

і

прослухати = /run/php-fpm.pid

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.