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 相关文章推荐
1.PHP简介
Oct 09 PHP
php AJAX实例根据邮编自动完成地址信息
Nov 23 PHP
PHP调用Twitter的RSS的实现代码
Mar 10 PHP
PHP数组操作汇总 php数组的使用技巧
Jul 17 PHP
深入PHP数据加密详解
Jun 18 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
Jun 24 PHP
php 邮件发送问题解决
Mar 22 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
Apr 15 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
PHP程序员必须知道的两种日志实例分析
May 14 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
Oct 30 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 读取和修改大文件的某行内容的代码
2009/10/30 PHP
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
基于initPHP的框架介绍
2013/04/18 PHP
探讨PHP调用时间格式的参数详解
2013/06/06 PHP
php中in_array函数用法探究
2014/11/25 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
2018/05/24 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
ExtJS的拖拽效果示例
2013/12/09 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
js时间比较示例分享(日期比较)
2014/03/05 Javascript
js简单抽奖代码
2015/01/16 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
2017/04/27 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
2019/04/20 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
python3.x实现base64加密和解密
2019/03/28 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
作文批改评语大全
2014/04/23 职场文书
辅导员评语
2014/05/04 职场文书
走进敬老院活动总结
2014/07/10 职场文书
2014年营业员工作总结
2014/11/18 职场文书
地道战观后感300字
2015/06/04 职场文书
Go调用Rust方法及外部函数接口前置
2022/06/14 Golang