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的header和asp中的redirect比较
Oct 09 PHP
php基础学习之变量的使用
Jun 09 PHP
ThinkPHP 防止表单重复提交的方法
Aug 08 PHP
如何在symfony中导出为CSV文件中的数据
Oct 06 PHP
使用PHP实现蜘蛛访问日志统计
Jul 05 PHP
php实现加减法验证码代码
Feb 14 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
May 28 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
Aug 06 PHP
PHP关联数组实现根据元素值删除元素的方法
Jun 26 PHP
twig模板获取全局变量的方法
Feb 05 PHP
Zend Framework实现将session存储在memcache中的方法
Mar 22 PHP
php合并数组并保留键值的实现方法
Mar 12 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
详解php中的implements 使用
2017/06/13 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
Python实现给qq邮箱发送邮件的方法
2015/05/28 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
浅析Python3 pip换源问题
2020/01/06 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
酒店总经理欢迎词
2014/01/08 职场文书
班级活动策划书
2014/02/06 职场文书
实习公司领导推荐函
2014/05/21 职场文书
营销与策划实训报告
2014/11/05 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
文明旅游倡议书
2015/04/28 职场文书
恰同学少年观后感
2015/06/08 职场文书
2016年3月份红领巾广播稿
2015/12/21 职场文书
Python爬虫基础初探selenium
2021/05/31 Python
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA