kesalahan nginx terhubung ke php5-fpm.sock gagal (13: Izin ditolak)

290

Saya memperbarui nginx ke 1.4.7 dan php ke 5.5.12 , Setelah itu saya mendapatkan kesalahan 502 . Sebelum saya perbarui semuanya berfungsi dengan baik.

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;
        }
Peter
sumber
3
Laporan bug ini menjelaskan mengapa hal ini terjadi: bugs.php.net/bug.php?id=67060
Matt Cooper
1
Semua orang yang datang dari upgrade ubuntu 14-16 Anda perlu mengubah kaus kaki untuk unix: /var/run/php/php7.0-fpm.sock
Karussell

Jawaban:

626

Saya memiliki kesalahan serupa setelah pembaruan php. PHP memperbaiki bug keamanan di mana oada rwizin untuk file socket.

  1. Buka /etc/php5/fpm/pool.d/www.confatau /etc/php/7.0/fpm/pool.d/www.conf, tergantung versi Anda.
  2. Batalkan komentar pada semua jalur izin, seperti:

    listen.owner = www-data
    listen.group = www-data
    listen.mode = 0660
  3. Mulai ulang fpm - sudo service php5-fpm restartatausudo service php7.0-fpm restart

Catatan : jika server web Anda berjalan sebagai pengguna selain www-data, Anda harus memperbarui www.conffile yang sesuai

Xander
sumber
11
Mengingat hal ini membuat soket dapat ditulisi oleh semua orang, saya berpikir bahwa ini adalah solusi yang mengerikan.
Shadur
11
Pendekatan ini mengembalikan konfigurasi default tidak aman yang diselesaikan dalam bugs.php.net/bug.php?id=67060 - sebagai gantinya pertimbangkan perbaikan listen.owner yang disarankan oleh artooro.
Chris Burgess
2
Sangat membingungkan. Mengapa tidak mengedit jawaban Anda menjadi benar, (Ke / etc ...) dan kemudian berkomentar tentang bagaimana ada cara yang kurang aman yang hanya berfungsi sampai reboot (Pergi ke / var / ..).
SamGoody
1
@Tecnocat Mengapa kurang aman? Saya pikir mereka sama. www-data dan 660. Jadi, saya tidak mengerti apa yang salah?
Xander
13
sudo usermod -aG www-data nginxmemungkinkan nginx untuk mengakses file
AnthumChris
107

Semua perbaikan yang saat ini disebutkan di sini pada dasarnya memungkinkan lubang keamanan lagi.

Apa yang akhirnya saya lakukan adalah menambahkan baris berikut ke file konfigurasi PHP-FPM saya.

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

Pastikan bahwa www-data sebenarnya adalah pengguna yang dijalankan oleh pekerja nginx. Untuk debian, ini adalah www-data secara default.

Melakukannya dengan cara ini tidak mengaktifkan masalah keamanan yang seharusnya diperbaiki oleh perubahan ini .

Arto
sumber
16
Untuk memeriksa nama pengguna nginxps aux|grep nginx
SamGoody
2
Di Ubuntu di /etc/php5/fpm/php.ini
Reality Extractor
1
@ RealityExtractor kurasa tidak. File itu hanya berisi pengaturan PHP umum, tidak ada yang terkait dengan manajer proses FPM.
Martijn Heemels
4
Bagi saya, saya juga harus menghapus secara manual /var/run/php5-fpm.sock, karena sudah dibuat oleh www-data. Hanya kepala ...
Giel Berkers
1
Ini adalah perbaikan yang tepat, keamanan-bijaksana.
jschorr
45

Solusi @ Xander berfungsi, tetapi tidak bertahan setelah reboot.

Saya menemukan bahwa saya harus mengubah listen.modeke 0660dalam /etc/php5/fpm/pool.d/www.conf .

Contoh dari 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

Edit: Per @Chris Burgess, saya telah mengubah ini menjadi metode yang lebih aman.

Saya menghapus komentar untuk listen.mode, .group dan .owner:

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

