php5-fpm.sock에 nginx 오류 연결 실패 (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
Matt Cooper

1
(16)에 우분투 14에서 여기 오는 모든 사람은 당신이 유닉스에 양말을 변경해야 업그레이드 : /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
이것이 소켓을 절대적으로 모든 사람이 쓸 수있게한다는 것을 감안할 때, 나는 이것이 끔찍한 해결책이라고 생각할 수는 없습니다.
Shadur

11
이 접근법은 bugs.php.net/bug.php?id=67060 에서 해결 된 안전하지 않은 기본 구성을 복원합니다. 대신 artooro가 제안한 listen.owner 수정을 고려하십시오.
Chris Burgess

2
매우 혼란 스럽습니다. 답을 올바르게 편집하고 (/ etc로 이동) 나중에 재부팅 할 때만 작동하는 덜 안전한 방법 (/ var / ..으로 이동)에 대한 의견을 보내십시오.
SamGoody

1
@Tecnocat 왜 덜 안전합니까? 나는 그들이 같다고 생각합니다. www-data와 660. 그래서 무엇이 잘못되었는지 이해가되지 않습니까?
Xander

13
sudo usermod -aG www-data nginxnginx가 파일에 액세스 할 수 있도록 허용
AnthumChris

107

현재 여기에 언급 된 모든 수정 사항은 기본적으로 보안 허점을 다시 가능하게합니다.

내가 한 일은 PHP-FPM 구성 파일에 다음 줄을 추가하는 것입니다.

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

www-data가 실제로 nginx 작업자를 실행중인 사용자인지 확인하십시오. 데비안의 경우 기본적으로 www-data입니다.

이렇게하면 이 변경으로 해결해야 할 보안 문제가 발생 하지 않습니다 .


16
nginx 사용자 이름을 확인하려면ps aux|grep nginx
SamGoody

2
우분투 /etc/php5/fpm/php.ini에서
Reality Extractor

1
@RealityExtractor 그렇게 생각하지 않습니다. 이 파일에는 일반적인 PHP 설정 만 포함되며 FPM 프로세스 관리자와 관련이 없습니다.
Martijn Heemels

4
나도 /var/run/php5-fpm.sock이미에 의해 생성 되었기 때문에 수동으로 삭제해야 했습니다 www-data. 그냥 머리 위로 ...
Giel Berkers

1
이것은 보안 측면에서 올바른 수정입니다.
jschorr

45

@Xander의 솔루션은 작동하지만 재부팅 후에도 지속되지 않습니다.

나는 변경 남겼 listen.mode0660에서 /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 에서 해결 된 안전하지 않은 기본 구성을 복원합니다. 대신 artooro가 제안한 listen.owner 수정을 고려하십시오.
Chris Burgess

경우 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
정말 고맙습니다! 나는 모든 희망을 잃고 있었고, 이것은 내 엉덩이를 구했습니다.
Diego Castro

1
당신은 나의 영웅이고, 당신은 하루를 구했습니다!
jeppeb

1
내가 얼마나 감사하는지 설명 할 수있는 단어는 없습니다! 패키지를 업데이트 한 후 모든 것이 잘못되어 하루를 절약했습니다.
Nikola Prokopić

나는 당신에게 하나 이상의 +
g9m29

28

실제로 "listen.mode"는 "060"이 아닌 "0660"이어야합니다. 다른 쓰기 가능 또는 기타 읽기 가능은 여기에서 좋은 선택이 아닙니다.

따라서 웹 서버가 실행되는 사용자 / 그룹을 찾으십시오. CentO를 사용하고 사용자 "nginx"로 실행되므로 php-fpm.conf에 추가하십시오.

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

마지막으로 php-fpm을 다시 시작하십시오


Ubuntu 12.04 시스템에서 사용자와 그룹은 가치가 있습니다 www-data.
Brad

1
CentOS에서는 사용자를 "nobody"로 설정하고 그룹을 "nginx"로 설정했습니다. 아마도 크게 개선되지는 않았지만 가능한 한 제한된 권한을 부여하고 싶습니다.
Kzqai

23

nginx를 실행하는 사용자를 확인하십시오. Ubuntu 12.04부터 nginx는 www-data 그룹의 구성원이 아닌 nginx 사용자가 실행합니다.

usermod -a -G www-data nginx

nginx 및 php5-fpm 데몬을 다시 시작하면 문제가 해결됩니다.


이 수정은 가장 깨끗하고 보안적인 것으로 보입니다. 우분투 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-data의 사용자와 그룹을 지정합니다.

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

대단히 감사합니다!
Aline Matos

대단히 감사합니다! 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

우분투 14.04를 실행하는 내 컴퓨터 (PHP 업데이트로)를 업데이트함에 따라 오늘이 오류가 다시 발생했습니다 . 배포 구성 파일 /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]

