企业级高可用、高并发LNMP集群—LNMP架构搭建

LNMP是什么
LNMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写。
L指Linux,N指Nginx,M一般指MySQL,也可以指MariaDB,P一般指PHP,也可以指Perl或Python
LNMP工作流程(原理):
用户访问静态页面时:
client用户请求 --> 通过cdn、4lb负载均衡等 --> 服务端nginx --> 如果用户请求为html这类静态页面 --> nginx直接返还结果。
用户访问动态页面时:
client用户请求 --> 通过cdn、4lb负载均衡等 --> 服务端nginx --> 如果用户请求为动态页面 --> 请求转移到fastcgi协议 --> 然后发给php-fpm进程 --> 进一步转发到工作进程wrapper --> 再到php服务 --> 如果需要访问mysql数据库 --> 返回结果到php --> php-fpm --> fastcgi --> nginx --> clint

浏览器发送http request请求到服务器(Nginx),服务器响应并处理web请求。如果是静态文本直接返回,否则将脚本(PHP)通过接口传输协议(网关协议)PHP-FCGI(fast-cgi)传输给PHP-FPM(进程管理程序),然后PHP-FPM调用PHP解析器的其中一个进程PHP-CGI来解析php脚本信息。【PHP-FPM在启动时启动了多个PHP-CGI子进程,并发执行。】然后将解析后的脚本返回到PHP-FPM,PHP-FPM再通过fast-cgi的形式将脚本信息传送给Nginx。服务器再通过Http response的形式传送给浏览器,浏览器再进行解析与渲染然后进行呈现。

LNMP架构的搭建

在虚拟机根目录下建立一个lnmp目录,存放从物理机上获得的mysql、php、nginx的源码包
企业级高可用、高并发LNMP集群—LNMP架构搭建_第1张图片

部署mysql

安装mysql
(1)对mysql安装包进行解压,建立mysql用户,建立/usr/local/lnmp目录,目的是在编译安装时将mysql、php、nginx文件指定到此目录下
企业级高可用、高并发LNMP集群—LNMP架构搭建_第2张图片
在这里插入图片描述
(2)解决mysql安装时的依赖性问题
在这里插入图片描述
预编译过程中如果出现报错,缺少依赖性库安装包情形时,进行安装,然后删除编译时生成的CMakeCache.txt 文件,这个文件是预编译时的缓存,删除后再进行编译
(3)编译
注意:
多数源码包都会有 configure文件来进行编译安装,在mysql里用cmake进行编译
企业级高可用、高并发LNMP集群—LNMP架构搭建_第3张图片

[root@server1 mysql-5.7.30]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lnmp/mysql \ ##指定安装的位置

> -DMYSQL_UNIX_ADDR=/usr/local/lnmp/mysql/data/mysql.sock \	##指定套接字文件的位置
> -DMYSQL_DATADIR=/usr/local/lnmp/mysql/data \	
> -DEXTRA_CHARSETS=all \
> -DDEFAULT_CHARSET=utf8 \
>  -DDEFAULT_COLLtion=utf8_general_ci
> -DWITH_MYISAM_STORAGE_ENGINE=1 \		##存储引擎
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \	##存储引擎
> -DWITH_MEMORY_STORAGE_ENGINE=1 \		##存储引擎
> -DWITH_READLINE=1 \		##支持readline库
> -DENABLED_LOCAL_INFILE=1 \	#加载本地数据
> -DMYSQL_USER=mysql \		##只定mysql用户为运行
> -DMYSQL_TCP_PORT=3306		##指定运行端口
> -DWITH_BOOST=boost/boost_1_59_0 	##指定boost

(4)cmake编译之后,进行make && make install,安装时间较长
(5)安装完成后可以在编辑安装时指定的目录中找到mysql文件
企业级高可用、高并发LNMP集群—LNMP架构搭建_第4张图片
配置mysql
在mysql目录下建立data目录,因为在编译时指定的数据是存放在这个目录里的,并且需要改这个目录的所有者为mysql用户(没有此目录,启动mysql服务时是起不来的)
企业级高可用、高并发LNMP集群—LNMP架构搭建_第5张图片

