PHP Primary script unknown 终极解决方法

相信很多配置php环境的都遇到过这个恼人的问题:

  • 浏览器访问php文件,返回来 File not found
  • 查看/var/log/nginx/error.log ,有 “Primary script unknown”,类似如下:
2019/01/03 10:24:02 [error] 11931#11931: *260 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream,
client: 1.2.3.4, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.example.com"

原因只有两个,一个是php-fpm找不到php文件,一个是php-fpm没有权限读取和执行文件

1. 找不到文件问题

nginx 的站点配置文件php段要这样:

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        root           /usr/share/nginx/html;                            #root 路径配置必须要有,而且必须要写对(别笑,真的能写错)
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;    #用$document_root,而不是具体路径
        include        fastcgi_params;
    }

2. 权限问题

也是坑最多的。

1) 进程用户
nginx.conf 里的 user 配置要跟 php-fpm.d/www.conf 一致,比如都用 nginx,或者自定义用户 phpuser(再来句废话,这个用户需要提前建好)。

nginx.conf :

user phpuser;
worker_processes  auto;

php-fpm.d/www.conf :

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user‘s group
;       will be used.
user = phpuser
group = phpuser

nginx 和 php-fpm 进程/监听信息:

root     19107  0.0  0.1 207644  5852 ?        Ss   1月02   0:03 php-fpm: master process (/usr/local/etc/php-fpm.conf)
phpuser  19108  0.0  0.1 207644  7108 ?        S    1月02   0:00 php-fpm: pool www
phpuser  19109  0.0  0.1 207644  7112 ?        S    1月02   0:00 php-fpm: pool www
root     24676  0.0  0.0  56660  1024 ?        Ss   13:08   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
phpuser  24677  0.0  0.7  84680 29976 ?        S    13:08   0:00 nginx: worker process
phpuser  24678  0.0  0.7  84324 29236 ?        S    13:08   0:00 nginx: worker process
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      19107/php-fpm: mast
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      24676/nginx: master
tcp6       0      0 :::80                   :::*                    LISTEN      24676/nginx: master

如果修改了 nginx 运行用户还必须要改些目录权限:

chown -R phpuser:phpuser /var/log/nginx
chown -R phpuser:phpuser /var/cache/nginx
chown -R phpuser:phpuser /usr/share/nginx/html

2) 目录和文件权限
php文件不必非得设为 777,让人怪担心的,只要是nginx和php-fpm运行用户可读写执行即可,一般可以770 。
php文件目录和文件样例:

drwxrwx--- 6 phpuser phpuser 4.0K 2019-01-03 13:09 /usr/share/nginx/html-rwxrwx--- 1 phpuser phpuser 40   2019-01-03 13:09 /usr/share/nginx/html/phpinfo.php

这里有个深坑,对于使用其他目录放置php文件的很可能中招,就是 /path/to/phpfiles 的每一层目录都要允许 phpuser 访问,缺一层就会 Permission denied。

本例,/usr/share/nginx/html 之上的每一层目录都有 o+rx,所以 phpuser 可以访问到 html 目录。

drwxr-xr-x. 13 root root        155 2018-07-10 15:42 /usr
drwxr-xr-x. 86 root root       4.0K 2018-12-17 07:33 /usr/share/
drwxr-xr-x   4 root root         40 2018-12-17 08:06 /usr/share/nginx/
drwxrwx---   6 phpuser phpuser 4.0K 2019-01-03 13:11 /usr/share/nginx/html/

测试方法:

sudo -u phpuser ls -l /usr/share/nginx/html/

3) SELINUX
nginx/apache 网页文件的 selinux 上下文,如果更换目录需要配上。

# ll -dZ /usr/share/nginx/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html

或者干脆关闭selinux(需要重启服务器)
/etc/selinux/config :

SELINUX=disabled

3. 最后

echo "<p align=‘center‘>Good Luck :)</p><?php phpinfo(); ?>" > /usr/share/nginx/html/phpinfo.php

原文地址:https://www.cnblogs.com/panblack/p/php_primary_script_unknown_solution.html

时间: 2024-08-30 06:58:10

PHP Primary script unknown 终极解决方法的相关文章

[PHP] 安装PHP报错“Primary script unknown”的解决方法

当安装完最新版的nginx和最新版的PHP以后,使用niginx默认配置文件中的PHP配置会有错误访问指定目录下的php文件时,显示File not found.错误.查看nginx的错误日志显示 90#90: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: 127.0.0.1, requ

FastCGI sent in stderr: &quot;Primary script unknown&quot; while reading response header from upstream,

在对nginx添加fastCGI的支持后,然后进行php页面验证,发现页面识别不到,不清楚什么情况,随后google了下,原来是Nginx内置变量问题惹的祸. 1.平台介绍: 1 2 3 4 5 6 OS Version:        CentOS release 6.4 (Final) Nginx Version:     nginx version: nginx/1.4.3 PHP Version:       PHP 5.5.5 (fpm-fcgi) Mysql Version:    

测试PHP是否安装成功时,nginx报错:&quot;Primary script unknown&quot;

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260-------谢谢您的参考,如有疑问,欢迎交流 环境php-5.6.36nginx-1.14.0 问题访问php测试文件时报404(文件不存在),已经确认权限和配置都没有问题. 处理过程查看nginx错误日志:报如下错误(172.16.6.236是服务器) 2018/08/03 01:05:34 [error] 57141#0: *242 FastCGI sent in stderr: "Pri

Linux登录图形界面闪退&quot;终极&quot;解决方法

其实是一个笨方法...但很有效 (个人经验,仅供参考) 实测环境:Debian 9 64bit  gnome3 起因是使用apt-get安装了fcitx fcitx-pinyin fcitx-tools,后执行 im-config 配置,又卸载了ibus. 不知道哪里出了问题,登出gnome3后无法再次登入了. 现象: 1.键入密码后,应该是通过进入了,但桌面尚未加载完即闪退回登录界面. 2.root用户可以正常登入 3.等入xfce正常 4.各版本gnome均闪退 5.字符终端正常,各命令使用

url 传递中文参数乱码问题的终极解决方法。

估计很多人在做web开发的时候,都会碰到过url传递中文参数,有时候会出现乱码的问题,但有些项目或者环境,又不会有问题.当遇到乱码的时候,上网找了很多解决方案,比如: 页面设置它的编码方式,改成utf-8 或者gb2312. encodeURI(url),也有人说要2个encodeURI,如:window.location.href = encodeURI('b.html?cId='+id+"&cName="+encodeURIComponent(name)); 然后后台Str

windows下 sqlplus / as sysdba 报ora-12560的终极解决方法

windows下,sqlplus / as sysdba经常报 ORA-12560: TNS:protocol adapter error,解决这个报错,有多个方法: 1.确认windows注册表中的ORACLE_HOME 键及其 键值 是正确的,是有效的 比如:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1下,找到ORACLE_HOME 键,对应的键值为H:\oracle\product\10.2.0\db_1 ,其实正确的键值为F:

【Vegas原创】安装rhel6.2,不能进图形化界面的终极解决方法

安装的时候,千万不要一路下一步,you should know,linux不是windows那么的傻瓜.   方法一: 在倒数最后一步,选择Desktop,而千万不要下一步,默认选择Basic Server,否则,安装后,是木有图形化界面滴. 方法二: 还有一种方法,就是如果选择基本服务器,记得选择现在定制,desktop的选项卡里,全部select all,否则还是进不到图形化界面.   其他的选项,可以按照需要,进行选择. [Vegas原创]安装rhel6.2,不能进图形化界面的终极解决方法

ef to sqlite 实际开发问题终极解决方法

版本问题 vs安装问题 x64/x86 发布问题 针对开发中遇到的问题,通过一下方法解决: 1.sqlite下载地址http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki,我的开发环境是 win8.1 x64 vs2010 ,下载sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.93.0.zip,不要下载1.0.66.0版本的.不管新旧版本在开发中都会有问题.发

demopu教你ping unknown host解决方法

来自:http://www.demopu.com/?p=642 [email protected] ~]# ping www.baidu.com提示 ping: unknown host这是因为DNS服务器没有配置好,如果网络没有问题,可以按下面的步骤进行检查:1) vi /etc/resolv.conf添加nameserver 192.168.59.2       本机的网关地址(路由器的地址)search localdomain    # search 参数指定域名查找顺序2)设置网关vi