/ var / run Hanya menyimpan informasi tentang sistem yang berjalan sejak boot terakhir, misalnya, pengguna yang sedang masuk dan menjalankan daemon. ( http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard#Directory_structure ).

Catatan:

Saya php5-fpm -vLaporan: PHP 5.4.28-1+deb.sury.org~precise+1. Masalahnya memang terjadi setelah pembaruan terbaru juga.

Eric C
sumber
5
Pendekatan ini mengembalikan konfigurasi default tidak aman yang diselesaikan dalam bugs.php.net/bug.php?id=67060 - sebagai gantinya pertimbangkan perbaikan listen.owner yang disarankan oleh artooro.
Chris Burgess
Jika listen.acl_groupsdiatur, listen.ownerdan listen.groupdiabaikan. Saya mengatur listen.acl_groups =, maka masalah 502 / izin hilang. Menemukannya setelah menghapus komentar listen.baris seperti di atas, masalah 502 bertahan dan systemctl status php-fpmmenunjukkan peringatan WARNING: [pool www] ACL set, listen.owner = 'nobody' is ignored.
idoimaging
37

Jika Anda telah mencoba segalanya dalam posting ini tetapi tidak berhasil membuat PHP berfungsi, inilah yang memperbaikinya untuk kasus saya:

Pastikan Anda memiliki baris-baris ini uncommented di /etc/php5/fpm/pool.d/www.conf:

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

Pastikan /etc/nginx / fastcgi_params terlihat seperti ini:

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;

Dua baris ini hilang dari / etc / nginx / fastcgi_params saya, pastikan semuanya ada di sana!

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

Kemudian, restart php5-fpm dan nginx. Sebaiknya lakukan triknya.

aMMT
sumber
2
Terima kasih banyak! Saya kehilangan semua harapan saya, ini menyelamatkan saya.
Diego Castro
1
Anda adalah pahlawan saya, Anda menyelamatkan hari itu!
jeppeb
1
Tidak ada kata yang bisa menggambarkan betapa bersyukurnya saya! Setelah memperbarui paket semuanya berjalan kaput dan ini menyelamatkan hari.
Nikola Prokopić
Saya ingin memberi Anda lebih dari satu +
g9m29
28

Faktanya, "listen.mode" seharusnya: "0660" dan bukan "0666" seperti Other Writable atau Other Readable tidak pernah merupakan pilihan yang baik di sini.

Jadi cobalah untuk mencari tahu pengguna / grup mana yang dijalankan oleh server web Anda. Saya menggunakan CentOs dan dijalankan sebagai pengguna "nginx" Jadi, tambahkan ke php-fpm.conf Anda:

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

akhirnya restart php-fpm

CRHenkie
sumber
Untuk apa nilainya, pada sistem Ubuntu 12.04 saya, pengguna dan grup www-data.
Brad
1
Bagi saya di CentOS, ini berfungsi untuk mengatur pengguna sebagai "tidak ada" dan grup sebagai "nginx". Mungkin bukan perbaikan besar, tapi saya lebih suka memberikan izin sebatas mungkin.
Kzqai
23

Periksa pengguna mana yang menjalankan nginx. Pada Ubuntu 12,04 nginx dijalankan oleh pengguna nginx yang bukan anggota grup data-www.

usermod -a -G www-data nginx

dan me-restart dagin nginx dan php5-fpm memecahkan masalah.

Çağatay Gürtürk
sumber
Perbaikan ini tampaknya yang terbersih, keamanan bijaksana. Bekerja di Ubuntu 14.04, Nginx 1.7.10, PHP 5.5.9-1ubuntu4.6 (fpm-fcgi)
AnthumChris
12

Alternatif untuk memperluas izin dalam konfigurasi php Anda, Anda bisa mengubah pengguna yang ditentukan dalam konfigurasi nginx Anda.

Pada baris pertama kutipan nginx.conf Anda di atas, pengguna dan grup masing-masing ditentukan sebagai www dan www.

user  www www;

Sementara itu, konfigurasi php Anda mungkin menentukan pengguna dan grup data-www:

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

Anda dapat mengubah baris di nginx.conf Anda, ke salah satu dari yang berikut, kemudian:

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
JellicleCat
sumber
Terima kasih banyak!
Aline Matos
Terima kasih banyak! Diperlukan perubahan nginx.conf.
LCB
7

Pertimbangan juga harus diberikan pada kumpulan FPM individual Anda, jika ada.

Saya tidak tahu mengapa tidak ada jawaban yang bekerja untuk saya hari ini. Ini adalah skenario set-and-forget bagi saya, di mana saya lupa bahwa listen.user dan listen.group digandakan berdasarkan basis per-pool.

Jika Anda menggunakan kumpulan untuk akun pengguna yang berbeda seperti yang saya lakukan, di mana setiap akun pengguna memiliki proses dan soket FPM, hanya menetapkan opsi default listen.owner dan listen.group untuk 'nginx' tidak akan berfungsi. Dan jelas, membiarkan 'nginx' memiliki semuanya juga tidak dapat diterima.

Untuk setiap kolam , pastikan itu

listen.group = nginx

Jika tidak, Anda dapat meninggalkan kepemilikan kolam dan semacamnya sendirian.

Ted Phillips
sumber
Terima kasih. Jika Ngnix berfungsi untuk akun pengguna yang berbeda, harus diubah seperti ini "listen.group = nginx"
MURATSPLAT
6

Saya baru saja mendapatkan kesalahan ini hari ini karena saya memperbarui mesin saya (dengan pembaruan untuk PHP) yang menjalankan Ubuntu 14.04 . File konfigurasi distribusi /etc/php5/fpm/pool.d/www.confbaik-baik saja dan tidak memerlukan perubahan apa pun saat ini.

Saya menemukan kesalahan berikut:

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]

