LNMP架构搭建-----源码编译(mysql,php,nginx)

一、LNMP体系架构简介

LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。

1)Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。代表版本有:debian、centos、ubuntu、fedora、gentoo等。

2)Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。

3)Mysql是一个小型关系型数据库管理系统。

4)Php是一种在服务器端执行的嵌入HTML文档的脚本语言。

这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统。

二、LNMP工作模式

  • 和LAMP不同的是,LNMP中提供web服务的是Nginx。

  • 在LNMP架构中PHP是作为一个独立的服务存在的,这个服务叫做php-fpm。

  • Nginx直接处理静态请求(支持的并发更高,速度比Apache快),动态请求转发给php-fpm处理。

三、LNMP的工作原理

首先,浏览器发送http request请求到服务器(Nginx),服务器响应并处理web请求,将一些静态资源(CSS,图片,视频等)保存服务器上,然后将php脚本通过接口传输协议(网关协议)PHP-FCGI(fast-cgi)传输给PHP-FPM(进程管理程序),PHP-FPM不做处理,然后PHP-FPM调用PHP解析器进程,PHP解析器解析php脚本信息。PHP解析器进程可以启动多个,进行并发执行。然后将解析后的脚本返回到PHP-FPM,PHP-FPM再通过fast-cgi的形式将脚本信息传送给Nginx.服务器再通过Http response的形式传送给浏览器。浏览器再进行解析与渲染然后进行呈现。 

LNMP架构搭建-----源码编译(mysql,php,nginx)_第1张图片

简述php-fpm

PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,它其实是PHP源代码的一个补丁,旨在将Fast-CGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。新版的PHP已经集成了php-fpm,在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。

Fast-CGI 介绍

1)cgi是通用网关接口,是外部应用程序与Web服务器之间的接口标准,cgi是为了保证web server传递过来的数据是标准格式的,方便cgi程序的编写者。

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

3)Fast-cgi像是一个常驻(long-live)型的cgi,是用来提高cgi程序性能的。

4)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脚本。

Fast-CGI的工作原理

1)Web Server启动时载入Fast-CGI进程管理器(IIS ISAPI或Apache Module)

2)FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。

3)当客户端请求到达Web Server时,Fast-CGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到Fast-CGI子进程php-cgi。

