配环境是最难的:环境的大头:Linux(Kali) + Nginx + Apache + PHP

时间:2022-04-23 19:13:03

1.先查看一些基本信息

在Kali系统中,以下为常用的文件和目录的路径

第一、Kali自带了预置的可用的Apache2,和Nginx。
(有没有自带fpm我不知道,但可以通过apt-get 安装。)(要记住 php7.0-fpm 为 库的名。)

第二、主站的目录。Kali预置的是统一定在/var/www/html下。(已经有了Apache2的index,和Nginx的index-nginx-debian.html。)(后续项目,我们可以在/var/www/html下新建子文件夹。)

第三、启动程序。可以找见的有两处(Apache2和Nginx都有两处)。分别在:

/etc/init.d 目录

/usr/sbin 目录

这两处。

第四、

Apache2的配置文件,在: /etc/apache 文件夹里。
Nginx的配置文件,在: /etc/nginx 文件夹里。

第五、PhpStorm与Apache、Nginx、PHP的绑定文件?

好像这个东西,此处已经不需要了。(找到了正确方法,不需要在Apache、Nginx、PHP的配置文件中绑定。)

2.Apache2 的基本配置

第一、Apache2的安装

已经安装。(系统已经自带,已安装。)

第二、Apache2的配置

采用默认配置。(其实——>默认配置的情况如下面显示。)

address : 【 localhost : 80 】
root : 【 /var/www/html 】(这里可以手动,更改到 /var/www/html 的子文件夹下面去。如 /var/www/html/my。)

如果手动调的话,请注意以下的几处路径:

/etc/apache2下的:

apache2.conf
ports.conf
/sites-available/000-default.conf
/sites-available/default-ssl.conf
/sites-enabled/000-default.conf

不知道是否都有用,但以上5个文件,都出现了相关字段(指 listen 和 root路径)



第三、Apache2 与 PhpStorm的绑定

这一块,见后面的表述。(已经搞清楚了。)

第四、Apache2的启动

service apache2 start
service apache2 stop

然后,打开 localhost:80 测试,成功运行与否。


3.PhpStorm与已有服务器的绑定

首先,你要弄清楚常见的误区

一、PhpStorm自带的内置浏览器,是有诸多BUG的。建议换成标准版的独立服务器(Apache2、Nginx皆可。)

同时,有一个原理你要弄清楚

一、Server的配置。简单链接了本地端口。(这就是PhpStorm使用Apache2的实质。)
二、服务器的configure填好,服务器的Service启动

此时,服务器就正常启动,可以单独运行了。
暴露给PhpStorm,也是和PhpStorm唯一的联系。就是本地的端口,如 localhost:80

Deployment(又名 部署、发布到服务器)(此处是PhpStorm与Server连接的重要功能)

Deployment

本质的含义就是:创建发布任务。
实质就是,方便的,把PhpStorm下的项目,本地拷贝,或者FTP上传,到Server所在的地址。
实质的实质,就是简单的,项目文件夹的自动复制。


(发布到本机 /var/www/html 文件夹下)


(规范管理)
(自动化管理)
(随时查看代码改动效果)


Deployment的设置和操作过程

在网络上,或者我的收藏夹,可以看见一个大概的操作步骤(虽然有些坑和讲的不清楚的地方)。


PhpStorm的Server选项,设置和操作过程

同样,在网上搜索相关文章,或者我的收藏夹,可以看见一个大致的可能有些小毛病的操作步骤。
(其实这块,PhpStorm的Server选项,好像可以简单的一两句话,大致上设定一下就好。)
(甚至于说,只有在PhpStrom里的 Alt + F2 快捷打开当前代码页的网页形式,才用到这个。)

PhpStorm的Deployment,在操作中出现,Mapping 或 Option 页面,无法设置Default Server的错误提示

其实可以这样去查看:
Opions ——
        ——Default server
                   ——Deployment
这行文字 “use this server as default”

其实,如果是灰色的(gray),
那么说明,当前 Deployment,已经是 default server 。(所以才无法再选中)。
是提示上的问题。


一些Deployment选项卡中,要注意的有特别含义的选项

Connection选项卡 ———— Folder选项 ———— 填Server的根地址 (如 /var/www/html )


Mapping选项卡 ———— Local path选项 ———— 填本地项目的路径 (如 /root/PhpstormProjects/TODO)


Mapping选项卡 ———— Deployment path选项 ———— 填Server的root地址之下的子文件夹,该文件夹是你希望本地项目上传后,所处的单独文件夹的地址 (如/my ,此处是相对路径,是拼接在 Folder选项的路径之后的。拼接完后,形如 /var/www/html/my )


