刚刚配置了nginx服务器,但是当打开网页(比如mydomain.com/index.php)时,不但没有任何显示而且还把index.php给下载下来了,通常可以从几方面开始入手:

php进程检查

首先当然要确认PHP-FPM服务是否正常工作,使用以下命令检查进程情况:

ps aux | grep 'php-fpm'

如果有问题就尝试启动一下。

service php-fpm start

或者

systemctl start php-fpm

两种形式都可以,只要确保PHP-FPM正常工作就成了。

PHP配置位于正确的服务器{}块指令中

检查一下配置文件nginx.conf(或者是单独的虚拟主机配置文件,如以域名命名的.conf文件)中server {}部分,PHP配置是否都准确包含在其中而不是被放在了其他块中(如果是语法错误,nginx重新加载时一般会报错),比如:

server {
    listen 80;
    server_name mydomain.com;
    
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm.sock;
    }
}
server {
    listen 80 default_server;
}

验证fastcgi_pass参数的值

nginx.conf配置文件中,在server {}块指令中,验证参数fastcgi_pass的值。
PHP-FPM服务可能使用9000端口:

server {
    location / {
        fastcgi_pass 127.0.0.1:9000;
    }
}

或者使用.sock套接字文件:

server {
    location / {
        fastcgi_pass unix:/var/run/php-fpm.sock;
    }
}

如果不清楚sock文件的位置,可以使用以下命令查找php-fpm的配置文件:

find / -name php-fpm.conf

打开后找到listen = 行,后面就是sock文件的位置,比如后面提到的/dev/shm/php-cgi.sock
另外,请确保php.inicgi.fix_pathinfo参数设置为0:

cgi.fix_pathinfo = 0

包含FastCGI配置

在Nginx配置文件中,确保PHP-FPM服务配置正确:

server {
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/dev/shm/php-cgi.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

所有权是否正确

检查运行Nginx的用户名:

ps aux | grep nginx

确认Nginx的用户与PHP-FPM服务的用户名(方法同上)是否一致。如果不一致则修改Nginx和PHP-FPM的用户名和组(配置文件分别为nginx.conf和php-fpm.conf,可以使用find指令进行查找),达成统一就可以了。

缺少?query_string

如果在nginx.conf配置文件中使用PHP框架集成(WordPress、Larevel)的参数try_files,请确保index.php?query_string使用完整路径:

server {
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}

参考资料:
https://console9.com/wiki/nginx/nginx-conf/troubleshooting/downloads-php-files-not-executing/

最后修改:2024 年 12 月 27 日
如果觉得我的文章对你有用,请随意赞赏