Yang aneh adalah bahwa saya memiliki 2 situs yang berjalan yang menggunakan PHP-FPM pada mesin ini satu berjalan dengan baik dan yang lainnya (instalasi Tiny Tiny RSS) memberi saya 502, di mana keduanya telah berjalan dengan baik sebelumnya .

Saya membandingkan kedua file konfigurasi dan menemukan yang fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;hilang untuk situs yang terpengaruh.

Kedua file konfigurasi sekarang berisi blok berikut dan berjalan dengan baik lagi:

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

Memperbarui

Perlu dicatat bahwa Ubuntu mengirimkan dua file parameter terkait fastcgi dan juga potongan konfigurasi yang tersedia sejak Vivid dan juga dalam versi PPA . Solusinya telah diperbarui sesuai.

Perbedaan dari file parameter 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;

Cuplikan konfigurasi dalam /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;
LiveWireBT
sumber
3
Terima kasih banyak. Saya memiliki masalah yang sama. Sungguh aneh bahwa dalam paket tidak termasuk baris ini. Saya hanya menambahkannya ke / etc / nginx / fastcgi_params dan semua berfungsi lagi sekarang.
Bukashk0zzz
5

Perbaikan sederhana berikut ini berfungsi untuk saya, memintas kemungkinan masalah izin dengan soket.

Di nginx config Anda, set fastcgi_pass ke:

fastcgi_pass   127.0.0.1:9000;

Dari pada

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

Ini harus cocok dengan parameter listen = di /etc/php5/fpm/pool.d/www.conf, jadi setel ini ke:

listen = 127.0.0.1:9000;

Kemudian restart php5-fpm dan nginx

service php5-fpm restart

Dan

service nginx restart

Untuk info lebih lanjut, lihat: https://wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm/

supershnee
sumber
Meskipun ini dapat meningkatkannya, itu bukan solusi untuk memperbaiki masalah kaus kaki.
Chris
5

Masalah dalam kasus saya adalah bahwa server web Nginx berjalan sebagai pengguna nginx dan kolam berjalan sebagai data pengguna www.

Saya memecahkan masalah dengan mengubah Nginx berjalan di pengguna di /etc/nginx/nginx.conffile (bisa berbeda pada sistem Anda, milik saya adalah Ubuntu 16.04.1)

Perubahan: user nginx;

untuk: user www-data;

kemudian mulai kembali Nginx: service nginx restart

EarthMind
sumber
4

Sederhana tapi berhasil ..

listen.owner = nginx
listen.group = nginx

chown nginx:nginx /var/run/php-fpm/php-fpm.sock
Terry Lin
sumber
Seperti yang saya mengerti, ini tidak akan selamat dari reboot, jadi lebih dari perbaikan sementara.
Chris
4

Saya telah memperbaiki masalah yang sama di Amazon Linux AMI 2016.09 (Centos 7) dengan mengambil langkah-langkah berikut.

Buka file www.conf Anda (Contoh: sudo nano /etc/php-fpm.d/www.conf) Terakhir, temukan baris yang mengatur listen.owner dan listen.group dan ubah nilainya dari "tidak ada" menjadi "nginx ":

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

Terakhir, cari baris yang mengatur pengguna dan grup dan ubah nilainya dari "apache" ke "nginx":

user = nginx
group = nginx

Restart php-fpm (sudo service php-fpm restart)

Nanhe Kumar
sumber
2
Gunakan 660 sebagai gantinya 666. 666 tidak aman dan diperbaiki oleh patch bugs.php.net/… ini
Xander
3

Yang paling penting di sini adalah pengguna yang menggunakan nginx maka Anda perlu menentukannya juga

di nginx.conf Anda

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;
        }

di www.conf Anda

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

dalam kasus Anda, pengguna dan grup adalah "www" jadi ganti saja.

  • restart nginx dan php fpm
Erenss
sumber
2

Jika Anda memiliki kumpulan berbeda per pengguna, pastikan pengguna dan grup diatur dengan benar dalam file konfigurasi. Anda dapat menemukan pengguna nginx di file /etc/nginx/nginx.conf. Grup nginx sama dengan pengguna nginx.

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

sumber
2

Periksa juga SELINUX (/ etc / selinux):

# getenforce

matikan:

# setenforce 0
ahli alkimia
sumber
1
Anda tidak boleh memilih untuk mengurangi keamanan suatu sistem agar sesuatu berfungsi, alih-alih gunakan salah satu dari banyak opsi dalam jawaban lain untuk menyelesaikan masalah Anda. Jangan menonaktifkan selinux tanpa alasan yang sangat bagus untuk melakukannya!
SlyDave
2

