Nginx Can not resolved php file

· 前端后端杂货 · 3197字

就是这几天换了台服务器,把环境都安装之后,从旧服务器将内容都copy过来,但是 nginx 突然不解析 php 文件了
突然遇到这种问题也是懵逼的,前前后后理了 12 个小时左右(菜是有点菜,不过好在解决了)

服务器信息

CenterOS 7.6
PHP7, PHP5.5

几个情况

  1. 访问 php 文件直接被下载下来;
  2. 访问 php 文件提示 500 错误;
  3. 访问 php 文件 HTTP Code 200,但是内容空白;
  4. 访问 php 文件(接口),返回 File not found;

解决办法

在 nginx 的 server 配置中加上 location ~ .php$ {}

步骤

1. 先看看服务器中有没有 php-fpm(我这台服务器跑的是 php7)

# 输入内容
> ps -ef|grep php-fpm

# 输出内容
root     19313     1  0 04:30 ?        00:00:02 php-fpm: master process (/www/server/php/70/etc/php-fpm.conf)
www      19314 19313  0 04:30 ?        00:00:01 php-fpm: pool www
www      19315 19313  0 04:30 ?        00:00:01 php-fpm: pool www
www      19316 19313  0 04:30 ?        00:00:01 php-fpm: pool www
www      19317 19313  0 04:30 ?        00:00:01 php-fpm: pool www
www      19318 19313  0 04:30 ?        00:00:01 php-fpm: pool www
www      19388 19313  0 04:51 ?        00:00:01 php-fpm: pool www
root     25665 22372  0 14:42 pts/0    00:00:00 grep --color=auto php-fpm 

当然,如果没有 php-fpm 那么需要自己找下一下怎么安装,我这里就不多逼逼了

2. 这里能看到有个 conf 配置文件,我们查看一下

# 输入内容
> vi /www/server/php/70/etc/php-fpm.conf

# 输出内容
[global]
pid = /www/server/php/70/var/run/php-fpm.pid
error_log = /www/server/php/70/var/log/php-fpm.log
log_level = notice

[www]
listen = /tmp/php-cgi-70.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.status_path = /phpfpm_70_status
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 20
request_terminate_timeout = 100
request_slowlog_timeout = 30
slowlog = var/log/slow.log
~                                

记录一下 [www] 下的 listen 的值:/tmp/php-cgi-70.sock,待会儿配置需要用到

3. 找到 nginx 的 server 配置文件(这个应该不用我说了吧)
加上

server {
    # .....

    location \.php$ {
        # php 文件所在目录(可以这么理解)
        root /www/wwwroot/domain/api;
        # 这里的 unix://path, path 就是我们上面记录的 listen 的值
        fastcgi_pass unix:/tmp/php-cgi-70.sock;
        # 下面两句是固定语法,可以直接copy & paste
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;  
        include fastcgi_params;
    }
    # .....
}

配置完成后,重新加载一下 nginx 配置,否则可能不生效。
当然,这里只是针对 php 文件的处理,不支持伪静态。

4. 伪静态的 php 接口域名,需要一些额外的配置,还是找到 server 配置文件

server {
    # .....
    # 这个是我该域名的访问目录
    root /www/wwwroot/BAIGE/api/IWTools;
    
    location / {
        index index.php; 
        # 这一句很重要,尝试查找文件 域名/index.php
        try_files $uri $uri/ $uri/index.php;
    }

    # 当然,我们的机器只能按固定语法处理内容,如果没有 `try_files` 到文件还需要额外处理
    # 未从 try_files 匹配到文件, 强制重定向到我们指定的文件x a
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php/$1 last; 
    }
    
    location \.php$ {
        # php 文件所在目录(可以这么理解)
        root /www/wwwroot/domain/api;
        # 这里的 unix://path, path 就是我们上面记录的 listen 的值
        fastcgi_pass unix:/tmp/php-cgi-70.sock;
        # 下面两句是固定语法,可以直接copy & paste
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;  
        include fastcgi_params;
    }
    # .....
}
最后一次编辑于 2019 09 30 15:05:56
如果你有任何疑问,这个邮箱可以联系到我:aS4xMjE0QHlhaG9vLmNvbQ==