LAMP必知必会
一、基本常识
1、lnmp架构
LNMP = Linux + Nginx + MySQL + PHP
LAMP = Linux + Apache + MySQL + PHP // php作为Apache的模块
2、cgi和fastcgi、php-fpm
CGI
Common Gateway Interface 公共网关接口,它为Web服务器提供了一套标准的协议,以便Web服务器能够像执行终端应用程序一样来执行程序,这些运行在Web服务器上的程序,通常用于动态的生成Web页面。这些程序通常被成为CGI脚本或者直接简称为CGI。
传统cgi工作过程
一个新的请求到达WEB服务器,服务器首先解析请求。 主进程fork出一个子进程,将动态请求的内容通过STDIN输入到子进程CGI程序中。 CGI程序执行相应的逻辑,如读写数据库,并完成HTTP响应报文的内容填充 CGI程序向标准输出传送内容,IO重定向到WEB服务器与客户端通信的SCOKET中。 客户端收到动态响应的HTTP响应报文内容。
由此可见传统的基于CGI技术的WEB服务器,每次遇到新的请求都需要fork新的进程以处理请求,而请求完毕后又销毁。
这样频繁的创建销毁(涉及到fork系统调用,以及上下文切换) 将造成巨大的性能开销。
apache的一个子进程,频繁的启动和关闭不好(频繁上下文切换会消耗服务器资源)
fastcgi
FastCGI是一个可伸缩地、高速地在HTTP服务器和动态脚本语言间通信的接口(FastCGI接口在Linux下是socket(可以是文件socket,也可以是ip socket)),主要优点是把动态语言和HTTP服务器分离开来。多数流行的HTTP服务器都支持FastCGI,包括Apache、Nginx和lightpd。同时,FastCGI也被许多脚本语言所支持,比较流行的脚本语言之一为PHP。
FastCGI接口方式采用C/S架构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程执行,然后将得到的结构返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。FastCGI会先 fork 一个 master 进程,解析配置文件,初始化执行环境,然后再 fork 多个 worker 进程(与 Nginx 有点像),当 HTTP 请求过来时,master 进程将其会传递给一个 worker 进程,然后立即可以接受下一个请求,这样就避免了重复的初始化操作,效率自然也就提高了。而且当 worker 进程不够用时,master 进程还可以根据配置预先启动几个 worker 进程等着;当空闲 worker 进程太多时,也会关掉一些,这样不仅提高了性能,还节约了系统资源。
FastCGI的重要特点:
-
1、FastCGI是HTTP服务器和动态脚本语言间通信的接口或者工具。
-
2、FastCGI优点是把动态语言解析和HTTP服务器分离开来。
-
3、Nginx、Apache、Lighttpd以及多数动态语言都支持FastCGI。
-
4、FastCGI接口方式采用C/S架构,分为客户端(HTTP服务器)和服务端(动态语言解析服务器)。
-
5、PHP动态语言服务端可以启动多个FastCGI的守护进程。
-
6、HTTP服务器通过FastCGI客户端和动态语言FastCGI服务端通信。
二者区别:
名称 | 在web服务器方面 | 在对数据进行处理的进程方面 |
cgi | fork一个新的进程进行处理 | 读取参数,处理数据,结束生命周期 |
fastcgi | 用tcp方式跟远程主机上的进程或本地进程建立连接 | 要开启tcp端口,进入循环,等待数据到来,处理数据 |
PHP-FPM:FastCGI 进程管理器
FastCGI 只是一个协议规范,需要每个语言具体去实现,PHP-FPM 就是 PHP 版本的 FastCGI 协议实现,有了它,就是实现 PHP 脚本与 Web 服务器(通常是 Nginx)之间的通信,同时它也是一个 PHP SAPI,从而构建起 PHP 解释器与 Web 服务器之间的桥梁。PHP-FPM 负责管理一个进程池来处理来自 Web 服务器的 HTTP 动态请求,在 PHP-FPM 中,master 进程负责与 Web 服务器进行通信,接收 HTTP 请求,再将请求转发给 worker 进程进行处理,worker 进程主要负责动态执行 PHP 代码,处理完成后,将处理结果返回给 Web 服务器,再由 Web 服务器将结果发送给客户端。
3、web资源类型
- 静态资源
原始形式与响应内容一致,在客户端浏览器执行。
- 动态资源
原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端。
二者的区别:
静态和动态的区别不在于网页是否能够动态变化,而在于服务端的页面文件和客户端得到的页面文件是否一致。
范例:
# pwd /var/www/html # cat test1.html <script type="text/javascript"> document.write(new Date()); </script>
刷新网页,虽然时间在变化,但它依然是静态资源。点击查看网页源代码,显示与服务器端一致,所以是静态资源。
4、php
PHP(Hypertext Preprocessor)即“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
php语言的两种使用格式
格式1:
<h2> <?php echo "hello world!"?> </h2>
格式2:
<?php echo "<h2> hello world!</h2>" ?>
安装php、重启httpd方可显示,查看源代码与服务器端不完全一致,动态资源。
5、html
# cat test2.html <h1>新年快乐!<h1>
直接饮用网站的代码
curl -o sina.html www.sina.com && mv sina.html /var/www/html/
访问apache主页下的sina.com
6、lamp实现方式
httpd接收用户的web请求,静态资源则直接响应;动态资源为php脚本,对此类资源的请求交由php来运行。
httpd与php结合的方式
- modules:将php编译成为httpd的模块libphp5.so,只有prefork模式才支持。
- FastCGI
lamp架构的实现:
- 静态资源
Client ----> http(协议)------> httpd
- 动态资源
Client ---> http(协议) ----> httpd ----->libphp5.so ----> mysql(协议)------>msyql server Client ---> http(协议) ----> httpd ----->fastcgi ----> mysql(协议)------>msyql server
二、安装程序包
1、安装Apache、mariadb、php、php-mysqlnd
Centos8
Module 模块方式
dnf -y install httpd mariadb-server mariadb php php-mysqlnd gd php-gd
FastCGI方式
dnf -y install httpd mariadb-server mariadb php-fpm php-mysqlnd
Centos7
Module 模块方式
yum -y install httpd mariadb-server mariadb php php-mysql gd php-gd
FastCGI方式
yum -y install httpd mariadb-server mariadb php-fpm php-mysql
php-mysqlnd php用来连接数据库的驱动*.so文件、 gd库主要是用来图像渲染的
rpm -ql php-mysqlnd /etc/php.d/20-mysqlnd.ini /etc/php.d/30-mysqli.ini /etc/php.d/30-pdo_mysql.ini /usr/lib/.build-id /usr/lib/.build-id/27 /usr/lib/.build-id/27/050298f7ae4de2117b0325d5e1f354539efa77 /usr/lib/.build-id/43 /usr/lib/.build-id/43/0aa1d5fd22f68c8c868a0ffb6473f529360ca8 /usr/lib/.build-id/c9 /usr/lib/.build-id/c9/713dbdb20adf4b190b48176317b0c06d691f4e /usr/lib64/php/modules/mysqli.so /usr/lib64/php/modules/mysqlnd.so /usr/lib64/php/modules/pdo_mysql.so
2、php连接数据库的三种驱动
- mysqli.so(淘汰)
- mysqlnd.so(只支持mysql)
- pdo_mysql.so (常用,支持多种数据库)
3、建立动态页面。
# vim /var/www/html/2.php <?php phpinfo(); ?>
如果不安装php是解析不了的
查看网页源代码,与服务器端不一样,为动态资源
4、php作为Apache的模块
# ll /etc/httpd/modules/libphp7.so -rwxr-xr-x 1 root root 4976648 May 7 2020 /etc/httpd/modules/libphp7.so
# ll /etc/httpd/conf.d/php.conf
-rw-r--r--. 1 root root 691 Jun 24 2015 /etc/httpd/conf.d/php.conf
# vim /var/www/html/index.php(php5)
<?php $link=mysql_connect('localhost','root','zjz123'); if ($link) echo "Successfuly"; else echo "Faile"; mysql_close(); ?>
5、连接数据库测试
设置root密码:
# mysql_secure_installation
测试php 7 使用pdo方式连接mariadb代码
# cat pdo1.php <?php $dbh = new PDO("mysql:host=localhost:3306;dbname=mysql","root","zjz123"); $query = "select * from user"; $result = $dbh->query($query); $rows = $result->fetchAll(); foreach($rows as $row) { $ym = $row[0]; $user = $row[1]; $ps = $row[2]; printf("ym-".$ym." user-".$user." ps-".$ps); print("</br>"); } $dbh = null; ?>
# php -m //查看php有哪些模块
php -m [PHP Modules] bz2 calendar Core ctype curl date exif fileinfo filter ftp gettext hash iconv libxml mysqli mysqlnd openssl pcntl pcre PDO pdo_mysql pdo_sqlite Phar readline Reflection session sockets SPL sqlite3 standard tokenizer zlib [Zend Modules]
https://blog.csdn.net/qq_33369979/article/details/109106817 cgi
https://www.jianshu.com/p/565217337247 fastcgi