4)Fast-CGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当Fast-CGI子进程关闭连接时,请求便告处理完成。Fast-CGI子进程接着等待并处理来自Fast-CGI进程管理器(运行在 Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。

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的整个运作过程。

LNMP架构搭建-----源码编译(mysql,php,nginx)_第2张图片

四、LNMP的优点:

1、作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率。

2、作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器对外进行服务。Nginx 用C编写,不论是系统资源开销还是CPU使用效率都比Perlbal要好的多。

3、作为邮件代理服务器:Nginx同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last/fm 描述了成功并且美妙的使用经验。

4、Nginx 安装非常的简单:配置文件非常简洁(还能够支持perl语法)。Nginx支持平滑加载新的配置,还能够在不间断服务的情况下进行软件版本的升级。

五、MYSQL数据库的源码编译

1、得到mysql数据库的源码包,并且进行解压(可以去官网下载)

tar   zxf   mysql-boost-5.7.17.tar.gz         #解压数据库的源码包

cd  mysql-5.7.17/

LNMP架构搭建-----源码编译(mysql,php,nginx)_第3张图片

2、安装源码编译工具cmake(支持编译C++语言)
cmake跨平台工具是用来预编译mysql源码的,用于设置mysql的编译参数。如:安装目录、数据存放目录、字符编码、排序规则等。他能够输出各种各样的makefile或者project文件,能测试编译器所指出的c++特性。

yum  install  cmake-2.8.12.2-4.el6.x86_64.rpm   -y

LNMP架构搭建-----源码编译(mysql,php,nginx)_第4张图片

3、创建预编译环境,可以定制即加上自己所需的安装条件(比如安装位置等等)

cmake  -DCMAKE_INSTALL_PREFIX=/usr/local/lnmp/mysql \                 #安装目录
> -DMYSQL_DATADIR=/usr/local/lnmp/mysql/data \                                   #数据库存放目录
> -DMYSQL_UNIX_ADDR=/usr/local/lnmp/mysql/data/mysql.sock \         #socket文件路径
> -DWITH_MYISAM_STORAGE_ENGINE=1 \                                             #安装 myisam 存储引擎
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \                                        #安装 innodb 存储引擎
> -DDEFAULT_CHARSET=utf8 \                                                                    #使用utf8字符
> -DDEFAULT_COLLATION=utf8_general_ci \                                             #校验字符

> -DEXTRA_CHARSETS=all \                                                                         #安装所有扩展字符集

在mysql 5.7.17目录下cmake

在初次编译后,我们会发现有许多依赖性未安装,一个一个解决依赖项,缺什么安装什么直到cmake执行完成没有报错 

LNMP架构搭建-----源码编译(mysql,php,nginx)_第5张图片

解决上图的依赖性需要安装gcc  gcc-c++(C语言编译器和C++编译器)

yum   install   gcc   gcc-c++   -y

LNMP架构搭建-----源码编译(mysql,php,nginx)_第6张图片

再进行编译

LNMP架构搭建-----源码编译(mysql,php,nginx)_第7张图片

LNMP架构搭建-----源码编译(mysql,php,nginx)_第8张图片

cmake后加入语句-DWITH_BOOST=boost/boost_1_59_0/ 再次进行编译

LNMP架构搭建-----源码编译(mysql,php,nginx)_第9张图片

LNMP架构搭建-----源码编译(mysql,php,nginx)_第10张图片

yum   install   ncurses-devel   -y               #字符终端处理库

LNMP架构搭建-----源码编译(mysql,php,nginx)_第11张图片

cmake再次进行编译

LNMP架构搭建-----源码编译(mysql,php,nginx)_第12张图片

rm -fr CMakeCache.txt       #清除编译缓存信息

cmake再次进行编译

一次编译完成后,会提示我们删除所在目录下的CMakeCache.txt文件,才能清除上次编译的缓存,从而开始新的编译

LNMP架构搭建-----源码编译(mysql,php,nginx)_第13张图片

LNMP架构搭建-----源码编译(mysql,php,nginx)_第14张图片

yum  intsall   bison   -y                       #linux下c/c++语法分析器

LNMP架构搭建-----源码编译(mysql,php,nginx)_第15张图片

cmake再次进行编译

rm -fr CMakeCache.txt

预编译环境配置完成

LNMP架构搭建-----源码编译(mysql,php,nginx)_第16张图片

LNMP架构搭建-----源码编译(mysql,php,nginx)_第17张图片

4、编译汇编make & make install

make

LNMP架构搭建-----源码编译(mysql,php,nginx)_第18张图片

make   install

LNMP架构搭建-----源码编译(mysql,php,nginx)_第19张图片

5、配置MYSQL

1)mysql的初始化

进入源码编译目录,再进入mysql安装的位置,将编译完成的默认配置文件放在/etc下

cd   /usr/local/lnmp/mysql/                            #mysql的安装位置

cd   support-files/                                          #配置文件所在位置

cp    my-default.cnf    /etc/my.cnf                 #将编译生成的配置文件拷贝到/etc下

LNMP架构搭建-----源码编译(mysql,php,nginx)_第20张图片

basedir = /usr/local/lnmp/mysql                                                  #mysql的安装目录

datadir = /usr/local/lnmp/mysql/data                                          #mysql数据存放位置

prot = 3306                                                                                   # mysql服务对外端口

socket = /usr/local/lnmp/mysql/data/mysql.sock                       # mysql与外界联系的套接字文件位置

LNMP架构搭建-----源码编译(mysql,php,nginx)_第21张图片