이상한 점은이 기계에서 PHP-FPM을 사용하는 2 개의 사이트를 실행 중이며 하나는 제대로 실행 되고 있고 다른 하나는 Tiny Tiny 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 = 매개 변수와 일치해야하므로 다음과 같이 설정하십시오.

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/


이것은 문제가 생길 수 있지만 양말 문제를 해결하기위한 솔루션은 아닙니다.
Chris

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

내가 알다시피, 이것은 재부팅 후에도 지속되지 않으므로 일시적인 수정입니다.
Chris

4

Amazon Linux AMI 2016.09 (Centos 7)에서 다음 단계를 수행하여 동일한 문제를 해결했습니다.

열려있는 www.conf의 listen.owner 및 listen.group을 설정 라인을 찾아, 마지막 : (sudo는 나노 /etc/php-fpm.d/www.conf 예)와 nginx를 "을"아무도 "에서 그 값을 변경 파일을 ":

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

마지막으로, 사용자와 그룹을 설정하고 해당 값을 "apache"에서 "nginx"로 변경하는 행을 찾으십시오.

user = nginx
group = nginx

php-fpm 재시작 (sudo service php-fpm restart)


2
666 대신 660을 사용하십시오. 666은 안전하지 않으며이
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

/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 소켓 파일

똑같이 듣다 ( 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

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는 상당히 발전 했으므로 소프트웨어가 상상할 수없는 방식으로 침입 할 가능성이 있습니다. 따라서 내가 그 길을 갔다하더라도 좋아하는 버전을 잠시 더 오래 유지하고 싶을 수도 있습니다.

운 좋게도 Customize Windows 사이트에 설명 된 것처럼 깔끔한 방법이있는 것 같습니다 .

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

더 깔끔한 솔루션은 시도하지 않았습니다. 다음 며칠 동안 내가 있어야하는지 알려줄 것으로 기대합니다.


1

내 경우에는 php-fpm이 전혀 실행되지 않았으므로 서비스를 시작해야했습니다 😂

service php7.3-fpm start
#on ubuntu 18.04

1

비슷한 오류가 발생했습니다.

모든 권장 사항이 도움이되지 않았습니다.

nginx를 사용한 유일한 교체 www-data가 도움이되었습니다.

$ 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, 소유자를 nginx로 변경하려면 chown 명령을 사용해야합니다. 이것은 정말 많은 도움이되었습니다.
Pratik Ghela


0

가장 편안한 시스템을 얻으려고 서버에서 OS를 꽤 많이 변경했습니다.

그것은 대부분의 시간 동안 매우 잘 작동했지만 마지막 으로이 502 Gateway 오류가 발생했습니다.

나는 모두를 위해 같은 것을 유지하는 대신 각 계정에 PHP fpm 소켓을 사용합니다. 따라서 하나가 충돌하면 적어도 다른 응용 프로그램은 계속 실행됩니다.

나는 사용자와 그룹 www-data를 가지고 있었다. 그러나 이것은 최신 Nginx 1.8 및 php5-fpm으로 Debian 8에서 변경되었습니다.

기본 사용자는 nginx이며 그룹도 마찬가지입니다. 이를 확인하는 가장 좋은 방법은 / etc / group 및 / etc / passwd 파일을 확인하는 것입니다. 이들은 거짓말을 할 수 없습니다.

나는 이제 더 이상 www-data가 아닌 nginx를 가지고 있음을 발견했습니다.

어쩌면 일부 사람들이 오류 메시지가 계속 나타나는 이유를 찾는 데 도움이 될 수 있습니다.

그것은 나를 위해 일했다.


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

다른 구성 파일에서 루트는이 파일의 소유자입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.