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目录,存放从物理机上获得的mysql、php、nginx的源码包
安装mysql
(1)对mysql安装包进行解压,建立mysql用户,建立/usr/local/lnmp目录,目的是在编译安装时将mysql、php、nginx文件指定到此目录下
(2)解决mysql安装时的依赖性问题
预编译过程中如果出现报错,缺少依赖性库安装包情形时,进行安装,然后删除编译时生成的CMakeCache.txt 文件,这个文件是预编译时的缓存,删除后再进行编译
(3)编译
注意:
多数源码包都会有 configure文件来进行编译安装,在mysql里用cmake进行编译
[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文件
配置mysql
在mysql目录下建立data目录,因为在编译时指定的数据是存放在这个目录里的,并且需要改这个目录的所有者为mysql用户(没有此目录,启动mysql服务时是起不来的)
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命令做软连接
mysql的初始化:
执行mysqld --user=mysql --initialize命令,给定一个登录的临时密码yB)DjlN36ig4(随机的,密码格式:字符字母数字的组合)
启动mysql
登录mysql:
mysql -uroot -p ##-u指定用户,-p使用密码,密码是之前生成的yB)DjlN36ig4
显示数据库内容时被拒绝,是因为密码没有做安全初始化,所以还需要对mysql执行命令安全初始化
mysql的安全初始化
执行mysql_secure_installation命令后,首先是需要输入旧密码yB)DjlN36ig4,然后再设置新密码,后面选项直接回车,最后Reload privilege tables now?选项,输入y 确认重新加载授权表
再次重新登录mysql时数据库信息就可以显示出来
安装php
进入/lnmp目录,对php安装包进行解压,configure编译
解决php安装时的依赖性问题
configure预编译完成后,然后进行安装,make && make install,最后得到下图结果
配置php
复制php目录中etc下的php-fpm.conf.default,这个是官方给定的默认配置文件
编辑配置文件:vim php-fpm.conf
打开php的运行进程
复制另一个配置文件
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进行访问
复制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
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
安装nginx
进入/lnmp目录,对nginx安装包进行解压,configure预编译
预编译完成后执行make && make install
安装完之后又两个问题:
(1)客户在访问该服务网站时会显示出服务版本号,这样很不安全
查看nginx信息时可以看到nginx的版本号,在企业工作中这样的情况是不允许出现的
列举访问新浪网站时客户得到的信息,只显示服务名称,没有显示服务版本号
想要和新浪网站一样不显示服务版本号需要在nginx 的源码包中编辑配置:
vim ./src/core/nginx.h
删除 “nginx/” 后面的版本号变量和“nginx/”中的反斜杠
(2)nginx安装后是比较大的,这是因为编译时使用了debug
解决方法:
编辑nginx源码包 :
vim ./auto/cc/gcc
注释掉第172行debug功能
删除安装好的nginx目录,进行重新编译和安装
再去查看安装的nginx的大小和版本号,就可以看到效果了
lnmp(php+nginx+mysql结合应用测试)
编辑nginx配置文件:vim conf/nginx.conf
在默认发布目录语句块位置,添加index.php文件,首先去访问这个文件
开启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)进行通信
为nginx启动命令创建软连接:ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/sbin/
检测配置文件语法:nginx -t
开启nginx:nginx
在浏览器上测试:
这里看到的是nginx的默认欢迎页面
上面在nginx配置文件是已经定义了在访问时首先访问index.php的
现在编写一个php页面作为测试
重新进行访问可以看到是 php 的默认发布页面