Mapping选项卡 ———— Web path选项 ———— 此处填写一个相对路径。(如/my_path。)(作用是,当在PhpStorm里面, 用 Alt + F2 打开调试网页时,自动在基本的Folder,也就是已开启服务器的根地址后,自动补上这个 Web path。)(最后效果,比如在项目的home.php 文件上,用 Alt + F2 打开网页查看,此时在浏览器地址栏,自动填入的地址,为 localhost:80/my_path/home.php 。)

4.(一些BUG的产生)源于PhpStorm的自带内置服务器

比如下面这个问题:

初学javascript和jQuery,(信心不足的情况下)发现,用javascript写的jQuery的post请求:
jquery.post( url , data_array , callback_function )
竟然在F12 控制台的监控下,
出现 404 Not Found 错误。


蹊跷的是,当我手动把post指向的网址,(在仅post,而附带的数据为空数据的情况下),填入火狐浏览器中,敲下回车时,又可以正常的显示。(绕开了点击按钮,调用js的步骤。)
此时F12 控制台下,
显示的是 200 ,请求和返回成功。


这可愁坏我了,后来,经过排查,
才知道:

1.导入 jquery.js 的这个步骤,没有问题。(原谅一个新手的多疑和谨慎。)
2. javascript 的写法,没有问题。
3. jquery.post 的写法和语法,没有问题。


4.原来最终的问题,
是在于PhpStorm自带的内置服务器的问题。
似乎网上的大意是说,所有的PhpStorm自带的内置服务器,对于所有的Post请求,都会出错误,诸如此次,出现的就是 404 的错误。


所以,此次

应该思考的
不是 怎么修复PhpStorm的自带内置服务器


而是 怎么让 Apache2 或者 Nginx 这样的正规服务器跑起来


5.穿插一些书写中的小细节

一、当使用js传递一个函数时,比如
jQuery.post( url , data_array , callback_function )中的 callback_function 时,
我们应该使用 不带括号的变量名(和function的函数名一致的名字) 来 指代那个函数的 对象(引用)。



二、图片<img>标签的书写,
在本地项目上线后,应该写相对路径,比较好一点。
虽然在本地时,相对路径的写法一和绝对路径的写法二,都是OK的。(在本地项目时,故意用了两种不同的写法,来进行对比)

当然,最好的写法,还是用一个基于 服务器路径的常量根路径,然后后面接上相对路径的写法。(这样本身形成了一个绝对路径,但比较好管理。而且绝对路径的读取,比起相对路径,要在效率上高上一些。)



三、javascript,在鼠标点击了按钮之后,跳转到我们指定的页面的写法

window.location.href = "abc.php"

话说javascript,这一点上,就很神奇啦
用方法,和用属性,在这里切换的是如此的宽容。


6.在对服务器路径(也可以是localhost)下文件目录进行操作时的一些命令

比如说,有时候,要对服务器路径的文件或文件夹进行,读写权限的修改,以让访客,拥有写入记录文件的一种权限

查看文件权限


$ ls -l 文件或文件夹路径 (这里全是 字母L 的小写, 是 list 列出 的意思)


修改文件权限


$ chmod 777 文件