Dalam kasus saya php-fpm tidak berjalan sama sekali, jadi saya baru saja memulai layanan 😂

service php7.3-fpm start
#on ubuntu 18.04
Tek Nomad
sumber
2

Lihat saja /etc/php5/php-fpm.conf pid = /var/run/php5-fpm.pidfile IS PID

Dalam file /etc/php5/fpm/pool.d/www.conf

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

jika Anda pid sama mendengarkan ( pid = /var/run/php5-fpm.sock and listen = /var/run/php5-fpm.sock) -> pengaturan yang salah dan menyelesaikan sett/etc/php5/fpm/pool.d/www.conf

user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
Bogdik
sumber
1

Untuk menambahkan, pada CentOS (dan mungkin Red Hat dan Fedora) file untuk mengubah izin ada di:

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

Adrian Stride
sumber
1

Setelah meningkatkan dari Ubuntu 14,04 lts ke Ubuntu 16,04 lts saya menemukan alasan lain untuk kesalahan ini yang belum pernah saya lihat sebelumnya.

Selama proses peningkatan, entah bagaimana saya kehilangan eksekusi php5-fpm saya sama sekali. Semua file konfigurasi masih utuh dan butuh beberapa saat untuk menyadari hal ituservice php5-fpm start itu tidak benar-benar memulai proses, karena tidak menunjukkan kesalahan.

Saat kebangkitan saya adalah ketika saya menyadari bahwa tidak ada file socket di /var/run/php5-fpm.sockdalamnya, sebagaimana seharusnya, juga tidaknetstat -an menunjukkan proses mendengarkan pada port yang saya coba sebagai alternatif ketika mencoba untuk memecahkan masalah ini. Karena file / usr / sbin / php5-fpm juga tidak ada, saya akhirnya berada di jalur yang benar.

Untuk mengatasi masalah ini, saya meningkatkan versi php dari versi 5.5 ke 7.0. apt-get install php-fpmmelakukan trik sebagai efek samping. Setelah itu dan menginstal paket lain yang diperlukan semuanya kembali normal.


Solusi peningkatan ini mungkin memiliki masalah sendiri . Karena php telah berevolusi sedikit, mungkin saja perangkat lunak akan pecah dengan cara yang tak terbayangkan. Jadi, meskipun saya telah menempuh jalan itu, Anda mungkin ingin mempertahankan versi yang Anda sukai hanya untuk sementara waktu.

Untungnya, tampaknya ada cara yang rapi untuk itu , seperti yang dijelaskan di situs Customize Windows:

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

Solusi yang lebih rapi, mungkin, saya tidak mencobanya. Saya berharap beberapa hari ke depan akan memberi tahu saya apakah saya harus melakukannya.

sankari
sumber
1

Saya memiliki kesalahan serupa.

Semua rekomendasi tidak membantu.

Satu-satunya pengganti www-data dengan nginx telah membantu:

$ 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 Gavriliuk
sumber
Hey @Alexander, Anda perlu menggunakan perintah chown untuk mengubah pemilik menjadi nginx. Ini sangat membantu saya.
Pratik Ghela
0

Saya mengubah OS di server saya beberapa kali mencoba untuk mendapatkan sistem yang paling nyaman.

Dulu bekerja dengan sangat baik sebagian besar waktu tetapi terakhir saya mendapat kesalahan Gateway 502 ini.

Saya menggunakan soket php fpm untuk setiap akun alih-alih menyimpan yang sama untuk semua. Jadi jika salah satu crash, setidaknya aplikasi lain tetap berjalan.

Saya dulu punya pengguna dan grup www-data. Tapi ini berubah pada Debian 8 saya dengan Nginx 1.8 dan php5-fpm terbaru.

Pengguna default adalah nginx dan begitu juga grup. Untuk memastikan hal ini, cara terbaik adalah memeriksa file / etc / group dan / etc / passwd. Ini tidak bisa bohong.

Di sanalah saya menemukan bahwa sekarang saya memiliki nginx di keduanya dan tidak ada lagi www-data.

Mungkin ini dapat membantu sebagian orang masih mencari tahu mengapa pesan kesalahan terus muncul.

Ini berhasil untuk saya.

Marc Quattrini
sumber
0

Bagi mereka yang mencoba semua yang ada di utas ini dan masih macet: Ini menyelesaikan masalah saya. Saya memperbarui /usr/local/nginx/conf/nginx.conf

  1. Batalkan komentar baris user

  2. membuatnya www-datajadi:user www-data;

  3. Simpan itu (diperlukan akses root)

  4. Mulai ulang nginx

Davis
sumber
0

Jika Anda memiliki deklarasi

pid = /run/php-fpm.pid

dan

dengarkan = /run/php-fpm.pid

dalam file konfigurasi yang berbeda, maka root akan menjadi pemilik file ini.

IvanTheFirst
sumber