2)配置mysql服务

在/usr/local/lnmp/ support-files/目录下将mysql启动脚本复制到系统启动服务的默认目录中

cp    mysql.server   /etc/init.d/mysqld

将编译生成的mysql二进制命令放进系统的环境变量文件中,保证可以直接调用该二进制命令

vim    ~/.bash_profile

PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin            #将mysql的命令放进环境变量中

也可以在root的path中,使用软连接添加进来。(ln -s /usr/local/lnmp/mysql/bin/* /usr/local/sbin

LNMP架构搭建-----源码编译(mysql,php,nginx)_第22张图片

source   ~/.bash.profile                            #加载.bash   profile文件

执行mysql-install-db脚步初始化mysql中的data目录并创建一些表格,但是这里提示要使用--initialize

mysql_install_db

对mysql服务进行限制(利用mysql用户),将mysql服务的工作空间局限在mysql用户的家目录中,创建mysql组和mysql用户

groupadd -g 27 mysql

useradd -u 27 -g 27 -M -d /usr/local/lnmp/mysql -s /sbin/nologin mysql             #指定mysql用户的家目录为/usr/local/lnmp/mysql/data(-M表示不创建其家目录)。为了系统安全,MYSQL默认使用mysql用户来运行相关程序。

id   mysql        #查看mysql用户

将mysql的目录改为仅mysql可读写,因为mysql服务将要往这个目录中写数据,保证其有执行权限

LNMP架构搭建-----源码编译(mysql,php,nginx)_第23张图片

mysqld --initialize --user=mysql                  #生成初始化密码

opsN

LNMP架构搭建-----源码编译(mysql,php,nginx)_第24张图片

此时在mysql目录下生成data目录

LNMP架构搭建-----源码编译(mysql,php,nginx)_第25张图片

启动mysql服务 在data目录查看sock文件

/etc/init.d/mysqld     start

LNMP架构搭建-----源码编译(mysql,php,nginx)_第26张图片

进入mysql数据库查看,无法显示databases,根据提示要我们修改密码

LNMP架构搭建-----源码编译(mysql,php,nginx)_第27张图片

执行安全初始化脚本mysql_secure_installation

后面根据提示前两个回车,后面选择y

Enter   password   for  user   root                          #输入超级用户密码(执行脚本默认生成的那个密码)

New    password                                                      #输入新的密码

Re-enter    new   password                                     #再次输入密码

setup   VALIDATE   PASSWORD   plugin?          #开启密码强度校验

Disallow   root    login   remotely?                           #不允许root用户远程登陆

Remove   anonymous   users?                                #移除匿名用户

Remove   test   database   and   access   to   it?   #移除test数据库

Reload     privilege     tables    now?                        #重新加载数据库

LNMP架构搭建-----源码编译(mysql,php,nginx)_第28张图片

LNMP架构搭建-----源码编译(mysql,php,nginx)_第29张图片

登陆mysql数据库测试

mysql    -p                                    #登陆数据库

密码为刚才设定的新密码

show     databases                        #显示数据库

LNMP架构搭建-----源码编译(mysql,php,nginx)_第30张图片

即mysql部署完成

六、PHP源码编译

1、得到PHP的源码包并解压,并且进入到解压目录

tar   jxf   php-5.6.35.tar.bz2

cd   php-5.6.35

LNMP架构搭建-----源码编译(mysql,php,nginx)_第31张图片

2、在解压目录php.5.6.35中创造预编译环境

./configure --perfix=/usr/local/lnmp/php                                        #php安装的位置

--with-config-file-path=/usr/local/lnmp/php/etc                             #php配置文件所在的位置

--with-mysql=mysqlnd --enable-mysqlnd

--with-mysqli=mysqlnd

--with-pdo-mysql=mysqlnd                                                              #支持与mysql数据库之间建立联系

--with=openssl                                                                                   #支持openssl加密

 --with-snmp

--with-gd --with-zlib

--with-curl

--with-libxml-dir                                                                                   #支持libxml函数

--with-png-dir --with-jpeg-dir --with-freetype-dir                               #php处理图片格式

--with-pear

--with-gettext

--with-gmp

--enable-inline-optimization

--enable-soap

--enable-ftp

--enable-sockets

--enable-mbstring

--enable-fpm                                                                               # 开启fpm模式(nginx等服务用的)

--with-fpm-user=nginx                                                                # 对PHP服务的限制通过nginx用户来实现

--with-fpm-group=nginx                                                              # PHP以nginx用户组身份运行

--with-mcrypt                                                                               # 提供了对多种块算法的支持 主要用来实现加密等算法

--with-mhash                                                                                # 加密算法

编译会报错缺少什么软件和服务就安装什么,解决其依赖性

LNMP架构搭建-----源码编译(mysql,php,nginx)_第32张图片

LNMP架构搭建-----源码编译(mysql,php,nginx)_第33张图片

yum   install   libxml2-devel   -y

LNMP架构搭建-----源码编译(mysql,php,nginx)_第34张图片

再次进行编译

LNMP架构搭建-----源码编译(mysql,php,nginx)_第35张图片

LNMP架构搭建-----源码编译(mysql,php,nginx)_第36张图片

yum   install    openssl-devel   -y        

LNMP架构搭建-----源码编译(mysql,php,nginx)_第37张图片

yum   install   gd-devel-2.0.35-11.el6.x86_64.rpm   -y

安装包没有的需要去官网上下载

LNMP架构搭建-----源码编译(mysql,php,nginx)_第38张图片

再次进行编译

LNMP架构搭建-----源码编译(mysql,php,nginx)_第39张图片

LNMP架构搭建-----源码编译(mysql,php,nginx)_第40张图片

yum   install   libmcrypt-2.5.8-9.el6.x86_64.rpm     -y

yum   install   libmcrypt-devel-2.5.8-9.el6.x86_64.rpm    -y

LNMP架构搭建-----源码编译(mysql,php,nginx)_第41张图片

LNMP架构搭建-----源码编译(mysql,php,nginx)_第42张图片

再次进行编译

LNMP架构搭建-----源码编译(mysql,php,nginx)_第43张图片

yum   install   net-snmp-devel   -y

LNMP架构搭建-----源码编译(mysql,php,nginx)_第44张图片

最后不再报错,即php编译成功

LNMP架构搭建-----源码编译(mysql,php,nginx)_第45张图片

LNMP架构搭建-----源码编译(mysql,php,nginx)_第46张图片

3、完成后make &&make install 完成安装

make

LNMP架构搭建-----源码编译(mysql,php,nginx)_第47张图片

make   install

LNMP架构搭建-----源码编译(mysql,php,nginx)_第48张图片

4、查看目录并根据编译内容建立nginx用户

LNMP架构搭建-----源码编译(mysql,php,nginx)_第49张图片

5、php服务的简单配置(配置pid和时区)

cd   /usr/local/lnmp/php/etc/

cp   php-fpm.conf.default   php-fpm.conf           #复制php配置文件到/etc下

vim    php-fpm.conf                                              #编辑配置文件,打开pid

pid = run/php-fpm.pid

LNMP架构搭建-----源码编译(mysql,php,nginx)_第50张图片

LNMP架构搭建-----源码编译(mysql,php,nginx)_第51张图片

cp   php.ini-production   /usr/local/lnmp/php/etc/php.ini     #将配置文件复制到指定路径,方便后续操作

cd   /usr/local/lnmp/php/etc/

vim   php.ini                    #编辑php.ini更改时区为Asia/Shanghai

LNMP架构搭建-----源码编译(mysql,php,nginx)_第52张图片

 

6、

6、将php启动的脚本复制到系统启动脚本的默认目录下,并测试php是否可以启动

cd php-5.6.35/sapi/fpm/

file   init.d.php-fpm

cp init.d.php-fpm /etc/init.d/php-fpm                   #制作php启动脚本

chmod +x /etc/init.d/php-fpm                               #给启动脚本添加可执行权限

/etc/init.d/php-fpm    start                                     #打开php服务

LNMP架构搭建-----源码编译(mysql,php,nginx)_第53张图片

netstat -antlp                                                         #查看php服务的监听端口

LNMP架构搭建-----源码编译(mysql,php,nginx)_第54张图片

即php部署完成

七、nginx的源码编译

1、得到nginx的源码包并解压,进入目录并ls查看

tar   zxf   nginx-1.14.0.tar.gz

LNMP架构搭建-----源码编译(mysql,php,nginx)_第55张图片

2、删除版本号,当外界访问时看不见版本号,增加了安全性

cd   nginx-1.14.0/src/core

vim  nginx.h              #删除版本号

LNMP架构搭建-----源码编译(mysql,php,nginx)_第56张图片

vim  nginx-1.14.0/auto/cc/gcc            #注释debug,这样产生的nginx的程序只有几百k

LNMP架构搭建-----源码编译(mysql,php,nginx)_第57张图片

3、./configure添加需要的模块进行预编译环境

cd nginx-1.14.0

./configure --prefix=/usr/local/lnmp/nginx                  #nginx的安装路径

--with-http_ssl_module                                               #支持https

--with-http_stub_status_module

--user=nginx                                                                #运行在nginx用户

--group=nginx                                                             #运行在nginx组

--with-threads                                                              #支持线程并发

--with-file-aio

LNMP架构搭建-----源码编译(mysql,php,nginx)_第58张图片

解决源编译中的依赖性问题,过程中包错缺少pcre服务,直接安装

yum   install   pcre-devel   -y

LNMP架构搭建-----源码编译(mysql,php,nginx)_第59张图片

重新./configure编译,即编译成功

LNMP架构搭建-----源码编译(mysql,php,nginx)_第60张图片

4、编译汇编make  &&  make  install

make

LNMP架构搭建-----源码编译(mysql,php,nginx)_第61张图片

make  install

LNMP架构搭建-----源码编译(mysql,php,nginx)_第62张图片

5、配置nginx服务

1)在/usr/local/lnmp/nginx/conf/nginx.conf 编辑配置文件, 打开65-71行,去掉注释

cd   /usr/local/lnmp/nginx/conf

vim   nginx.conf                    #将nginx与php结合起来

LNMP架构搭建-----源码编译(mysql,php,nginx)_第63张图片

2)cd  /usr/local/lnmp/nginx/

ln  -s  /usr/local/lnmp/nginx/sbin/nginx   /usr/local/sbin           #将nginx启动脚步作链接到/usr/local/sbin下

nginx   -t                 #检查配置文件语法是否有错

nginx                      #启动nginx服务

netstat   -antlp      #查看nginx服务端口

LNMP架构搭建-----源码编译(mysql,php,nginx)_第64张图片

3)nginx配置成功

LNMP架构搭建-----源码编译(mysql,php,nginx)_第65张图片

4)在nginx/html下,编写php测试文件,完成后网页测试访问

5)在浏览器处输入nginx和php所在主机ip:172.25.88.1/index.php

出现如下图所示界面,表示nginx与php结合成功

LNMP架构搭建-----源码编译(mysql,php,nginx)_第66张图片

6)修改php的默认访问(将php后缀文件作为默认发布文件)

将index.php放在最前面

7)重新加载nginx服务

nginx  -s   reload

8)访问测试:即index.php为默认访问文件

LNMP架构搭建-----源码编译(mysql,php,nginx)_第67张图片

LNMP架构搭建-----源码编译(mysql,php,nginx)_第68张图片

你可能感兴趣的:(LNMP架构搭建-----源码编译(mysql,php,nginx))