一、LNMP 环境的使用场景
-
网站搭建
- 无论是个人博客、企业官网还是电商平台等各种类型的网站,LNMP 环境都能提供稳定的运行支持。
- 对于需要动态内容展示和数据库交互的网站尤为适用。
-
Web 应用开发
- 开发人员可以利用 LNMP 环境快速搭建开发服务器,进行应用的开发、测试和部署。
- 支持各种流行的 Web 开发框架,如 Laravel、Django 等。
-
数据驱动的项目
当项目需要大量的数据存储和管理时,MySQL 数据库可以高效地处理数据,而 LNMP 环境能确保数据的安全存储和快速访问。
二、LNMP 环境的优点
-
高性能
- Nginx 作为高性能的 Web 服务器,能够处理大量的并发连接,相比传统的 Apache 服务器在性能上有显著提升。
- PHP 和 MySQL 也经过了多年的优化,能够快速执行脚本和处理数据库查询。
-
稳定性高
- 各个组件都经过了广泛的测试和使用,具有较高的稳定性。
- 即使在高负载的情况下,也能保持稳定的运行,减少因服务器故障而导致的业务中断。
-
开源免费
- LNMP 环境中的所有组件都是开源软件,用户可以免费使用和修改,降低了成本。
- 同时,开源社区也提供了丰富的资源和支持,方便用户解决问题。
-
灵活性强
- 用户可以根据自己的需求对各个组件进行定制和配置,满足不同的业务需求。
- 可以轻松添加新的功能模块或扩展现有功能。
三、为什么要使用 LNMP
-
满足现代 Web 应用的需求
随着互联网的发展,Web 应用的复杂性和用户需求不断增加,LNMP 环境能够提供强大的功能和性能来满足这些需求。 -
提高开发效率
开发人员可以利用 LNMP 环境中的各种工具和框架,快速开发出高质量的 Web 应用。 -
降低成本
开源免费的特性使得企业和个人可以在不花费大量资金的情况下搭建强大的 Web 服务器。 -
易于维护
各个组件的独立性使得维护和升级更加容易,不会影响整个系统的稳定性。
四、LNMP 原理和工作原理
-
原理
- LNMP 是由 Linux、Nginx、MySQL 和 PHP 四个组件组成的 Web 服务器环境。
- Linux 作为操作系统,提供了稳定的运行环境和系统资源管理。
- Nginx 作为 Web 服务器,负责接收客户端的请求,并将请求转发给 PHP 进行处理。
- PHP 是一种服务器端脚本语言,用于生成动态内容,并与 MySQL 数据库进行交互。
- MySQL 是一种关系型数据库管理系统,用于存储和管理数据。
-
工作原理
- 当客户端发送一个 HTTP 请求到 Nginx 服务器时,Nginx 首先根据配置文件中的规则对请求进行处理。
- 如果请求是静态文件,如图片、CSS、JavaScript 等,Nginx 直接从文件系统中读取文件并返回给客户端。
- 如果请求是动态内容,如 PHP 脚本,Nginx 将请求转发给 PHP-FPM(PHP FastCGI Process Manager)。
- PHP-FPM 接收到请求后,启动一个 PHP 解释器进程来执行 PHP 脚本。
- PHP 脚本在执行过程中,如果需要与数据库进行交互,就会通过数据库连接库(如 mysqli、PDO 等)连接到 MySQL 数据库。
- MySQL 数据库执行相应的 SQL 查询,并将结果返回给 PHP 脚本。
- PHP 脚本处理完请求后,将生成的动态内容返回给 PHP-FPM。
- PHP-FPM 将结果返回给 Nginx,Nginx 再将结果返回给客户端。
至此,我们可以根据LNMP的工作原理将LNMP环境搭建出来
为了后续实验能成功,先关闭Linux的防火墙及SELinux
systemctl stop firewalld
setenforce 0
一、创建L环境
L环境即是我们熟知的Linux环境,这里使用的是redhat系列的RockyLinux8.6版本的ISO
1、下载镜像
首页-北京大学开源镜像站 (pku.edu.cn)
2、通过虚拟机安装Linux环境
点击新建虚拟机,默认典型;选择下载好的镜像文件。
选择linux,版本选择 Red Hat Enterprise Linux 7 64位 (或者CentOS7 64位)
设置虚拟机的名字,位置选择磁盘比较大的硬盘,建议最好不要放到系统盘
磁盘默认20G就够用了 ,选择虚拟磁盘为单个文件
自定义硬件,选择处理器为2核,内存根据需要可以改到4(方便安装系统快一些)
开启虚拟机
鼠标点击进去后,按键盘上键盘选择第一个,回车
选择简体中文(在最下面)
这4个地方需要修改下,先选择安装目的地
建议选择自定义(不想弄可以直接点完成)
选择标准分区,点+添加第一个分区
第一个分区选择/boot,大小500mb(我一般给1024M)
第二个分区选择swap,大小2GiB
第三个分区选择/,大小为空(默认选择剩余的全部)
分好区后,点击完成
点击ROOT密码,输入两次密码(密码强度大小写字母+数字+符号10位以上)(任何密码都可以的其实)
点击软件选择,选择最小安装后,点击完成。(建议右边全勾上,不勾也行)
点击时间和日期,选择亚洲上海后,点击完成
最后点击开始安装
开始安装等待即可
点击重启系统
重启后输入账号密码
至此,L环境就创建好了
接下来创建N环境,N环境是Nginx,是一个中间件,最经常用的地方还是用来提供网站服务,除了网站也可以用在其他地方,比如代理之类的
二、创建N环境
下载nginx,这里提供两种方法。一是源码安装(比较自由及可选功能点较多,需要网络安装依赖);二是定制包安装(RockyLinux是redhat系列,用的也是rpm包,直接yum安装就行)。这里我选择用源码安装,功能及版本都可以自选
https://nginx.org/en/download.html
yum -y install gcc make pcre-devel openssl-devel
tar -xf nginx-1.27.2.tar.gz
cd nginx-1.27.2
./configure
make
make install
cd /usr/local/nginx
ls
至此,N环境也已经创建安装结束
三、创建M环境
下载数据库,同样也是两个选择。一是,Mysql数据库,优点是目前仍然是大量用户使用的首选。二是,mariadb数据库,Linux系统内置的,可以理解成是Mysql数据库的翻版。这里使用的是mariadb数据库
yum -y install mariadb mariadb-server mariadb-devel
systemctl start mariadb
至此,M环境创建安装结束
四、创建P环境
p环境可以是python或者是php。两者都是非常优秀的后端实现动态的语言。这里选择php
yum -y install php php-fpm php-mysqlnd zlib-devel
至此,P环境创建安装结束。接下来还需要将LNMP相互关联起来。
五、关联LNMP
进入nginx配置文件更改配置
vi /usr/local/nginx/conf/nginx.conf
将nginx配置文件的第一段更改成第二段的内容,然后保存并退出
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
location ~ \.php$ {
root html;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
修改php-fpm的配置文件,增加一个默认用户允许调用
vi /etc/php-fpm.d/www.conf
后面增加多一个nobody的用户,然后保存并退出
listen.acl_users = apache,nginx
listen.acl_users = apache,nginx,nobody
创建一个index.php的文件,简单写php代码,验证一下是否真的可以识别php。按照下列顺序依次复制进Linux中敲回车执行。php代码写入后保存并退出
vi /usr/local/nginx/html/index.php
<?php
echo "Hello! i am PHP。";
?>
在Linux中依次输入以下命令开启php-fpm服务和nginx服务
systemctl start php-fpm
/usr/local/nginx/sbin/nginx
六、验证
打开浏览器,输入ip+index.php的组合。
脚本
#!/bin/bash
#搭建LNMP环境,实现脚本部署动静分离。询问用户想将nginx安装到什么目录,回车则表示默认位置
#定义函数
a(){
echo -e "\033[$1m"$2----------"\033[0m"
}
#判断用户权限
[ $USER != "root" ] && a "92" "不是管理员无法操作,请切换管理员账户!"
# 加载 /etc/os-release 文件中的变量
. /etc/os-release
if [ "$ID" == "centos" ]; then
cd /etc/yum.repos.d
rm -rf *
# 使用 curl 下载文件
curl -o CentOS-7-anon.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-anon.repo
curl_retval=$?
if [ $curl_retval -ne 0 ]; then
a "31" "下载 CentOS-7-anon.repo 文件失败"
else
a "32" "文件下载成功"
fi
# 安装 wget 并将输出重定向到 /dev/null
yum -y install wget &> /dev/null
fi
#返回根目录
cd /root
#关闭防火墙和SELinux,这里需要注意生产环境下的安全风险
a "31" "关闭防火墙和SELinux"
systemctl stop firewalld && systemctl disable firewalld &> /dev/null
setenforce 0
a "32" "成功关闭防火墙和SELinux"
#安装软件包,添加zlib-devel依赖
a "31" "安装软件和依赖包"
yum -y install wget gcc make pcre-devel openssl-devel mariadb mariadb-server mariadb-devel php php-fpm php-mysqlnd zlib-devel &> /dev/null
a "32" "成功安装软件和依赖包"
#安装nginx
a "31" "拉取nginx软件包"
wget https://nginx.org/download/nginx-1.27.2.tar.gz
a "31" "创建解压存放目录"
mkdir nginx/
a "31" "解压nginx到存放目录"
tar -zxf nginx-1.27.2.tar.gz -C nginx/ && cd nginx/nginx-1.27.2
read -p "请输入nginx的安装位置(回车默认安装在/usr/local/nginx)" x
x="${x:-/usr/local/nginx}"
a "31" "配置nginx"
./configure --prefix="${x}" &>/dev/null
make &>/dev/null
make install &>/dev/null
a "32" "nginx安装完毕"
a "31" "更改nginx配置文件"
sed -i '65,71s/#//' "${x}/conf/nginx.conf"
sed -i '69s/^/#/' "${x}/conf/nginx.conf"
sed -i '67s/127.0.0.1:9000/unix:\/run\/php-fpm\/www.sock/' "${x}/conf/nginx.conf"
sed -i '70s/fastcgi_params/fastcgi.conf/' "${x}/conf/nginx.conf"
a "32" "nginx配置文件更改成功"
#修改php-fpm配置文件
a "31" "增加php-fpm支持用户nobody"
sed -i '55s/apache,nginx/apache,nginx,nobody/' /etc/php-fpm.d/www.conf
a "32" "增加用户成功"
#增加权限
a "31" "增加${x}/html/权限为755"
chmod -R 755 "${x}/html/"
#添加php代码
a "31" "添加php代码"
cat << EOF > "${x}/html/index.php"
<?php
define('NGINX_PATH','${x}');
echo "i am php,in ". NGINX_PATH."/html/index.php";
?>
EOF
#重启服务
a "32" "重启服务"
"${x}/sbin/nginx"
systemctl restart php-fpm
systemctl start mariadb
#查询服务开启状态
a "32" "查询服务开启状态"
ss -ntulp | grep nginx
systemctl status php-fpm
#验证服务
a "93" "浏览器输入ip+index.php查看服务是否正常解析"