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动态生成虚拟现实VRML网页
Oct 09 PHP
php 什么是PEAR?(第二篇)
Mar 19 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
Oct 25 PHP
php下获取http状态的实现代码
May 09 PHP
ThinkPHP模板Switch标签用法示例
Jun 30 PHP
thinkphp中memcache的用法实例
Nov 29 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
Feb 10 PHP
php通过递归方式复制目录和子目录的方法
Mar 13 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
php数组指针操作详解
Feb 14 PHP
详解php curl带有csrf-token验证模拟提交方法
Apr 18 PHP
php输出反斜杠的实例方法
Sep 19 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
调整PHP的性能
2013/10/30 PHP
php ZipArchive压缩函数详解实例
2013/11/06 PHP
PHP实现的json类实例
2015/07/28 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
Angular.js基础学习之初始化
2017/03/10 Javascript
swiper自定义分页器使用方法详解
2020/09/14 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
js代码实现轮播图
2020/05/04 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
Python3实现购物车功能
2018/04/18 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
python使用matplotlib:subplot绘制多个子图的示例
2020/09/24 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
瑞典网上购买现代和复古家具:Reforma
2019/10/21 全球购物
小学生暑假感言
2014/02/06 职场文书
《灯光》教学反思
2014/02/08 职场文书
保研推荐信
2014/05/09 职场文书
个性车贴标语
2014/06/24 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
2016继续教育研修日志
2015/11/13 职场文书
Redis性能监控的实现
2021/07/09 Redis