LAMP 简介
常用 web 架构
LAMP,是由 Linux + Apache + Mysql/MariaDB + Php/Perl/Python 的一组动态网站或者服务器的开源软件,除 Linux 外其它各部件本身都是各自独立的程序,但是因为经常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的 Web 应用程序平台。
LAMP 指的是 Linux(操作系统)、Apache(HTTP服务器)、MySQL(也指 MariaDB,数据库软件)和 PHP(有时也是指 Perl 或 Python)的第一个字母,一般用来建立 web 应用平台。
web 服务器工作流程
在说 LAMP 架构平台的搭建前,我们先来了解下什么是 CGI,什么是 FastCGI,什么是…
web 服务器的资源分为两种,静态资源和动态资源
- 静态资源就是指静态内容,客户端从服务器获得的资源的表现形式与原文件相同。可以简单的理解为就是直接存储于文件系统中的资源
- 动态资源则通常是程序文件,需要在服务器执行之后,将执行的结果返回给客户端
那么 web 服务器如何执行程序并将结果返回给客户端呢?下面通过一张图来说明一下 web 服务器如何处理客户端的请求。
如上图所示
阶段①显示的是 httpd 服务器(即 apache)和 php 服务器通过 FastCGI 协议进行通信,且 php 作为独立的服务进程运行。
阶段②显示的是 php 程序和 mysq l数据库间通过 mysql 协议进行通信。php 与 mysql 本没有什么联系,但是由 php 语言写成的程序可以与 mysql 进行数据交互。同理 perl 和 python 写的程序也可以与 mysql 数据库进行交互。
CGI 与 FastCGI
CGI(Common Gateway Interface,通用网关接口),CGI 是外部应用程序(CGI 程序)与 web 服务器之间的接口标准,是在 CGI 程序和 web 服务器之间传递信息的过程。CGI 规范允许 web 服务器执行外部程序,并将它们的输出发送给 web 浏览器,CGI 将 web 的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。
FastCGI(Fast Common Gateway Interface)是 CGI 的改良版,CGI 是通过启用一个解释器进程来处理每个请求,耗时且耗资源,而 FastCGI 则是通过 master-worker 形式来处理每个请求,即启动一个 master 主进程,然后根据配置启动几个 worker 进程,当请求进来时,master 会从 worke r进程中选择一个去处理请求,这样就避免了重复的生成和杀死进程带来的频繁 CPU 上下文切换而导致耗时。
httpd 与 php 结合的方式
httpd 与 php 结合的方式有以下三种:
- modules:php 将以 httpd 的扩展模块形式存在,需要加载动态资源时,httpd 可以直接通过 php 模块来加工资源并返回给客户端
- httpd prefork:libphp5.so(多进程模型的 php)
- httpd event or worker:libphp5-zts.so(线程模型的php)
- CGI:httpd 需要加载动态资源时,通过 CGI 与 php 解释器联系,获得 php 执行的结果,此时 httpd 负责与 php 连接的建立和断开等
- FastCGI:利用 php-fpm 机制,启动为服务进程,php 自行运行为一个服务,https 通过 socket 与 php 通信
较于 CGI 方式,FastCGI 更为常用,很少有人使用 CGI 方式来加载动态资源。