Nginx melempar 404 hanya pada skrip php menggunakan php-fpm


11

Saya telah menginstal server pengujian menggunakan nginx+ php-fpm. Saya sudah mencoba semua hal berikut:

Nginx + Php5-fpm tidak merender file php

nginx + php fpm -> 404 halaman php - file tidak ditemukan

Saat mengakses file PHP, nginx melempar kesalahan 404

Ringkas apa yang saya coba:

  • Menginstal ulang.
  • Mengubah hak istimewa skrip (ubah ke 0777).
  • fastcgi_intercept_errors on.
  • Memeriksa rootdirektif di tingkat: server, locationdan location ~ \.php.
  • Memeriksa fastcgi_param SCRIPT_FILENAMEarahan.

Server mengembalikan 404 .phpskrip (dan hanya pada) . Saya dapat mengubah nama mereka menjadi .htmldan mereka akan baik-baik saja. Bagaimana saya bisa melakukan ini?

Ini milik saya nginx.conf:

user nginx;
worker_processes 1;

error_log  /var/log/nginx/error.log;

pid        /run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    keepalive_timeout  2;

    include /etc/nginx/conf.d/*.conf;

    index   index.html index.htm;

    server {
        listen       80;
        server_name  _;
        root         /var/www/html;

        location / {
            root /var/www/html;
            index index.php index.html index.htm;
        }

        error_page  404              /404.html;
        location = /40x.html {
            #root /var/www/html;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            #root /var/www/html;
        }

        location ~ \.php$ {
            root           /var/www/html;
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass   unix:/var/run/php5-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }


    }

}

Jawaban:


14

Selesaikan itu. Ternyata masalahnya adalah izin yang ditetapkan pada soket tempat php mendengarkan. Aku hanya harus mengubah direktif disebut listen.modedi/etc/php-fpm.d/www.conf

listen.mode = 0750

Dan atur pengguna ke nginx:

listen.owner = nginx
listen.group = nginx

Jadi file terlihat seperti ini:

srwxr-x---. 1 nginx nginx 0 jul  8 08:59 /var/run/php5-fpm.sock

Karena saya menggunakan soket unix bukan port tcp:

listen = /var/run/php5-fpm.sock;

Juga, saya mendapatkan 404alih-alih 500atau 503karena saya www.confdikonfigurasikan untuk mengarahkan kesalahan ke halaman kustom , dan karena mereka tidak ada di sana, saya mendapatkan 404.

Edit:

Tampaknya di sebagian besar versi terbaru distribusi nginx di Fedora (Fedora 22, 23), nginx menggunakan pengguna apache secara default, dan soket diatur ke apache pengguna juga, sehingga tidak diperlukan konfigurasi lebih lanjut.


Benar, Anda harus mengontrol: - Apa yang dijalankan pengguna / grup nginx (atau server web apa pun) - Apa yang dijalankan pengguna / grup php-fpm
Dmitry Dubovitsky

0

Saya Benar-benar mendapat kesalahan "Tidak Ditemukan" karena buku yang saya baca memberi saya string pencocokan yang salah untuk jalur /php_statusyang telah saya konfigurasi di php-fpm 7.0.x (saat ini 7.0.19) dan di nginx 1.12 (saat ini 1.12.0)

Ini dia /etc/php/7.0/fpm/pool.d/{config}

pm.status_path = /php_status

Ini adalah konfigurasi untuk defaultdi /etc/nginx/sites-available(saya di Ubuntu)

server {
  listen 80 default;
  root /var/www;

  index index.html index.htm default.html;
  access_log /dev/null;
  error_log /dev/null;

  location / {
    try_files $uri $uri/ =404;
  }

  location /php_status {
    fastcgi_pass unix:/var/run/php7.0-fpm.sock;
    # fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    include fastcgi_params;
    allow 127.0.0.1;
    deny all;
  }
}

Catatan: Berikut ini dirancang agar /php_statustidak tersedia untuk umum di internet (PHP juga tidak dilayani atau tidak disiapkan untuk host default). Ini juga termasuk fastcgi_passarahan untuk tcp dan unix-socket php-fpm

Anda juga harus menjalankan dua perintah berikut setelah

sudo service nginx reload
sudo service php7.0-fpm restart

Untuk memverifikasi coba jalankan

curl http://127.0.0.1/php_status
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.