LNMP架构

本文正在参与 “走过Linux 三十年”话题征文活动

LNMP架构基本概述

什么是LNMP

  • LNMP是一套技术的组合,L=Linux、N=Nginx、M=[MySQL|Mariadb]、P=[PHP|Python]

LNMP实现过程

  • 用户请求http://birenchong.cn/index.php,对于Nginx服务而言,是无法处理index.php这样的动态脚本的,那么Nginx该如何配置,才能支持这样的动态请求呢?
    • 第一步:当用户发起HTTP请求,请求首先被Nginx接收;
    • 第二步:Nginx通过预先定义好的location规则进行匹配;
    • 第三步:Nginx将匹配到的动态内容,通过fastcgi协议传到给后端的php应用服务处理

image-20210811113048803

LNMP实现细节

  • Nginx、PHP、MysQL之间是如何工作的
    • 1.用户首先通过http协议发起请求,请求会先抵达Nginx;
    • 2.Nginx根据用户的请求进行Location规则匹配;
    • 3.Location如果匹配到请求是静态,则由Nginx读取本地直接返回;
    • 4.Location如果匹配到请求是动态,则由Nginx将请求转发给fastcgi协议;
    • 5.fastgi 收到后会将请求交给php-fpm管理进程;
    • 6.php-fpm管理进程接收到后会调用具体的工作进程warrap ;
    • 7.warrap进程会调用php解析器解析代码,php解析后直接返回;
    • 8.如果有查询数据库操作,则由php连接数据库(用户 密码 IP)发起查询的操作;
    • 9.最终数据由mysql->php->php-fpm->fastcgi->nginx->http->user;

image-20210811113357427

LNMP架构环境安装

Nginx安装

1.使用官方仓库安装Nginx

[root@nginx ~]# cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

#安装Nginx
[root@nginx ~]# yum install nginx -y
复制代码

2.配置Nginx进程运行用户

[root@nginx ~]# groupadd -g666 www
[root@nginx ~]# useradd -u666 -g666 www
[root@nginx ~]# sed -i '/^user/c user www;' /etc/nginx/nginx.conf
复制代码

3.启动Nginx,并将Nginx加入开机自启

[root@nginx ~]# systemctl start nginx
[root@nginx ~]# systemctl enable nginx
复制代码

php安装

  • 使用第三方扩展源安装php7.1

1.安装rpm生成repo文件,或手动新增repo文件;

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

#手动配置yum源
[root@nginx ~]# cat /etc/yum.repos.d/php.repo
[webtatic-php]
name = php Repository
baseurl = http://us-east.repo.webtatic.com/yum/e17/x86_64/
gpgcheck = 0
复制代码

2.卸载低版本的php

[root@nginx ~]# yum remove php-mysql-5.4 php php-fpm php-common
复制代码

3.安装高版本的php

[root@nginx ~]# yum -y install php71w php71w-cli \
php71w-common php71w-devel php71w-embedded php71w-gd \
php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml \
php71w-fpm php71w-mysqlnd php71w-opcache \
php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
复制代码

4.配置php-fpm用户与Nginx的运行用户保持一致

[root@nginx ~]# sed -i '/^user/c user = www ' /etc/php-fpm.d/www.conf
[root@nginx ~]# sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
复制代码

5.启动php-fpm并将其加入开机自启

[root@nginx~]# systemctl start php-fpm
[root@nginx~]# systemctl enable php-fpm
复制代码

MySQL安装

1.安装Mariadb数据库

[root@nginx ~]# yum install mariadb-server mariadb -y
复制代码

2.启动Mariadb数据库,并加入开机自动

[root@nginx ~]# systemctl start mariadb
[root@nginx ~]# systemctl enable mariadb
复制代码

3.给Mariadb配置登陆密码,并使用新密码进行登录数据库

[root@nginx ~]# mysqladmin password 'birenchong123.com'
[root@nginx ~]# mysql -uroot -pbirenchong123.com
复制代码

LNMP架构环境配置

  • 在配置NginxPHP集成之前,我们需要先了解NginxFastcgi代理配置语法

Fastcgi代理语法

1.设置fastcgi服务器的地址,该地址可以指定为域名或IP地址,以及端口

Syntax : fastcgi_pass address;
Default: -
Context: location,if in location

#语法示例
fastcgi_pass localhost:9000;
复制代码

2.设置fastcgi 默认的首页文件,需要结合fastcgi_param一起设置

