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 addslashes及其他清除空格的方法是不安全的
Jan 25 PHP
浅析get与post的一些特殊情况
Jul 28 PHP
PHP实现简单实用的验证码类
Jul 29 PHP
PHP7之Mongodb API使用详解
Dec 26 PHP
PHP简单遍历对象示例
Sep 28 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
Apr 20 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 PHP
PHP递归算法的简单实例
Feb 28 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
Apr 16 PHP
解决laravel中日志权限莫名变成了root的问题
Oct 17 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
May 25 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
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
2017/02/10 PHP
关于Javascript作用域链的八点总结
2013/12/06 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
python中定义结构体的方法
2013/03/04 Python
python网络编程之读取网站根目录实例
2014/09/30 Python
解决PyCharm中光标变粗的问题
2017/08/05 Python
Python单元测试实例详解
2018/05/25 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
Python3 利用face_recognition实现人脸识别的方法
2020/03/13 Python
python实现处理mysql结果输出方式
2020/04/09 Python
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
企业法人代表证明书
2014/09/27 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
企业爱心捐款倡议书
2015/04/27 职场文书
担保贷款承诺书
2015/04/30 职场文书
同学聚会感言一句话
2015/07/30 职场文书
工作感言一句话
2015/08/01 职场文书
2016年员工政治思想表现评语
2015/12/02 职场文书
如何在Python中妥善使用进度条详解
2022/04/05 Python
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript