Linux配置PHP时遇到的问题

标签: Linux 分类: 操作系统 创建时间:2020-03-07 11:19:46 更新时间:2023-10-20 11:23:26

今天接手了一个微信小程序商城项目,项目的代码是使用PHP写的,所以就跟着工程师一起在Linux上部署的了PHP,也是费劲了周折。

1.安装了宝塔Linux

这个Linux确实是一个好东西。

1
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

2.PHP出现mkdir() access denied

(1) 开始以为是ngin没有使用root启动,然后就修改了nginx.conf的配置开头使用user root;
(2) 后来使用了chmod 777 某一个目录的方式,好像还是不行。chmod 要加参数才能应用于子目录上。

1
chmod -Rf 777 runtime

3.微信小程序中总是出现https无法请求的问题

打开相关https链接,出现了: Provisional headers are shown。无论是怎么验证都是好的,结果是因为在宝塔Linux配置站点的ssl证书是,没有按要求进行填入PEM格式的证书。

4.nginx配置解析php

刚接手了一个项目,后台使用php写的,在服务器上使用了nginx进行了转发。

php测试文件

1
2
3
<?php
phpinfo();
?>

(1) nginx要完成解析php的功能,需要安装php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
## 查询是否安装php
rpm -qa |grep php
## 获取上面命令的输出结果,查询php所在目录
rpm -ql php-common-5.4.16-46.el7.x86_64
rpm -ql php-mcrypt-5.4.16-7.el7.x86_64

## or
yum list installed | grep php

## 查询进程运行目录
ps -ef | grep php

## 查询配置文件
find /|grep php.ini

## 查看服务
systemctl list-units

## 查看版本
php -v

(2) 安装php
这里有yum安装方法和php安装方法,因为服务器上已经安装了,我就没有继续尝试。

(3) No input file specified.
总是出现这个错误,因为这个php的后台不是我写的,所以部署起来有点麻烦。查看nginx的错误日志:

经过日志查看,发现了一个奇怪的目录:/www/wwwroot/,这个目录显然是宝塔的安装目录,但是在我这个电脑上是没有的,所以我顺手查询了一下,这个文件的含义。

.htaccess是伪静态环境配置文件,用于lamp。
.user.ini是lnmp文件,里面放的是你网站的文件夹路径地址。目的是防止跨目录访问和文件跨目录读取.

然后再查看web目录下,果然有这个文件。于是我将.user.ini里面的内容:open_basedir=/www/wwwroot/shop.proheng.net/:/tmp/:/proc/,改为了自己的路径,于是这个No input file 错误也就解决了。open_basedir参数的作用就是将php能打开的文件限制在特定的目录树中,默认的$document_root是nginx.conf中配置的/home/wwwroot/default目录

(4) nginx配置php支持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
listen 80;

server_name shop.dev.proheng.net;
root /cloud/dev/PhShop/shop/web;
index index.php index.html index.htm;

#access_log logs/host.access.log main;

client_max_body_size 4m;

location / {

if (!-e $request_filename){
rewrite ^/(.*)$ /index.php?s=/$1 last;
}
}

location ~ \.(php|html)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}

}

文件/usr/local/nginx/conf/fastcgi.conf 中的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

5.File not found

【尝试】
我尝试了修改nginx的配置,其中的$document_root,因为很多的文章都是这么说的。使用php-fpm解析PHP,”No input file specified”,”File not found”是常见错误,原因是php-fpm进程找不到SCRIPT_FILENAME配置的要执行的.php文件,php-fpm返回给nginx的默认404错误提示。出现这类错误,十个有九个是后端fastcgi进程收到错误路径(SCRIPT_FILENAME),而后端fastcgi收到错误路径的原因大都是配置错误。

1
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

所以我改来改去还是不行。

【解决】
最后其实是因为Linux的大小写敏感导致的问题,如果我输入 Index.php,在Windows上没有问题,但是在linux上却出现问题了,找不到 Index.php这个文件,就会报错。

参考文章:
1.nginx File not found 错误
2.先总结下这个问题出现的提示
3.linux严格区分大小写导致的问题
4.nginx File not found 错误
5.nginx新手配置$document_root $document_root 的参数是由root html那一行定义的,默认是在/usr/share/nginx/html/ 所以把 html换成站点根目录就正常了。
6.Linux下搭建nginx+php环境的file not found问题反省 查看error.log日志文件提示”Primary script unknown” while reading response header from upstream”
7.linux下设置php文件不区分大小写 这里有apache模块配置
8.控制器定义
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。