Syntax : fastcgi_index name;
Default: -
Context: http,server,location
复制代码

3.通过fastcgi_param设置变量,并将设置的变量传递到后端的fastcgi服务

syntax : fastcgi_param parameter value [if_not_empty];
Default: -
Context: http,server,location

#语法示例
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
复制代码

Nginx与PHP集成

1.编写Nginx配置文件

[root@nginx ~]# cat /etc/nginx/conf.d/php.conf
server {
    server_name php.birenchong.cn;
    listen 80;
    root /code;
    index index.php index.html;
    
    location ~ \.php$ {i
        root /code;
        fastcgi_pass	127.0.0.1:9000;
        fastcgi_param	SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include			fastcgi_params;
    }
}
复制代码

2.在/code目录下创建info.php文件

[root@nginx ~]# cat /code/info.php
<?php
	phpinfo();
?>
复制代码

3.通过浏览器访问http://php.birenchong.cn/info.php ,返回如下页面表示nginxphp配置成功;

image-20210811114204173

PHP与MySQL集成

1.在/code目录下创建mysqli.php文件,填入对应的数据库IP、用户名、密码

[root@nginx ~]# cat /code/mysqli.php
<?php
    $servername = "localhost";
    $username = "root";
    $password = "birenchong123.com";
    
    //创建连接
    $conn = mysqli_connect($servername,$username,$password);
    
    //检测连接
    if (!$conn) {
    	die( "Connection failed: " . mysqli_connect_error());
    }
    echo "php连接MySQL数据库成功";
?>
复制代码

2.使用php命令直接解析文件

[root@nginx ~]# php /code/mysqli.php
php连接MySQL数据库成功
复制代码

3.也可以通过浏览器访问http://php.birenchong.cn/mysqli.php文件,获取解析结果

部暑博客产品Wordpress

配置Nginx

1.配置Nginx虚拟主机站点,域名为blog.birenchong.cn