$ chmod 777 文件夹/* (批量给予该文件夹下,所有的文件以 777 权限。)


有些时候,在PHP的api指令中,会出现 0777 的权限编号。- rwx r– r– 这个是Linux的权限组,后面的分别代表读取、写入、执行权限。而第一位的 -:“

此处代表 文件。 ( - 默认表示 这是一个文件)
文件夹的标识是 d 。(Directory 的意思)
字符设备文件的标识是 c 。(Character 的意思)
块设备文件的标识是 b 。(Block 的意思)
符号链接文件的标识是 s 。(Symbol 的意思)



一些在调试PHP对于文件的操作时,绝妙的操作


打印并查看某目录下的所有文件(用PHP的指令)



scandir ( 某文件夹 如 "../" ) (作用:搜索该文件夹下的所有子文件和子文件夹,并形成一个字符串数组)


$files = scandir ( "../" )
找到$files对应的所有文件或文件夹的路径的数组 print.r($files) (按照数据结构形式,打印出来)


另外,在PHP打开文件 fopen ( 文件 , 打开模式 )时,遇到的坑

append模式 和 append+模式 ,有时会打开失败
read模式 ,可以正常打开读取。


这个,还是只能归根结底,到 Linux下,文件的 rwx 权限上,去解决。


或者,每次在操作之前,手动用PHP的api,进行权限赋予操作:


chmod( 文件 , 权限编号)(赋予给文件权限, 如 权限编号为 0777 (全体可读可写可执行))



7.在实践中,对于服务器的文件和路径的文件权限的操作实践(localhost也可以)

要更改最后,登录网页可用的相关文件的权限,

你应该去 /var/www 下的文件夹里面,
进行修改。
光改本地项目的文件的读写执行权限,是没有用的。


以下,是一个小提示而已:
这里又涉及到一个,PhpStorm和Deployment,的控制下的,与服务器的根路径下的同步的问题。(稍后再谈, 大意是,本地的存储等的文件,不要干扰污染 服务器的根路径下的访客的文件。比如去除那个,自动remove服务器上有,而本地项目的最新情况下已经被删除的哪些文件,的这个选项。)


PHP,可以用代码,实时的修改文件权限:

chmod ( 文件 , 权限参数 )


PHP,这里产生了一个需求:
1.我需要先读取一个文本
2.然后按行输出
3.但这里要求,越新放进去的行数,应该越早输出,输出在最前面
4.而且,某些情况下,还只需要输出最新的前3行。也就是说,要考虑一个效率的问题。


PHP 数组——添加元素

array_push ( 数组对象 , 要放入的对象 )



PHP 数组——倒序重新排列

array_reserve( 数组对象 )


8.在用JavaScript在绘制Html页面时的细节

javascript

getElementsByName ( )

getElementById ( )
区别

看上去很相似,
但javascript中,

Name

Id

是不同的。


html

这里面

Name = ” xxx ”

Id = ” xxx “


其实也是有区别的。前者是类似于Html的唯一编号的概念。后者是 CSS中的指定Style 和供javascript取到唯一的视图的概念。


在JavaScript当中,取到 <form> </form> 标签中的特定值



比如<form> </form>中的某个 <textarea> 内部的值,


应该采用 findElementById ( ) 这个方法。


在javascript中,不能直接写文件进本地。(因为javascript,是在浏览器中,运行的一种语言。类比于虚拟机。)


因此,要调用PHP的post请求。


(再调用PHP的接收 post 请求方法。$_POST['xxx']


javascript的,刷新当前页面
reload( boolean )(此处,为true,代表强制刷新页面(效果和 Ctrl + F5 页面)。为false,代表普通刷新(可能会重新读取到缓存)。)


Deployment,可以设置,本地的忽略上传名单

用处是:有些本地的测试用的存储文件。或者其它的临时调试文件。可以避免上传到服务器的根路径下,避免产生干扰。
在Deployment的选项卡下,找到 Exclude Files 选项,然后添加进,不想上传到服务器的根路径的,文件或文件夹目录。


9.在开始调试Nginx时,遇到的问题

前提条件:对于Nginx的/etc/nginx目录下的ngixn.conf文件,进行了简单的配置————>指添加了一个基本的server,Server里设置了 listen 和 root。

此种情况下:

1.Nginx对于html的解析,是没有问题的。


2.Nginx对于php文件的打开和解析,出现了问题:

描述:此时,当输入xxx.php这样的网址时,会出现提示————>” 是否下载文件 xxx.php ?”


原因:对.php文件进行解析,必须要走 FPM 或者 FastCGI 这种类的协议。


之后,就进行一次次调试:

1.Nginx的nginx.conf配置文件的设置 : user xxx 属性

发现了这样一条属性。
但不确定是干嘛的。
我的本地,好像是 user www-data
网上也有 user www www 的写法。


2.Nginx的nginx.conf配置文件的设置:打开 access日志 和 error日志

目标:打开日志开关。包含了 accees_log 访问日志 和 error_log 错误日志。
步骤:
1.找到nginx.conf文件下的,http { }标签。
2.在 http {}中,加入如下语句。
3. access_log = /var/www/nginx/access.log (指定访问日志的路径。)
4. error_log = /var/www/nginx/error.log (指定错误日志的路径。)


之后,可以在 /var/www/nginx 目录下,查看 访问日志错误日志



3.关于Nginx和PHP之间的FPM服务

1.这个问题,之前写下的记录,都是在摸索阶段。于是这里就不发表之前那些不成熟的言论了。成功的案例,在本文后面,有展示。
2.之前纠结与 php-fpm 服务到底要不要运行?在何种情况下(Apache2? Nginx?)要运行?在何种模式下要运行( PHP 自带的FPM模式? Nginx自带的fastCGI模式?还有一个什么socket模式???)


现在,至少有这么几条,是明晰的:

1.Linux(Kali)里面,可能是因为自带内置PHP的版本是 v7.0 的原因,FPM服务改叫做 php7.0-fpm
2.如果用fastCGI模式,如果指定了 127.0.0.1:9000 却没有成功访问到 .php 结果的网址页面,那么原因就在于

php7.0-fpm 服务没有运行
或者
FPM里面的配置,出现了错误


Kali中的关于FPM的程序文件,以及FPM的服务的一些问题

Kali中,会出现以下容易混淆的情况(都是因为PHP更新到了7.0引起的)

1.Kali中,fpm的相关的启动的程序文件,文件名有时叫 php7.0-fpm ,有时却叫 php-fpm7.0
2.而Kali中,FPM相关的服务,在 Command 中,却又叫 php-fpm7.0 。()

$service php-fpm7.0 start
$service php-fpm7.0 stop



论Nginx(以及任何大型框架),打开log或日志的重要性

当发生任何错误时,从error_log入手,几乎是最精确的方式。

如果是常见问题,那么也就会极快的得到解决。


10.fastCGI调试时,遇到的一些坑

我曾经以为
fastCGI 的 127.0.0.1 : 9000
似乎和自己某些其它端口冲突

其实并不是的。只是我一知半解之下,对于端口以及Apache2以及Nginx不熟悉,导致的错误的怀疑罢了。


此处涉及的一些其它,
ipV4

ipV6
的一些不同协议的问题
对于域名上的写法会不会有影响?

似乎是有一些影响,但我不知道具体是什么样的
所以,这只是毫无理由的凭感觉的猜测

11.出现了一个很奇怪的问题,有人说

对 fastCGI 的,
每一次配置修改,
都要 重启 计算机才生效?


我希望不要是这样的。。。。。


因为那样子太麻烦了

也许,……, Ctrl + F5 强制刷新,能够解决一些问题?

12.在设置一些Nginx有关于 fastCGI 的配置时,我发现了这样的情况

fastcgi_param REDIRCT_STATUS 200 ;


这行是写在

location ~     \.php$       {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include fastcgi_params;
}

这样一行配置,能用不能用我不太知道


另外一行是
include fastcgi_params;

可以看出,fastcgi-params是类似于
PHP中的 $_POST[ ' abc ']


这样的全局变量。

添加的方法是:

fastcgi_param XXX ;

通过这种方式,完成,向全局变量里,添加 key-value 对的操作。

那么,这里的 include fastcgi_params,又是什么样的操作呢?

仅仅是单纯的,导入进 已经经过添加、修改过的 系统变量组吗?


13.找到了一门,歪门邪道似的,解决【打开 .php 页面,反而提示“是否下载该文件”】,这一问题的临时的(和残缺的)解决方案

如果,仍然碰到 “提示下载文件”,这样的问题
那么可以尝试以下这招:

修改 nginx.conf 根目录下的 default-type


default-type ,从以前的 application/octec-stream
修改变为

default-type text/html ;



这样可以临时性的解决问题。但是界面会错乱,很多功能也会不全。


14.高手出现啦,彻底的解决了问题!

第1步

先学两招

第一招: $ tail -f error.log (进入到error.log路径下,然后使用这个命令。可以实时查看 error.log 里的文本变化,和新信息。【实现:不断刷新效果】)


第二招:打开 /etc/php 文件夹,进入7.0目录下。

然后,打开fpm文件夹,打开其中的的php.conf文件。
这个就是我们要调的关键————>配置文件。
其它的什么 cgi、cli 都不是你想要的成功配置的文件夹。只有这个fpm文件夹才是。


第2步

感慨:高手一出手,果然不一样


感慨:php.conf 在调 nginx 时,果然是 php / 7.0 / fpm 下的 php.conf 这个配置文件(但要我早点想到,我是不会事后诸葛亮的)


第3步,进行最关键的调整

看清楚了
步骤如下


要调动的,
只有:


fpm / pool.d 下面的 www.conf

listen 由 /run/php/php7.0-fpm.sock
调配为

listen 127.0.0.1:9000 ;



同样, nginx.conf 下

也配合上面那处,改为

http {
server{
location {
fastcgi_pass 127.0.0.1:9000 ;
}
}
}



然后就可以了


第3步

高手说:
其实 nginx里的

fastcgi_pass /run/php/php7.0-fpm.sock; 这种形式
对应另一边
文件夹 fpm/pool.d/www.conf
里的 listen /run/php/php7.0-fpm.sock ;

这样一种模式,也是经典可用模式中的一种。

只是不知道,为什么在这台机器上,为什么用不出来?跑不出来?


第4步

我的感受如下:


胜利者领走一切,
         失败者只剩下苦涩

其实,
我的这条路,
估摸着,
走到
95%了


第5步

重新总结一下【Nginx + PHP】:

打开nginx 日志
nginx.conf 里面添加 server { }
server 的 root 填好, listen 填好
server 的 location ~ \.php$ { } 填好,且指向 127.0.0.1:9000
文件夹 fpm/pool.d/www.conf 的listen ,添加 127.0.0.1:9000
启动 nginx service
启动 php7.0-fpm service


(另外, 文件夹 nginx/sites-enabled 下的 default 文件, 不知道要不要调设置。)










15.以上就是27张手稿纸的成果!(希望后的希望,希望后的绝望,绝望后的反抗,绝望后的希望。)