文章目录
1 什么是lnmp
说明:以前叫做lamp,因为那时候用的apache而现在用的是nginx。 lump=Linux Nginx Mysql Php
LNMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写
L指Linux,N指Nginx,M一般指MySQL,也可以指MariaDB,P一般指PHP,也可以指Perl或Python
LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构
Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统
代表版本有:debian、centos、ubuntu、fedora、gentoo等
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器(不做动态)
Mysql是一个小型关系型数据库管理系统 PHP是一种在服务器端执行的嵌入HTML文档的脚本语言
这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统
2 用户请求流程
(1)当用户请求静态页面时:
client —> nginx(location) ----> 若请求html静态页面 ----> client
(2)当用户请求动态页面时:
client —> nginx(location) ----> fastcgi ----> php-fpm(php进程管理) ---->php调用wrapper进程 ----->php(wrapper调用php进行解析,此时即可发送给客户端了。若还要查询数据库,php连接mysql) ---->mysql
最终由mysql----> php ----> php-fpm —> fastcgi ----> nginx ----> http ----> client
3 Fast-CGI 介绍
CGI全称是“公共网关接口”(Common Gateway Interface)
HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上
cgi是通用网关接口,是外部应用程序与Web服务器之间的接口标准
cgi是为了保证web server传递过来的数据是标准格式的,方便cgi程序的编写者
Fast-CGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能
众所周知,CGI解释器的反复加载是CGI性能低下的主要原因
如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等
Fast-cgi像是一个常驻(long-live)型的cgi,是用来提高cgi程序性能的
fast-CGI是nginx和php之间的一个通信接口,该接口实际处理过程通过启动php-fpm进程来解析php脚本
即php-fpm相当于一个动态应用服务器,从而实现nginx动态解析php
因此,如果nginx服务器需要支持php解析,需要在nginx.conf中增加php的配置
将php脚本转发到fastCGI进程监听的IP地址和端口(php-fpm.conf中指定)
同时,php安装的时候,需要开启支持fastCGI选项,并且编译安装php-fpm补丁/扩展
同时,需要启动php-fpm进程,才可以解析nginx通过fastCGI转发过来的php脚本
php-cgi 是解释PHP脚本的程序,只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理
4 什么是PHP-FPM
PHP-FPM是一个实现了Fastcgi的程序,PHP-FPM的管理对象是php-cgi,被PHP官方收购了
后来PHP内核集成了PHP-FPM之后就方便多了,使用enalbe-fpm这个编译参数即可
php-fpm是一个完全独立的程序,不依赖php-cgi,也不依赖php。因为php-fpm是一个内置了php解释器的FastCGI服务,启动时能够自行读取php.ini配置和php-fpm.conf配置.
5 Nginx+FastCGI运行原理
nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用
FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)
wrapper: 为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后Fork(派生)出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据(html页面或者图片)发送给客户端。这就是Nginx+FastCGI的整个运作过程。
所以,我们首先需要一个wrapper,这个wrapper需要完成的工作
1、调用fastcgi(库)的函数通过socket和ningx通信(读写socket是fastcgi内部实现的功能,对wrapper是非透明的)
2、调度thread,进行fork和kill
3、和application(php)进行通信
6 搭建LNMP架构(即php、nginx、mysql源码编译的过程)
在我们使用的Linux系统中,可以从yum源中获得mysql、php,为什么要进行编译呢,编译不仅复杂而且耗时依赖性比较多?
因为官方为我们提供的mysql、php等其功能有限或好多用不到的功能。 自行编译,是为了定制化,可以在编译过程中添加需要的功能模块
mysql源码编译时要求虚拟机的硬盘大小不能小于20G,否则后边的编译过程可能会出问题
而且会很漫长,为了提升速度我们增加CPU核数和内存大小
6.1 源码编译安装mysql的详细说明
(1)解压并且进入解压后的目录