LAMP和LNMP环境搭建的艰辛历程

操作系统:Ubuntu 20.10

1. LAMP环境的搭建

在图形管理化界面中依次打开系统设置、软件和更新。在下载自重选择其他站点,然后在中国的条目下选择mirrors.ustc.edu.cn。

Ubuntu换源可参考https://mirrors.ustc.edu.cn/help/ubuntu.html

更新资源包:sudo apt update

更新软件:sudo apt upgrade

清除不需要的软件:sudo apt autoremove

清除不需要的文件:sudo apt autoclean

1. Apache

接下来就可以进入正式搭建了

su root //方便之后更快的操作,切换root用户

apt install apache2

默认的配置文件:/etc/apache2/sites-enabled/000-default.conf

默认网站根目录:/var/www/html

安装完成之后检查apache是否开启:

service apache2 status // 查看apache是否开启

LAMP和LNMP环境搭建的艰辛历程

service apache2 stop // 关闭apache服务

service apache2 start // 打开apache服务

service apache2 restart //重启apache服务

也可以查看80端口是否开启

LAMP和LNMP环境搭建的艰辛历程

安装apache遇到的问题

安装过程中发现apache启动不了,使用

systemctl status apache2 查看apache服务的状态

LAMP和LNMP环境搭建的艰辛历程

查阅资料和翻译英语得知是80端口被占用所以开启不了apache服务

netstat -ntulp|grep 80 // 查看80端口

LAMP和LNMP环境搭建的艰辛历程

这我才发现是因为之前搭建靶场时docker容器占用了80端口,只要把容器停止就好了

LAMP和LNMP环境搭建的艰辛历程

2. mysql

apt install mysql-server

mysql的配置文件: /etc/mysql/mysql.conf.d/mysqld.cnf

登录mysql的方法

  1. cat /etc/mysql/debian.cnf查看默认用户的密码

LAMP和LNMP环境搭建的艰辛历程

mysql -u debian-sys-maint -p

LAMP和LNMP环境搭建的艰辛历程

可以在authentication_string字段中为root添加密码:

update mysql.user set authentication_string=‘passwd‘ where user=’root’;

LAMP和LNMP环境搭建的艰辛历程

LAMP和LNMP环境搭建的艰辛历程

  1. 执行mysql_secure_installation命令

根据提示进行操作即可

3. PHP

apt install php7.4

LAMP和LNMP环境搭建的艰辛历程

测试php是否安装成功

LAMP和LNMP环境搭建的艰辛历程

安装php组件:

apt install apt install php-curlphp.cgi php-json

php-curl:curl是一个库,能让你通过URL和许多不同种的服务器进行勾搭、搭讪和深入交流,并且还支持许多协议。并且人家还说了curl可以支持https认证、http post、ftp上传、代理、cookies、简单口令认证等等功能啦。

php.cgi: cgi是 (common gateway interface)通用网关接口 .php-cgi是php提供给web serve也就是http前端服务器的cgi协议接口程序,当每次接到http前端服务器的请求都会开启一个php-cgi进程进行处理。

php-json: json 序列化相关操作

安装php扩展:

apt install php-pear libapache2-mod-php php-mysql

php-pear: Pear 是“PHP Extension and Application Repository”的缩写,即PHP扩展和应用仓库。Pear 将PHP程序开发过程中常用的功能编写成类库,涵盖了页面呈现、数据库访问、文件操作、数据结构、缓存操作、网络协议、WebService 等许多方面,用户可以通过下载这些类库并适当的作一些定制以实现自己需要的功能。避免重复发明“车轮”。Pear 的出现大大提高了PHP 程序的开发效率和开发质量。

libapache2-mod-php:我猜测应该是对apache php解析的一个增强

php-mysql: 关于php对数据库操作的函数

LAMP和LNMP环境搭建的艰辛历程

2. Lnmp环境的搭建

1. nginx

停止apache服务 service apache2 stop

安装nginx apt install nginx

LAMP和LNMP环境搭建的艰辛历程

2. PHP

apt install php7.4-fpm

vim /etc/nginx/sites-available/default

在56行做如下修改

LAMP和LNMP环境搭建的艰辛历程

service nginx restart // 重启服务即可

LAMP和LNMP环境搭建的艰辛历程

或者还可以这样

LAMP和LNMP环境搭建的艰辛历程

然后这样

vim /etc/php/7.4/fpm/pool.d/www.conf

在37行加入下面这句话

LAMP和LNMP环境搭建的艰辛历程

service php7.4-fpm restart //重启服务即可

LAMP和LNMP环境搭建的艰辛历程

3. 配置PHP环境中出现的一些问题

PHP运行目前为止主要的三种方式:

  1. 以模块加载的方式运行——将PHP集成到Apache服务器,以同一个进程运行。
  2. 以CGI的方式运行——Apache在遇到PHP脚本的时候会将PHP程序提交给CGI应用程序(php-cgi.exe)解释,解释之后的结果返回给Apache,最后再返回给相应的请求用户。
  3. 以FastCGI的方式运行——CGI的加强版本,CGI是单进程,多线程的运行方式,程序执行完成之后就会销毁,所以每次都需要加载配置和环境变量fork-and-execute(创建-执行)。而FastCGI则不同,FastCGI像是一个常驻 (long-live) 型的CGI,只要激活后,在web服务器启动时就开启了一个进程,它可以一直执行着,不会每次都要花费时间去fork一个进程(CGI最为人诟病的fork-and-execute模式)。

1. CGI

CGI(Common Gateway Interface)公共网关接口是HTTP服务器与机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。

工作原理:CGI程序根据请求提交的参数作相应处理,然后输出标准的html语句返回给web server,web server再返回给客户端。

简单的说:cgi就是专门用来和web 服务器打交道的。web服务器收到用户请求,就会把请求提交给cgi程序(php的fastcgi),cgi程序根据请求提交的参数作应处理(解析php),然后输出标准的html语句返回给web服服务器,再返回给客户端,这就是普通cgi的工作原理。

2. FastCGI

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

传统的cgi协议在每次连接请求时,会开启一个进程进行处理,处理完毕会关闭该进程,因此下次连接,又要再次开启一个进程进行处理,因此有多少个连接就有多少个cgi进程,这也就是为什么传统的cgi会显得缓慢的原因,因此过多的进程会消耗资源和内存。而fast-cgi则是一个进程可以处理多个请求(这里的意思不是说一个进程可以同时处理多个请求,二十因为fastcgi是常驻cgi,不需要花费时间去fork进程),和上面的cgi协议完全不一样,cgi是一个进程只能处理一个请求,这样就会导致大量的cgi程序,因此会给服务器带来负担。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。

工作原理

  1. Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程(在任务管理器中可见多个php-cgi.exe)并等待来自WebServer的连接,FastCGI使用tcp方式通信。
  3. 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。WebServer将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
  4. FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回WebServer。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行WebServer中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。

3. php-cgi

php-cgi是php提供给web serve也就是http前端服务器的cgi协议接口程序,当每次接到http前端服务器的请求都会开启一个php-cgi进程进行处理,而且开启的php-cgi的过程中会先要重载配置,数据结构以及初始化运行环境,如果更新了php配置,那么就需要重启php-cgi才能生效,这也是php-cgi的不足之处。

这里需要注意的是:php-cgi不是php脚本的解析器,它是cgi协议的解析器,然后通过调用php的php_execute_script函数来解析和运行php脚本。

LAMP和LNMP环境搭建的艰辛历程

3. php-fpm

php-fpm是php提供给web serve也就是http前端服务器的fastcgi协议接口程序,它不会像php-cgi一样每次连接都会重新开启一个进程,处理完请求又关闭这个进程,而是允许一个进程对多个连接进行处理,而不会立即关闭这个进程,而是会接着处理下一个连接。它可以说是php-cgi的一个管理程序,是对php-cgi的改进。

换句话说:php-fpm其实是升级版的php-cgi,但是最后处理的单元仍然是一个php-cgi程序,php-fpm可以更好的去调度资源来实现fastcgi协议。

LAMP和LNMP环境搭建的艰辛历程

重点PS:在刚才配置lnmp过程中,我们安装了php-fpm包,在配置lamp过程中并没有安装,这是为什么呢?

答:apache使用的是一种名为mod_php模式去解析php的,即mod_php 模式是将php模块安装到apache中,apache每接收一个请求,都会产生一个进程来连接php-cgi来完成请求,可想而知,如果一旦用户过多,并发数过多,服务器就会承受不住了。

而Nginx只负责反向代理/请求转发,不负责管理php-cgi进程,所以Nginx一般配合能够自行管理工作进程(子进程)的php-fpm使用。Nginx不能像Apache那样直接执行外部可执行程序,但Nginx可以作为代理服务器,将请求转发给后端服务器,这也是Nginx的主要作用之一。

4. Spawn-FCGI

Spawn-FCGI是一个通用的FastCGI管理服务器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI进行FastCGI模式下的管理工作,不过有不少缺点。Spawn-FCGI目前已经独成为一个项目,更加稳定一些,也给很多Web 站点的配置带来便利。已经有不少站点将它与nginx搭配来解决动态网页。

总结

  1. CGI和FastCGI严格意义上来说是协议,CGI进程和FastCGI进程就是具有该协议特性的进程。
  2. php-cgi和php-fpm都是协议接口程序,用来管理采用不同协议的php-cgi程序,前者管理cgi进程,后者管理fastcgi进程。
  3. spawn-fcgi和php-fpm作用相同,都是fastcgi进程管理器。

LAMP和LNMP环境搭建的艰辛历程

上一篇:Codeforces Round #733 (Div. 1 + Div. 2)


下一篇:12306小卡片-鸿蒙智慧出行