1、什么是LNMP架构 LNMPLinuxNginxMysql(mariabd)PHP Linux: Linux是一套免费使用和自由传播的开源程序,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。被广泛的用于服务器、安卓系统等其它各种设备系统中所使用。 nginx: Nginx是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。Nginx是免费的开源软件,根据类BSD许可证的条款发布。 mysql: MySQL在Web托管应用程序中非常流行,因为它具有大量的Web优化功能,如HTML数据类型,并且因为它是免费提供的。它是Linux,Apache,MySQL,PHP(LAMP)架构的一部分,这是一种经常用于交付和支持高级Web应用程序的平台组合。MySQL运行着一些着名网站的后端数据库,包括维基百科,谷歌和Facebook尽管它具有分散的,免费的哲学,但它的稳定性和稳健性的证明。 php: (一)开源性和免费性 由于PHP的解释器的源代码是公开的,所以安全系数较高的网站可以自己更改PHP的解释程序。另外,PHP运行环境的使用也是免费的。 (二)快捷性 PHP是一种非常容易学习和使用的一门语言,它的语法特点类似于C语言,但又没有C语言复杂的地址操作,而且又加入了面向对象的概念,再加上它具有简洁的语法规则,使得它操作编辑非常简单,实用性很强。 (三)数据库连接的广泛性 PHP可以与很多主流的数据库建立起连接,如MySQL、ODBC、Oracle等,PHP是利用编译的不同函数与这些数据库建立起连接的,PHPLIB就是常用的为一般事务提供的基库。 (四)面向过程和面向对象并用 在PHP语言的使用中,可以分别使用面向过程和面向对象,而且可以将PHP面向过程和面向对象两者一起混用,这是其它很多编程语言是做不到的。2、LNMP原理 lnmp架构简介 2。1LNMP架构的基本定义 LAMPLinuxApacheMysqlPHP LNMPLinuxNginxMysqlPHP LAMP的架构LAMP是一个多CS架构的平台,最初级为web客户端基于TCPIP通过http协议发起传送,这个请求可能是静态的也可能是动态的。所以web服务器通过发起请求的后缀来判断,如果是静态的就由web服务器自行处理,然后将资源发给客户端。如果是动态的web服务器会通过CGI(CommonGatewayInterfence)协议发起给php。这里但是如果php以模块形式与web服务器联系,那么它们是通过内部共享内存的方式,如果是php与单独的放置与一台服务器,那么它们是以sockets套接字的方式进行通信(这又是一个CS架构),这时php会相应的执行一段程序,如果在程序执行时需要一些数据,那么php就会通过mysql协议发送给mysql服务器(这也可以看作是一个CS架构),由mysql服务器处理,将数据供给php程序。 2。2LNMP架构的深层剖析 NGINX NGinx是一款高性能的web服务器,本身是不能处理php请求的,当接收到请求时,判断如果是php请求就会将请求交给php解析器处理然后将结果返回给client。Nginx一般把请求转发给fastcgi管理进程进行处理,fastcgi管理进程再选择cgi子进程处理请求,然后把结果返回给Nginx。 Apachephp和nginxphp的区别: apache一般是把php当作自己的一个模块来启动;而nginx则是把http请求变量转发给php进程,即php独立进程,与Nginx通信,这种方式叫做fastcgi运行方式,所以apache编译的php不能用于nginx。 FastCgi: FastCgi是一个可伸缩的,高速的HTPPserver和动态脚本语言间通信的接口。多数流行的HTTPserver都支持fastcgi,包括apache,nginx和lighttpd等。同时fastcgi也被许多脚本语言支持,其中就有php。FastCGI是从CGI发展改进而来的。传统的CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来进行解析,然后将结果返回给http服务器。这里在处理高并发访问时几乎是不可用的。另外传统的CGI接口接口方式的安全性也很差,现在已经很少使用了。 FastCGI接口方式采用CS结构,可以将http服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析器守护进程。当HTTP服务器每次遇到动态程序时,可以直接将其交给FastCGI进程来执行,然后将的得到的结果再返回给浏览器。这种方式可以让HTTP服务器专一的处理静态请求或者将动态脚本服务器的结果返回给客户端。这再很大程度上提高了应用程序的性能。 NginxFastCGI的运行原理: Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过fastcgi接口来调用。Fastcgi接口在Linux下是socket(这个socket可以是文件socket,也可以是ipsocket)。 wrapper:为了调用CGI程序,还需要一个Fastcgi的wrapper(wrapper也可以理解为用于启动另外一个程序的程序),这个wrapper绑定在某个固定的socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候通过FastCGI的接口,wrapper接收到一个请求,然后fork派生出一个新的线程,这个线程调用解析器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过Fastcgi接口,沿着固定的socket传递给Nginx;最后Nginx将返回的数据(html页面或者图片)发送给客户端。 下图为NginxFastCGI的整个运行过程: 因此,首先需要一个wrapper,这个wrapper需要完成的工作: (1)通过调用FastCGI(库)的函数通过socket和Nginx通信(读写socket是fastcgi内部实现的功能,对wrapper是非透明的) (2)调度thread,进行fork和application进行通信 phpfpm简述: PHPFPM是一个PHPFastCGI管理器,是只用于php的,它其实是php源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的源代码中,在编译安装php后才可以使用。新版的PHP已经集成了phpfpm,在。configure的时候带enablefpmp参数即可开启PHPFPM。 fastcgi的特点。HTTP服务器和动态脚本语言间通信的接口或工具。可把动态语言解析和HTTP服务器分离开。Nginx,Apache,Lighttpd,以及多数动态语言都支持FastCGI。FastCGI接口方式采用CS结构,分为客户端(HTTP服务器)和服务器端(动态语言解析服务器)PHP动态语言服务器端可以启动多个FastCGI的守护进程(例如phpfpm(fcgiprocessmangement))HTTP服务器通过(例如Nginxfastcgipass)FastCGI客户端和动态语言FastCGI服务器端通信(例如phpfpm) LNMP架构工作流程 LNMP的工作原理 首先由浏览器发送httprequest请求给到服务器(Nginx),服务器响应并处理web请求,将一些静态的资源(CSS,图片,视频)保存到服务器上,然后将php脚本通过接口传输协议(网关协议)PHPFCGI(fastcgi)传输给phpfpm(进程管理程序),PHPFPM不做处理,然后PHPFPM调用php解析器进程,php解析器解析php脚本信息,php解析器进程可以启动多个,进行并发执行。然后将解析后的脚本返回到PHPFPM,PHPFPM通过fastcgi的形式将脚本信息传送给Nginx。服务器在通过httpreponse的形式传送给浏览器。浏览器再进行解析与渲染后进行呈现。 LNMP的工作流程 用户发送http请求到达http服务器 httpd解析URL获取需要的资源的路径,通过内核空间来读取硬盘资源,如果是静态资源,则构建响应报文发回给用户。 如果是动态资源,将资源地址发送给php解析器,解析php程序文件,解析完毕将内容发回给httpd,httpd构建响应报文,发回给用户。 如果涉及到数据库操作,则利用phpmysql驱动,获取数据库数据,返回给PHP解析器。 LNMP架构与LAMP架构 Lnmp架构与Lamp架构相似,只不过一个用的是Apache一个用的Nginx。Nginx和Apache一样都是web服务器。 LNMP架构里php会启动服务phpfpm,而LAMP中php只是作为Apache的一个模块存在。Nginx会把用户的动态请求交给php服务去做处理,这个php服务就会去和数据库进行交互。用户的静态请求Nginx会直接处理,Nginx处理静态请求的速度要比Apache快很多性能上要好,所以apache和Nginx在动态请求处理上区别不大,但是如果是静态处理的话就会发现Nginx要快于apache,而且Nginx能承受的并发量要比apache大,可以承受好几万的并发连接量,所以大一些的网站都会使用Nginx作为web服务器。3、LNMP搭建 3。1、搭建WEB服务器 3。1。1、二进制部署nginx nginx下载地址:http:nginx。orgdownload 范例:1、下载相关依赖包〔13:29:31rootWEB〕yuminstallygccgcccglibcglibcdevelpcrepcredevelopensslopenssldevelsystemddevelnettoolsiotopbczipunzipzlibdevelbashcompletionnfsutilsautomakelibxml2libxml2devellibxsltlibxsltdevelperlperlExtUtilsEmbed2、创建nginx用户〔13:31:45rootWEB〕useraddssbinnologinnginxu20003、进入usrlocalsrc目录并下载nginx〔13:32:06rootWEB〕cdusrlocalsrc;wgethttp:nginx。orgdownloadnginx1。18。0。tar。gz4、解压nginx〔13:40:26rootWEBsrc〕tarxfnginx1。18。0。tar。gz5、进入nginx解压好之后的目录,并生成编译环境。〔13:46:29rootWEBsrc〕cdnginx1。18。0〔13:47:36rootWEBnginx1。18。0〕。configureprefixappsnginxusernginxgroupnginxwithhttpsslmodulewithhttpv2modulewithhttprealipmodulewithhttpstubstatusmodulewithhttpgzipstaticmodulewithpcrewithstreamwithstreamsslmodulewithstreamrealipmodule6、编译安装〔13:50:58rootWEBnginx1。18。0〕makej4makeinstall7、修改nginx配置文件使其支持phpfpm服务。〔13:51:54rootWEBnginx1。18。0〕vimappsnginxconfnginx。confusernginx;workerprocesses1;events{workerconnections1024;}http{includemime。types;defaulttypeapplicationoctetstream;sendfileon;keepalivetimeout6565;servertokensoff;server{listen80;servername10。0。0。27;charsetutf8;location{errorpage50050250350440450x。html;rootappsnginxhtml;indexindex。phpindex。htmlindex。htm;}location50x。html{roothtml;}location。php{rootappsnginxhtml;fastcgipass127。0。0。1:9000;fastcgiindexindex。php;fastcgiparamSCRIPTFILENAMEdocumentrootfastcgiscriptname;includefastcgiparams;}}}8、启动nginx服务、查看端口80已打开〔13:55:29rootWEBnginx1。18。0〕appsnginxsbinnginx〔13:56:27rootWEBnginx1。18。0〕ssntlgrep80LISTEN0128:80: 3。1。2、nginx配置文件解析因为我们在生成编译环境的时候prefixappsnginx参数制定了nginx的安装目录,所以我们在编辑在nginx的配置文件就直接到appsnginx目录下。nginx配置文件详解:usernginx;全局配置端,对全局生效,主要设置nginx的启动用户组,启动的工作进程数量,工作模式,Nginx的PID路径,日志路径等。workerprocesses1;启动工作进程数数量,这个值默认是1(正常情况下是我们events{events设置块,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连接,使用哪种事件驱动模型处理请求,每个工作进程可以同时支持的最大连接数,是否开启对多工作进程下的网络连接进行序列化等。workerconnections1024;设置单个nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数为workerconnectionsworkerprocesses,作为反向代理的时候为要除以2(workerconnectionsworkerprocesses)2因为作为反向代理的时候是自身来处理,所以本身扛得住。}http{http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这设置,http块可以包含多个server块,而一个server块中又可以包含多个location块,server块可以配置文件引入、MIMEType定义、日志自定义、是否启用sendfile、连接超时时间和单个链接的请求上限等。includemime。types;支持的mime类型,MIME(MultipurposeInternetMailExtensions)多用途互联网邮件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。defaulttypeapplicationoctetstream;默认类型应用程序八进制sendfileon;作为web服务器的时候打开sendfile加快静态文件传输,指定是否使用sendfile系统调用来传输文件,sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝,硬盘kernelbuffer(快速拷贝到kernelsocketbuffer)协议栈。keepalivetimeout6565;长连接超时时间,单位是秒通常加两个,让客户端和服务器的持续链接时间相同servertokensoff;安全优化隐藏版本号server{设置一个虚拟机主机,可以包含自己的全局块,同时也可以包含多个location模块。比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server可以使用一个端口,比如都使用80端口提供web服务、本身可以多次监听同一个端口listen80;配置server监听的端口默认监听所有80servername10。0。0。7;本server的名称,当访问此名称的时候nginx会调用当前serevr内部的配置进程匹配nginx可以有多个虚拟主机,只要使用域名区分即可。charsetutf8;设置编码格式,默认是俄语格式,可以改为utf8让他支持全球标准语法location{location其实是server的一个指令,为nginx服务器提供比较多而且灵活的指令,都是在location中提现的,主要是基于nginx接受到的请求字符串,对用户请求的UIL进行匹配,并对特定的指令进行处理,包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三方模块的配置也是在location模块中配置。errorpage50050250350440450x。html;出现这几个状态即可跳转到50x。html文件rootappsnginxhtml;定义错误页面的时候做的处理,这个50x。html其实是一个文件。indexindex。phpindex。htmlindex。htm;nginx配置默认首页}location50x。html{roothtml;}ocation。php{以http的方式转发php请求到指定web服务器rootappsnginxhtml;php文件存放路径fastcgipass127。0。0。1:9000;指明后端phpfpm服务器主机及端口fastcgiindexindex。php;默认使用的php文件fastcgiparamSCRIPTFILENAMEdocumentrootfastcgiscriptname;这个配置的意思是在浏览器中访问的。php文件,实际读取的是documentroot(网站根目录)下的。php文件也就是说当访问127。0。0。1index。php的时候,需要读取网站根目录下面的index。php文件,如果没有配置这一配置项时,nginx不回去网站根目录下访问。php文件,所以返回空白includefastcgiparams;这里面写的是一堆变量 3。1。3、测试web服务 搭建好了nginx之后我们就去通过浏览器访问测试 3。2、二进制搭建php服务 编译好了nginx之后我们开始解决nginx的php问题。 php官方下载:https:www。php。netdownloads。php 范例:1、进入usrlocalsrc目录〔13:56:31rootWEBnginx1。18。0〕cdusrlocalsrc2、解决php依赖关系〔14:01:15rootWEBsrc〕yuminstalllibxml2develbzip2devellibmcryptdevelsqlitedevely3、phpfpm官方下载安装包〔14:04:09rootWEBsrc〕wgethttps:www。php。netdistributionsphp7。4。7。tar。gz4、解压php安装包〔14:04:37rootWEBsrc〕tarxfphp7。4。7。tar。gz5、进入php目录,并生成编译环境〔14:06:36rootWEBsrc〕cdphp7。4。7〔14:07:21rootWEBphp7。4。7〕。configureprefixappphpenablemysqlndwithmysqlimysqlndwithpdomysqlmysqlndwithopensslwithfreetypedirwithjpegdirwithpngdirwithzlibwithlibxmldirusrwithconfigfilepathetcwithconfigfilescandiretcphp。denablembstringenablexmlenablesocketsenablefpmenablemaintainerztsdisablefileinfodisablembregex6、编译安装〔14:10:56rootWEBphp7。4。7〕makej4makeinstall7、系统使用php。ini中的设置拷贝在etc目录下〔14:12:26rootWEBphp7。4。7〕cpfphp。iniproductionetcphp。ini8、拷贝启动脚本到systemd中、使用systemd启动服务〔14:12:28rootWEBphp7。4。7〕cpfsapifpmphpfpm。serviceusrlibsystemdsystem9、拷贝www。conf。default配置文件为www。conf〔14:13:32rootWEBphp7。4。7〕cpappphpetcphpfpm。dwww。conf。defaultappphpetcphpfpm。dwww。conf〔14:14:56rootWEBphp7。4。7〕llappphpetcphpfpm。dtotal40rwrr1rootroot19675Jun1914:14www。confrwrr1rootroot19675Jun1914:10www。conf。default10、修改www。conf配置文件内容、主要修改user、group、listen这三项〔11:15:31roota7etc〕vimappphpetcphpfpm。dwww。conf22;willbeused。23usernginx改为用户为nginx、让nginx启动php24groupnginx组也改为nginx2526;TheaddressonwhichtoacceptFastCGIrequests。27;Validsyntaxesare:28;ip。add。re。ss:porttolistenonaTCPsockettoaspecificIPv4addresson29;aspecificport;30;〔ip:6:addr:ess〕:porttolistenonaTCPsockettoaspecificIPv6addresson31;aspecificport;32;porttolistenonaTCPsockettoalladdresses33;(IPv6andIPv4mapped)onaspecificport;34;pathtounixsockettolistenonaunixsocket。35;Note:Thisvalueismandatory。36listen0。0。0。0:9000网段写为0。0。0。0主要是为了好让nginx监听该端口11、将php的配置文件目录下拷贝为phpfpm。conf〔14:18:02rootWEBphp7。4。7〕cpappphpetcphpfpm。conf。defaultappphpetcphpfpm。conf 启动php: 范例:1、重新加载系统服务,并启动phpfpm、和查看9000端口〔14:20:03rootWEBphp7。4。7〕systemctldaemonreload〔14:21:16rootWEBphp7。4。7〕systemctlenablenowphpfpm。service〔14:21:23rootWEBphp7。4。7〕ssntlgrep9000LISTEN0128:9000: 3。2。1测试PHP 在nginx的html目录下编一个php测试页面 范例:〔14:21:53rootWEBphp7。4。7〕vimappsnginxhtmltest。phplt;?phpphpinfo();? 打开http:10。0。0。27test。php显示php测试页面、说明nginx现在已经支持PHP服务 3。3、二进制安装数据库 mariadb数据库下载地址:https:mirrors。tuna。tsinghua。edu。cnmariadb 安装10。5。3范例:1、通过在清华源上下载10。5。3版本的mariadb数据库〔13:29:50rootMYSQL〕wgethttps:mirrors。tuna。tsinghua。edu。cnmariadbmariadb10。5。3bintarlinuxsystemdx8664mariadb10。5。3linuxsystemdx8664。tar。gz2、创建mysql用户并创建家目录〔14:29:49rootMYSQL〕useraddmysqlssbinnologinM3、创建自定义数据库目录〔14:30:00rootMYSQL〕mkdirdatamysqlmysql3306{data,binlog,logs,tmp}p4、对mysql3306这个目录进行授权,授权给mysql用户chownRmysql。mysqldatamysqlmysql33065、安装相关依赖包〔14:30:58rootMYSQL〕yuminstalllibaio。x8664libaiodevel。x8664novacomserver。x8664libedity6、解压mariadb安装包、指定解压到usrlocal〔14:32:07rootMYSQL〕tarxfmariadb10。5。3linuxsystemdx8664。tar。gzCusrlocal7、进入到usrlocalsrc目录下添加一个mysql的软连接〔14:33:36rootMYSQL〕cdusrlocal〔14:33:52rootMYSQLlocal〕lnsmariadb10。5。3linuxsystemdx8664mysql8、提示:初始化时要在usrlocalmysql目录下创建一个空的影藏文件。my。cnf文件,否则会提示文件不存在,导致初始化失败。这是新版mariadb的特性〔14:34:11rootMYSQLlocal〕cdusrlocalmysql;touch。my。cnf9、初始化命令〔14:34:51rootMYSQLmysql〕。scriptsmysqlinstalldbusermysqlbasedirusrlocalmysqldatadirdatamysqlmysql3306datadefaultsfile。。my。cnf10、修改etcmy。cnf配置文件、指定数据库存放目录、和socket文件路径。〔14:35:18rootMYSQLmysql〕vimetcmy。cnf〔mysqld〕datadirdatamysqlmysql3306datasockettmpmysql。sock11、初始化好了就配置mariadb启动方式为systemd启动〔14:36:15rootMYSQLmysql〕cpsupportfilessystemdmariadb。serviceusrlibsystemdsystemmariadb。service12、设置为开机启动、检查3306端口已开启〔14:37:21rootMYSQLmysql〕systemctlenablenowmariadb〔14:37:12rootMYSQLmysql〕ssntlgrep3306LISTEN080〔::〕:3306〔::〕:13、做软连接,通过mysql命令来进入交互模式〔14:37:55rootMYSQLmysql〕lnsusrlocalmysqlbinmysqlusrbin14、登录mysql服务〔14:39:03rootMYSQLmysql〕mysqlWelcometotheMariaDBmonitor。Commandsendwith;org。YourMariaDBconnectionidis3Serverversion:10。5。3MariaDBMariaDBServerCopyright(c)2000,2018,Oracle,MariaDBCorporationAbandothers。Typehelp;orhforhelp。Typectoclearthecurrentinputstatement。MariaDB〔(none)〕 3。3。1、授权wordpress用户权限和数据库 范例:1、创建一个为wordpress网页提供服务的WEB数据库MariaDB〔(none)〕createdatabaseWEB;QueryOK,1rowaffected(0。001sec)2、创建一个zgy用户来对WEB数据库的所有操作、并且指定IP为10。0。0。27web服务器IP密码为12345MariaDB〔(none)〕grantallonWEB。tozgy10。0。0。27identifiedby12345;QueryOK,0rowsaffected(0。001sec) 3。4、安装wordpresswordpress 下载地址:https:cn。wordpress。orgdownload web服务器主机上下载并安装wordpress 范例:1、进入到usrlocalsrc通过wget下载wordpress〔14:23:16rootWEBphp7。4。7〕cdusrlocalsrc〔14:47:17rootWEBsrc〕wgethttps:cn。wordpress。orglatestzhCN。tar。gz2、解压wordpress安装包〔14:48:43rootWEBsrc〕tarxflatestzhCN。tar。gz3、进入wordpress文件,然后拷贝php文件,并将wordpress动到nginx的html文件下〔14:49:17rootWEBsrc〕cdwordpress〔14:49:50rootWEBwordpress〕cpwpconfigsample。phpwpconfig。php〔14:50:10rootWEBwordpress〕cd。。〔14:50:16rootWEBsrc〕mvwordpressappsnginxhtml4、编辑wordpress调用数据配置文件〔14:50:25rootWEBsrc〕vimappsnginxhtmlwordpresswpconfig。phpWordPress数据库的名称define(DBNAME,WEB);MySQL数据库用户名define(DBUSER,zgy);MySQL数据库密码define(DBPASSWORD,12345);MySQL主机define(DBHOST,10。0。0。37);创建数据表时默认的文字编码define(DBCHARSET,utf8);数据库整理类型。如不确定请勿更改define(DBCOLLATE,);5、修改nginx配置文件把html显示页面的根改为wordpress目录〔14:54:54rootWEBsrc〕vimappsnginxconfnginx。confusernginx;workerprocesses1;events{workerconnections1024;}http{includemime。types;defaulttypeapplicationoctetstream;sendfileon;keepalivetimeout6565;servertokensoff;server{listen80;servername10。0。0。27;charsetutf8;location{errorpage50050250350440450x。html;rootappsnginxhtmlwordpress;因为要将wordpress作为网络目录indexindex。phpindex。htmlindex。htm;}location50x。html{roothtml;}location。php{rootappsnginxhtmlwordpress;因为要将wordpress作为网络目录fastcgipass127。0。0。1:9000;fastcgiindexindex。php;fastcgiparamSCRIPTFILENAMEdocumentrootfastcgiscriptname;includefastcgiparams;}}}4、浏览器访问测试wordpress已经搭好 浏览器访问我们的web服务器IP:http:10。0。0。27 创建wordpress信息 登录wordpress 登录仪表盘