Nginx 仅在使用 php-fpm 的 php 脚本上抛出 404

Nginx 仅在使用 php-fpm 的 php 脚本上抛出 404

nginx我已经使用+安装了一个测试服务器php-fpm。我尝试了以下所有操作:

Nginx + Php5-fpm 无法渲染 php 文件

nginx + php fpm->404 php 页面-找不到文件

访问 PHP 文件时,nginx 抛出 404 错误

总结一下我所尝试过的:

  • 正在重新安装。
  • 更改脚本权限(将其更改为0777)。
  • fastcgi_intercept_errors on
  • 检查了root以下级别的指令serverlocationlocation ~ \.php
  • 检查了fastcgi_param SCRIPT_FILENAME指令。

服务器在.php脚本上(且仅在脚本上)返回 404。我可以重命名它们.html,这样就没问题了。我该怎么做?

这是我的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;
        }


    }

}

答案1

解决了。​​原来问题出在 php 监听的套接字上设置的权限。我只需要更改一个listen.mode名为/etc/php-fpm.d/www.conf

listen.mode = 0750

并将用户设置为nginx

listen.owner = nginx
listen.group = nginx

所以文件看起来是这样的:

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

因为我使用的是 unix 套接字而不是 tcp 端口:

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

此外,我得到的是404,而不是500503因为我的www.conf配置为重定向错误自定义页面,因为他们不在那里,所以我得到了404

编辑:

看来,在 Fedora 中大多数最新版本的 nginx 发行版(Fedora 22、23)中,nginx 默认使用 apache 用户,并且套接字也设置为用户 apache,因此不需要进一步配置。

答案2

遇到了同样的问题,直到我注意到我的 PHP 位置块缺少root条目。

我已经在 下的服务器块中设置了一个location /,但没有在服务器上或 PHP 位置块内设置一个。

location ~ \.php$ {
                root /usr/local/www/; <--- this was missing
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php82-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $request_filename;
        }

或者在服务器级别设置一个

 server {
        listen       80;
        server_name  example.com www.example.com;
        root   /usr/local/www/; <--- this line here
        location / {
            index  index.html index.htm index.php;
            try_files $uri $uri/ /index.php?q=$uri&$args;
            ...
...

答案3

我实际上收到了“未找到”错误,因为我读过的一本书给了我一个不正确的匹配字符串,而/php_status我在 php-fpm 7.0.x(当前为 7.0.19)和 nginx 1.12(当前为 1.12.0)中配置了该路径。

这里是/etc/php/7.0/fpm/pool.d/{config}

pm.status_path = /php_status

以下是配置(我在 Ubuntu 上default/etc/nginx/sites-available

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

笔记:以下内容设计为/php_status不公开提供互联网(也不为默认主机提供或设置 PHP)。它还包括fastcgi_passtcp 和 unix-socket php-fpm 指令

您还应该在之后运行以下两个命令

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

要验证,请尝试运行

curl http://127.0.0.1/php_status

答案4

我想到这个是因为另一个原因:解决方案是提出这个定义:

root /usr/share/nginx/html;  # <- replace with your directory

在里面服务器块中,而不是地点堵塞:

server {
    listen ....
    root /usr/share/nginx/html;  # <- replace with your directory
    ...
    location ~ \.php$ {
        # no 'root' definition here :)
        ...
    }
}

相关内容