cp mysql-test/include/default_my.cnf /etc/my.cnf	##复制mysql的配置文件到/etc/my.cnf下
cp -a support-files/mysql.server /etc/init.d/mysqld	##复制 mysql 的启动脚本到 /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld 	##添加可执行权限
chkconfig mysqld on		##设置开机启动
ln -s /usr/local/lnmp/mysql/bin/*  /usr/local/bin/	##对mysql命令做软连接

企业级高可用、高并发LNMP集群—LNMP架构搭建_第6张图片
mysql的初始化:
执行mysqld --user=mysql --initialize命令,给定一个登录的临时密码yB)DjlN36ig4(随机的,密码格式:字符字母数字的组合)
企业级高可用、高并发LNMP集群—LNMP架构搭建_第7张图片
启动mysql
企业级高可用、高并发LNMP集群—LNMP架构搭建_第8张图片
登录mysql:

mysql -uroot -p 	##-u指定用户,-p使用密码,密码是之前生成的yB)DjlN36ig4

显示数据库内容时被拒绝,是因为密码没有做安全初始化,所以还需要对mysql执行命令安全初始化
企业级高可用、高并发LNMP集群—LNMP架构搭建_第9张图片
mysql的安全初始化
执行mysql_secure_installation命令后,首先是需要输入旧密码yB)DjlN36ig4,然后再设置新密码,后面选项直接回车,最后Reload privilege tables now?选项,输入y 确认重新加载授权表
企业级高可用、高并发LNMP集群—LNMP架构搭建_第10张图片
企业级高可用、高并发LNMP集群—LNMP架构搭建_第11张图片
再次重新登录mysql时数据库信息就可以显示出来
企业级高可用、高并发LNMP集群—LNMP架构搭建_第12张图片

部署php

安装php
进入/lnmp目录,对php安装包进行解压,configure编译
企业级高可用、高并发LNMP集群—LNMP架构搭建_第13张图片
解决php安装时的依赖性问题
在这里插入图片描述
configure预编译完成后,然后进行安装,make && make install,最后得到下图结果
在这里插入图片描述
企业级高可用、高并发LNMP集群—LNMP架构搭建_第14张图片
配置php
复制php目录中etc下的php-fpm.conf.default,这个是官方给定的默认配置文件
企业级高可用、高并发LNMP集群—LNMP架构搭建_第15张图片
编辑配置文件:vim php-fpm.conf
打开php的运行进程

在这里插入图片描述
企业级高可用、高并发LNMP集群—LNMP架构搭建_第16张图片
复制另一个配置文件

cp php-fpm.d/www.conf.default php-fpm.d/www.conf

在这里插入图片描述
编辑配置文件:vim php-fpm.d/www.conf
更改user和group的值,nobody改为nginx,因为我们使用的是nginx处理请求,如果是动态请求,nginx就会去调用php进行访问

在这里插入图片描述
企业级高可用、高并发LNMP集群—LNMP架构搭建_第17张图片
复制php的主配置文件,主配置文件是php的源码包中的php.ini-development文件
复制到/usr/local/lnmp/php/etc/下,将配置文件统一放到/usr/local/lnmp/php/etc/下

cp /lnmp/php-7.4.1/php.ini-development etc/php.ini

企业级高可用、高并发LNMP集群—LNMP架构搭建_第18张图片
编辑主配置文件更改时区
在这里插入图片描述
企业级高可用、高并发LNMP集群—LNMP架构搭建_第19张图片
启动php

cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm	##复制php的启动脚本,脚本文件在源码包的中sapi/fpm/里
chmod +x /etc/init.d/php-fpm	##为启动脚本添加可执行权限
useradd -s /sbin/nologin -M nginx	##建立nginx用户,因为我们前面的配置里写了指定nginx用户
/etc/init.d/php-fpm start	##脚本开启php服务
netstat -anltupe	##查看到php开启的端口是9000

企业级高可用、高并发LNMP集群—LNMP架构搭建_第20张图片

部署nginx

安装nginx
进入/lnmp目录,对nginx安装包进行解压,configure预编译
在这里插入图片描述
预编译完成后执行make && make install
安装完之后又两个问题:
(1)客户在访问该服务网站时会显示出服务版本号,这样很不安全
查看nginx信息时可以看到nginx的版本号,在企业工作中这样的情况是不允许出现的

在这里插入图片描述
列举访问新浪网站时客户得到的信息,只显示服务名称,没有显示服务版本号
企业级高可用、高并发LNMP集群—LNMP架构搭建_第21张图片
想要和新浪网站一样不显示服务版本号需要在nginx 的源码包中编辑配置:
vim ./src/core/nginx.h
删除 “nginx/” 后面的版本号变量和“nginx/”中的反斜杠
在这里插入图片描述
企业级高可用、高并发LNMP集群—LNMP架构搭建_第22张图片
(2)nginx安装后是比较大的,这是因为编译时使用了debug
在这里插入图片描述
解决方法:
编辑nginx源码包 :
vim ./auto/cc/gcc
注释掉第172行debug功能
在这里插入图片描述
在这里插入图片描述
删除安装好的nginx目录,进行重新编译和安装
再去查看安装的nginx的大小和版本号,就可以看到效果了

在这里插入图片描述
lnmp(php+nginx+mysql结合应用测试)
编辑nginx配置文件:vim conf/nginx.conf
在默认发布目录语句块位置,添加index.php文件,首先去访问这个文件
在这里插入图片描述
企业级高可用、高并发LNMP集群—LNMP架构搭建_第23张图片
开启php连接模块,开启后,它会访问127.0.0.1:9000,这是php-fpm开启的,发布页面是index.php

PHP-FPM是一个实现了Fastcgi的程序,PHP-FPM的管理对象是php-cgi,被PHP官方收了
后来PHP内核集成了PHP-FPM之后就方便多了,使用enalbe-fpm这个编译参数即可
1、php-fpm是一个完全独立的程序,不依赖php-cgi,也不依赖php。因为php-fpm是一个内置了php解释器的FastCGI服务,启动时能够自行读取php.ini配置和php-fpm.conf配置.
2、一个master进程,支持多个pool,每个pool由master进程监听不同的端口,pool中有多个worker进程.
3、每个worker进程都内置PHP解释器,并且进程常驻后台,支持prefork动态增加.
4、每个worker进程支持在运行时编译脚本并在内存中缓存生成的opcode来提升性能.
5、每个worker进程支持配置响应指定请求数后自动重启,master进程会重启挂掉的worker进程.
6、每个worker进程能保持一个到MySQL/Memcached/Redis的持久连接,实现"连接池",避免重复建立连接,对程序透明.
7、master进程采用epoll模型异步接收和分发请求,listen监听端口,epoll_wait等待连接,
8、然后分发给对应pool里的worker进程,worker进程accpet请求后poll处理连接,
9、如果worker进程不够用,master进程会prefork更多进程,
A、如果prefork达到了pm.max_children上限,worker进程又全都繁忙,这时master进程会把请求挂起到连接队列backlog里(默认值是511).

不开启里面的fastcgi_param功能,修改include 直接访问fastcgi.conf配置文件

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需要完成的工作
1、通过调用fastcgi(库)的函数通过socket和ningx通信(读写socket是fastcgi内部实现的功能,对wrapper是非透明的)
2、调度thread,进行fork和kill
3、和application(php)进行通信
企业级高可用、高并发LNMP集群—LNMP架构搭建_第24张图片

为nginx启动命令创建软连接:ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/sbin/
检测配置文件语法:nginx -t
开启nginx:nginx

企业级高可用、高并发LNMP集群—LNMP架构搭建_第25张图片
在浏览器上测试:
这里看到的是nginx的默认欢迎页面
企业级高可用、高并发LNMP集群—LNMP架构搭建_第26张图片
上面在nginx配置文件是已经定义了在访问时首先访问index.php的
现在编写一个php页面作为测试
企业级高可用、高并发LNMP集群—LNMP架构搭建_第27张图片
重新进行访问可以看到是 php 的默认发布页面
企业级高可用、高并发LNMP集群—LNMP架构搭建_第28张图片

你可能感兴趣的:(linux,nginx,运维)