刚刚配置了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.ini
中cgi.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/