Nginx chỉ ném 404 trên các tập lệnh php bằng cách sử dụng php-fpm


11

Tôi đã cài đặt máy chủ thử nghiệm bằng nginx+ php-fpm. Tôi đã thử tất cả những điều sau đây:

Nginx + Php5-fpm không hiển thị tệp php

nginx + php fpm -> 404 trang php - không tìm thấy tệp

Khi truy cập các tệp PHP, nginx sẽ gặp lỗi 404

Tóm tắt những gì tôi đã thử:

  • Cài đặt lại.
  • Thay đổi đặc quyền tập lệnh (thay đổi chúng thành 0777).
  • fastcgi_intercept_errors on.
  • Kiểm tra các rootchỉ thị ở các cấp: server, locationlocation ~ \.php.
  • Đã kiểm tra fastcgi_param SCRIPT_FILENAMEchỉ thị.

Máy chủ trả về 404 trên (và chỉ bật) .phptập lệnh. Tôi có thể đổi tên chúng thành .htmlvà chúng sẽ ổn thôi. Làm thế nào tôi có thể đi về điều này?

Đây là của tôi 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;
        }


    }

}

Câu trả lời:


14

Giải quyết nó. Hóa ra vấn đề là các quyền được đặt trên ổ cắm nơi php đang lắng nghe. Tôi chỉ phải thay đổi một chỉ thị gọi listen.modevề/etc/php-fpm.d/www.conf

listen.mode = 0750

Và đặt người dùng thành nginx:

listen.owner = nginx
listen.group = nginx

Vì vậy, tập tin trông như thế này:

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

Bởi vì tôi đang sử dụng ổ cắm unix thay vì cổng tcp:

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

Ngoài ra, tôi đã nhận được 404thay vì 500hoặc 503bởi vì tôi www.confđã được định cấu hình để chuyển hướng lỗi đến các trang tùy chỉnh và vì chúng không có ở đó nên tôi đã nhận được 404.

Biên tập:

Dường như trong hầu hết các phiên bản phân phối nginx gần đây của Fedora (Fedora 22, 23), nginx sử dụng người dùng apache theo mặc định và ổ cắm cũng được đặt thành apache người dùng, do đó không cần thêm cấu hình.


Phải, bạn phải kiểm soát: - Người dùng / nhóm nào chạy nginx (hoặc bất kỳ máy chủ web nào) - Người dùng / nhóm nào chạy php-fpm
Dmitry Dubovitsky

0

Tôi thực sự gặp lỗi "Không tìm thấy" vì một cuốn sách tôi đọc đã cho tôi một chuỗi khớp không chính xác cho đường dẫn /php_statusmà tôi đã định cấu hình trong php-fpm 7.0.x (hiện là 7.0.19) và trong nginx 1.12 (hiện là 1.12.0)

Đây là /etc/php/7.0/fpm/pool.d/{config}

pm.status_path = /php_status

Đây là cấu hình cho defaulttrong /etc/nginx/sites-available(Tôi đang trên 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;
  }
}

Lưu ý: Phần sau đây được thiết kế sao cho /php_statuskhông có sẵn công khai trên internet (PHP cũng không được phục vụ hoặc thiết lập cho máy chủ mặc định). Nó cũng bao gồm fastcgi_passchỉ thị cho tcp và unix-socket php-fpm

Bạn cũng nên chạy hai lệnh sau

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

Để xác minh thử chạy

curl http://127.0.0.1/php_status
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.