PHP Primary script unknown 解决方法总结
相信很多配置php环境的都遇到过这个恼人的问题:
- 浏览器访问php文件,返回来Filenotfound
- 查看/var/log/nginx/error.log,有“Primaryscriptunknown”,类似如下:
2019/01/0310:24:02[error]11931#11931:*260FastCGIsentinstderr:"Primaryscriptunknown"whilereadingresponseheaderfromupstream, client:1.2.3.4,server:localhost,request:"GET/index.phpHTTP/1.1",upstream:"fastcgi://127.0.0.1:9000",host:www.example.com
原因只有两个,一个是php-fpm找不到php文件,一个是php-fpm没有权限读取和执行文件。
1.找不到文件问题
nginx的站点配置文件php段要这样:
#passthePHPscriptstoFastCGIserverlisteningon127.0.0.1:9000 location~\.php${#root路径配置必须要有,而且必须要写对(别笑,真的能写错) root/usr/share/nginx/html; fastcgi_pass127.0.0.1:9000; fastcgi_indexindex.php;#SCRIPT_FILENAME用$document_root,而不是具体路径 fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name; includefastcgi_params; }
2.权限问题
也是坑最多的。
1)进程用户
nginx.conf里的user配置要跟php-fpm.d/www.conf一致,比如都用nginx,或者自定义用户phpuser(再来句废话,这个用户需要提前建好)。
nginx.conf:
userphpuser; worker_processesauto;
php-fpm.d/www.conf:
;Unixuser/groupofprocesses ;Note:Theuserismandatory.Ifthegroupisnotset,thedefaultuser'sgroup ;willbeused. user=phpuser group=phpuser
nginx和php-fpm进程/监听信息:
root191070.00.12076445852?Ss1月020:03php-fpm:masterprocess(/usr/local/etc/php-fpm.conf) phpuser191080.00.12076447108?S1月020:00php-fpm:poolwww phpuser191090.00.12076447112?S1月020:00php-fpm:poolwww root246760.00.0566601024?Ss13:080:00nginx:masterprocess/usr/sbin/nginx-c/etc/nginx/nginx.conf phpuser246770.00.78468029976?S13:080:00nginx:workerprocess phpuser246780.00.78432429236?S13:080:00nginx:workerprocess tcp00127.0.0.1:90000.0.0.0:*LISTEN19107/php-fpm:mast tcp000.0.0.0:800.0.0.0:*LISTEN24676/nginx:master tcp600:::80:::*LISTEN24676/nginx:master
如果修改了nginx运行用户还必须要改些目录权限:
chown-Rphpuser:phpuser/var/log/nginx chown-Rphpuser:phpuser/var/cache/nginx chown-Rphpuser:phpuser/usr/share/nginx/html
还有/etc/logrotate.d/nginx,create640nginxadm这行要改:
create640phpuseradm
2)目录和文件权限
php文件不必非得设为777,让人怪担心的,只要是nginx和php-fpm运行用户可读写执行即可,一般可以770。
php文件目录和文件样例:
drwxrwx---6phpuserphpuser4.0K2019-01-0313:09/usr/share/nginx/html -rwxrwx---1phpuserphpuser402019-01-0313:09/usr/share/nginx/html/phpinfo.php
这里有个深坑,对于使用其他目录放置php文件的很可能中招,就是/path/to/phpfiles的每一层目录都要允许phpuser访问,缺一层就会Permissiondenied。
本例,/usr/share/nginx/html之上的每一层目录,所有者都是root,都有o+rx,即所有人都有读取和执行权限(读取和执行权限是目录访问的根本),因此phpuser可以访问到html目录。
drwxr-xr-x.13rootroot1552018-07-1015:42/usr drwxr-xr-x.86rootroot4.0K2018-12-1707:33/usr/share/ drwxr-xr-x4rootroot402018-12-1708:06/usr/share/nginx/ drwxrwx---6phpuserphpuser4.0K2019-01-0313:11/usr/share/nginx/html/
测试方法:
sudo-uphpuserls-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.rootrootsystem_u:object_r:httpd_sys_content_t:s0/usr/share/nginx/html
配置selinux上下文:
chcon-R-thttpd_sys_content_t/path/to/phpfiles
或者干脆关闭selinux(需要重启服务器)
/etc/selinux/config:
SELINUX=disabled
3.最后
echo"GoodLuck:)">/usr/share/nginx/html/phpinfo.php
以上就是PHPPrimaryscriptunknown终极解决方法的全部知识点内容,感谢大家对毛票票的支持。