PHP Primary script unknown 解决方法总结


Posted in PHP onAugust 22, 2019

相信很多配置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 路径配置必须要有,而且必须要写对(别笑,真的能写错)
    root      /usr/share/nginx/html;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;    #SCRIPT_FILENAME用$document_root,而不是具体路径
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    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

还有/etc/logrotate.d/nginx,create 640 nginx adm 这行要改:

create 640 phpuser adm

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 之上的每一层目录,所有者都是root,都有 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 上下文,如果更换目录需要配上。(在Cenots7+php7.3上测试,没有 selinux 上下文时,静态文件404,而php文件反倒没有遇到问题,没有深究)

# 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 上下文:

chcon -R -t httpd_sys_content_t /path/to/phpfiles

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

/etc/selinux/config :

SELINUX=disabled

3. 最后

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

以上就是PHP Primary script unknown 终极解决方法的全部知识点内容,感谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP安全配置
Dec 06 PHP
php 日期时间处理函数小结
Dec 18 PHP
国外比较好的几个的Php开源建站平台小结
Apr 22 PHP
PHP 网络开发详解之远程文件包含漏洞
Apr 25 PHP
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
php使用curl和正则表达式抓取网页数据示例
Apr 13 PHP
PHP三元运算的2种写法代码实例
May 12 PHP
Linux下php5.4启动脚本
Aug 03 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
Codeigniter(CI)框架分页函数及相关知识
Nov 03 PHP
PHP+MySql+jQuery实现的&quot;顶&quot;和&quot;踩&quot;投票功能
May 21 PHP
PHP遍历数组的6种方式总结
Nov 17 PHP
php用wangeditor3实现图片上传功能
Aug 22 #PHP
PHP生成zip压缩包的常用方法示例
Aug 22 #PHP
Laravel 实现数据软删除功能
Aug 21 #PHP
PHP针对redis常用操作实例详解
Aug 17 #PHP
php5.6.x到php7.0.x特性小结
Aug 17 #PHP
PHP中非常有用却鲜有人知的函数集锦
Aug 17 #PHP
PHP中Session ID的实现原理实例分析
Aug 17 #PHP
You might like
收音机术语解释
2021/03/01 无线电
PHP 多维数组排序实现代码
2009/08/05 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
使用URL传输SESSION信息
2015/07/14 PHP
PHP引用返回用法示例
2016/05/28 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
使用javascript获取页面名称
2014/12/23 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
python中学习K-Means和图片压缩
2017/11/20 Python
详解python函数传参是传值还是传引用
2018/01/16 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
2019/02/13 Python
python利用openpyxl拆分多个工作表的工作簿的方法
2019/09/27 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
结婚邀请函范文
2014/01/14 职场文书
酒店中秋节活动方案
2014/01/31 职场文书
2014年情人节活动方案
2014/02/16 职场文书
网管求职信
2014/03/03 职场文书
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js