[root@nginx ~]# cat /etc/nginx/conf.d/wordpress.conf
server {
    listen 80;
    server_name blog.birenchong.cn;
    root /code/wordpress;
    index index.php index.html;
    
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
复制代码

2.检测语法,并重启nginx服务

[root@nginx ~]# nginx -t
[root@nginx ~]# systemctl restart nginx
复制代码

配置MySQL

由于wordpress产品需要依赖数据库,所以需要手动建立数据库

[root@nginx ~]# mysql -uroot -pbirenchong123.com
mysql> create database wordpress;
mysql> exit
复制代码

部署Wordpress

1.获取wordpress产品,解压并部署wordress

[root@nginx ~] # medir /code
[root@nginx ~]# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
[root@nginx ~]# tar xf wordpress-4.9.4-zh_CN.tar.gz -c /code
复制代码

2.授权目前的权限为进程运行的用户身份;

[root@nginx ~]# chown -R ww.www /code/wordpress/
复制代码

部署知乎产品Wecenter

配置Nginx

1.配置Nginx虚拟主机站点,域名为zh.birenchong.cn

[root@nginx ~]# cat /etc/nginx/conf.d/zh.conf
server {
    listen 80;
    server_name zh.birenchong.cn;
    root /code/zh;
    index index.php index.html;
    
    location ~ \.php$ {
        root /code/zh;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
复制代码

2.检查语法,并重启nginx服务

[root@nginx ~]# systemctl restart nginx
复制代码

配置MySQL

由于wecenter产品需要依赖数据库,所以需要手动建立数据库

[root@nginx ~]# mysql -uroot -pbirenchong123.com
MariaDB [(none)]> create database zh;
MariaDB [(none)]> exit
复制代码

部署wecenter

1.获取wecenter产品,解压并部署wecenter

[root@nginx ~]# wget http://ahdx.down.chinaz.com/201605/WeCenter_v3.2.1.zip
[root@nginx ~]# unzip WeCenter_v3.1.9.zip
[root@nginx ~]# mv UPLOAD/ /code/zh
复制代码

2.授权目前的权限为进程运行的用户身份;

[root@nginx ~]# chown -R ww.www /code/zh/
复制代码

拆分数据库至独立服务器

为何要拆分数据库

  • 由于单台服务器运行LNMP架构会导致网站访问缓慢,当系统内存被吃满时,很容易导致系统出现 oom ,从而killMysQL数据库,所以需要将web和数据库进行独立部署。
  • 拆分数据库能解决什么问题
    • 1.缓解web 网站的压力;
    • 2.增强数据库读写性能;
    • 3.提高用户访问的速度;

数据库拆分架构演变

image-20210811114358405

数据库拆分环境准备

主机名称 应用环境 外网地址 内网地址
web01 nginx+php 10.0.0.7 172.16.1.7
db01 mysql 172.16.1.51

数据库拆分实现步骤

web服务器操作如下

1.备份web01上的数据库

[root@web01 ~]# mysqldump -uroot -p 'birenchong123.com' --all-databases > mysql-all.sql
复制代码

2.将web01上备份的数据库拷贝至db01服务器上

[root@web01 ~]# scp mysql-all.sql root@172.16.1.51:/tmp
复制代码

数据库服务器操作如下

1.将web01服务器上推送的数据库备份文件恢复至db01服务器新数据库中

[root@db01 ~]# yum install mariadb mariadb-server -y
[root@db01 ~]# systemctl start mariadb
[root@db01 ~]# systemctl enable mariadb
[root@db01 ~]# mysql -uroot < /tmp/mysql-all.sql
复制代码

2.数据库导入完成后,重启数据库,使用新密码进行登录,并检查数据库已被导入成功

[root@db01 ~]# systemctl restart mariadb
[root@db01 ~]# mysql -uroot -pbirenchong123.com
mysql> show databases;
复制代码

3.在新数据库上授权,允许所有网段,通过all账户连接并操作该数据库

授权所有权限grant all privileges;

授权所有库所有表*.*;

将授权赋予给哪个用户,这个用户只能通过哪个网段过来,%表示所有;'all'@'%'

授权该用户登录的密码identified by;

mysql> grant all on *.* to all@'%' identified by 'birenchong123.com';
Query OK,0 rows affected (0.0e sec)

mysql> flush privileges;
Query OK,0 rows affected (0.00 sec)
复制代码

修改代码指向新数据库

1.修改wordpress产品代码连接数据库的配置文件

[root@web01~]# vim /code/wordpress/wp-config.php
#数据库名称
define( 'DB_NAME' , 'wordpress');
#数据库用户
define( 'DB_USER', 'all' );
#数据库密码
define( 'DB_PASSWORD', 'birenchong123.com' );
#数据库地址
define( 'DB_HOST', '172.16.1.51 ' );
复制代码

2.修改wecenter产品代码连接数据库的配置文件

[root@web01 zh]# grep -iR "birenchong123.com"|grep -v cache
system/config/database.php:	'password' => 'birenchong123.com ',
[root@web01 zh]# vim /code/zh/system/config/database.php
'host' =>'172.16.1.51',
'username' => 'all',
'password' => 'birenchong123.com',
'dbname' => 'zh',
复制代码

扩展多台相同的Web服务器

为何要扩展多台web节点

  • 单台web服务器能抗住的访问量是有限的,配置多台web服务器能提升更高的访问速度。
  • 扩展多台节点解决什么问题
    • 1.单台web节点如果故障,会导致业务down 机;
    • 2.多台web节点能保证业务的持续稳定,扩展性高;
    • 3.多台web节点能有效的提升用户访问网站的速度;

扩展多web节点架构演变

image-20210811114807510

扩展多web节点环境准备

主机名称 应用环境 外网地址 内网地址
web01 nginx+php 10.0.0.7 172.16.1.7
web02 nginx+php 10.0.0.8 172.16.1.8
db01 mysql 172.16.1.51

扩展多web节点实现步骤

  • 通过web01现有环境快速的扩展一台web02的服务器,数据库统一使用db01

LNP环境安装

1.创建www用户

[root@web02~]# groupadd -g666 www
[root@web02~]# useradd -u666 -g666 www
复制代码

2.安装LNP

[root@web02~]# scp -rp root@172.16.1.7:/etc/yum.repos.d/* /etc/yum.repos.d/
[root@web02~]# scp -rp root@172.16.1.7:/etc/pki/rpm-gpg/* /etc/pki/rpm-gpg/

[root@web02~]# yum install nginx -y
[root@web02~]# yum -y install php71w php71w-cli \
php71w-common php71w-devel php71w-embedded php71w-gd \
php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml \
php71w-fpm php71w-mysqlnd php71w-opcache \
php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
复制代码

LNP配置导入

1.将 web01nginx配置文件导入到web02

[root@web02~]# scp -rp root@172.16.1.7:/etc/nginx /etc/
复制代码

2.将web01php配置文件导入到web02

[root@web02~]# scp -rp root@172.16.1.7:/etc/php-fpm.d /etc/
复制代码

导入代码文件

1.将web01的代码打包传输到web02服务器上

[root@web01 ~]# tar czf code.tar.gz /code
[root@web01 ~]# scp code.tar.gz root@172.16.1.8:/tmp
复制代码

2.在web02服务器上进行解压

[root@web02~]# tar xf /tmp/code.tar.gz -C /
复制代码

启动服务验证

启动nginx与php-fpm并加入开机自启

[root@web02 ~]# systemctl start nginx php-fpm
[root@web02 ~]# systemctl enable nginx php-fpm
复制代码

拆分静态资源至独立服务器

为何要拆分静态资源

  • 当后端的web节点出现多台时,会导致用户上传的图片、视频附件等内容仅上传至一台web服务器,那么其他的web服务器则无法访问到该图片。
  • 如果增加一台共享存储能解决什么问题
    • 1.保证了多台web节点静态资源一致。
    • 2.有效节省多台web节点的存储空间。
    • 3.统一管理静态资源,便于后期推送至CDN进行静态资源加速

拆分静态资源架构演变

image-20210811114951774

增加共享存储环境准备

主机名称 应用环境 外网地址 内网地址
web01 nginx+php 10.0.0.7 172.16.1.7
web02 nginx+php 10.0.0.8 172.16.1.8
nfs nfs 172.16.1.31
db01 mysql 172.16.1.51

增加共享存储实现步骤

配置NFS存储

1.安装并配置nfs

[root@nfs ~]# yum install nfs-utils -y
[root@nfs ~]# cat /etc/exports
/data/blog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zh 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
复制代码

2.创建共享目录,并进行授权

[root@nfs ~]# mkdir /data/{blog,zh} -p
[root@nfs ~]# chown -R www.www /data/
复制代码

3.启动nfs服务,并加入开机自启

[root@nfs ~]# systemctl restart nfs-server
复制代码

导入静态资源至存储

1.web01节点安装nfs ,然后使用showmount查看服务端共享的资源;

[root@web01 ~]# yum install nfs-utils -y
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/zh	172.16.1.0/24
/data/blog	172.16.1.0/24
复制代码

2.查找 wordpress静态资源,然后;

# 首先打开浏览器->右键->检查->Network->
# 然后点击左上角的Select按钮->点击对应的图片
# 最后提取站点中对应的url地址->
# http://blog.birenchong.cn/wp-content/uploads/2021/08/timg.gif
复制代码

3.拷贝静态资源至nfs共享存储

[root@web01 ~]# cd /code/wordpress/wp-content/
[root@web01 wp-content]# scp -rp uploads/* root@172.16.1.31:/data/blog
复制代码

节点1接入共享存储

1.web01客户端执行挂载操作

[root@web01 wp-content]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
复制代码

2.将挂载信息加入开机自启

[root@web01 wp-content]# tail -1 /etc/fstab
172.16.1.31:/data/blog /code/wordpress/wp-content/uploads nfs defaults 0 0
[root@web01 wp-content]# mount -a
复制代码

节点2接入共享存储

1.web02客户端直接挂载nfs即可

[root@web02 ~]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
复制代码

2.将挂载信息加入开机自启

[root@web02 ~]# tail -1 /etc/fstab
172.16.1.31:/data/blog /code/wordpress/wp-content/uploads nfs defaults 0 0
[root@web02~]# mount -a
复制代码

扩展节点带来的新问题

  • F1: 如果我们添加了一台C应用服务器,如何能实现快速扩展?
    • 1.准备LNP环境;
    • 2.拷贝任意A或B上的配置文件,代码;
    • 3.挂载NFS存储;
  • F2: 现在有多个WEB服务器,该如何进行访问?
    • 1.DNS轮询
      • (1) 需要所有的web节点具备公网IP地址;
      • (2) 公网独立IP需要费用,而且不便宜;
      • (3) 所有的web节点有公网IP,不安全;
      • (4) DNS只有轮询机制,没有健康检查功能;
    • 2.负载均衡
      • (1) 所有的web节点不需要有公网IP,能节省成本并保证安全;
      • (2) 能够对后端的web节点进行健康检查机制;
      • (3) 负载均衡有多种调度算法来满足企业不同需求;

image-20210811115229070

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享