LNMP架构
# 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
应用服务处理
- 第一步:当用户发起
# 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
;
- 1.用户首先通过
# 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
3
4
5
6
7
8
9
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
2
3
3.启动Nginx
,并将Nginx
加入开机自启
[root@nginx ~]# systemctl start nginx
[root@nginx ~]# systemctl enable nginx
2
# 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
3
4
5
6
7
8
9
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
2
3
4
5
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
2
5.启动php-fpm
并将其加入开机自启
[root@nginx~]# systemctl start php-fpm
[root@nginx~]# systemctl enable php-fpm
2
# MySQL安装
1.安装Mariadb
数据库
[root@nginx ~]# yum install mariadb-server mariadb -y
2.启动Mariadb
数据库,并加入开机自动
[root@nginx ~]# systemctl start mariadb
[root@nginx ~]# systemctl enable mariadb
2
3.给Mariadb
配置登陆密码,并使用新密码进行登录数据库
[root@nginx ~]# mysqladmin password 'birenchong123.com'
[root@nginx ~]# mysql -uroot -pbirenchong123.com
2
# LNMP架构环境配置
- 在配置
Nginx
与PHP
集成之前,我们需要先了解Nginx
的Fastcgi
代理配置语法
# Fastcgi代理语法
1.设置fastcgi
服务器的地址,该地址可以指定为域名或IP地址,以及端口
Syntax : fastcgi_pass address;
Default: -
Context: location,if in location
#语法示例
fastcgi_pass localhost:9000;
2
3
4
5
6
2.设置fastcgi
默认的首页文件,需要结合fastcgi_param
一起设置
Syntax : fastcgi_index name;
Default: -
Context: http,server,location
2
3
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;
2
3
4
5
6
7
# 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
3
4
5
6
7
8
9
10
11
12
13
14
2.在/code
目录下创建info.php
文件
[root@nginx ~]# cat /code/info.php
<?php
phpinfo();
?>
2
3
4
3.通过浏览器访问http://php.birenchong.cn/info.php
,返回如下页面表示nginx
与php
配置成功;
# 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
3
4
5
6
7
8
9
10
11
12
13
14
15
2.使用php
命令直接解析文件
[root@nginx ~]# php /code/mysqli.php
php连接MySQL数据库成功
2
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
3
4
5
6
7
8
9
10
11
12
13
14
2.检测语法,并重启nginx
服务
[root@nginx ~]# nginx -t
[root@nginx ~]# systemctl restart nginx
2
# 配置MySQL
由于wordpress产品需要依赖数据库,所以需要手动建立数据库
[root@nginx ~]# mysql -uroot -pbirenchong123.com
mysql> create database wordpress;
mysql> exit
2
3
# 部署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
3
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
3
4
5
6
7
8
9
10
11
12
13
14
15
2.检查语法,并重启nginx服务
[root@nginx ~]# systemctl restart nginx
# 配置MySQL
由于wecenter
产品需要依赖数据库,所以需要手动建立数据库
[root@nginx ~]# mysql -uroot -pbirenchong123.com
MariaDB [(none)]> create database zh;
MariaDB [(none)]> exit
2
3
# 部署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
3
2.授权目前的权限为进程运行的用户身份;
[root@nginx ~]# chown -R ww.www /code/zh/
# 拆分数据库至独立服务器
# 为何要拆分数据库
- 由于单台服务器运行
LNMP
架构会导致网站访问缓慢,当系统内存被吃满时,很容易导致系统出现oom
,从而kill
掉MysQL
数据库,所以需要将web
和数据库进行独立部署。 - 拆分数据库能解决什么问题
- 1.缓解
web
网站的压力; - 2.增强数据库读写性能;
- 3.提高用户访问的速度;
- 1.缓解
# 数据库拆分架构演变
# 数据库拆分环境准备
主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|
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
3
4
2.数据库导入完成后,重启数据库,使用新密码进行登录,并检查数据库已被导入成功
[root@db01 ~]# systemctl restart mariadb
[root@db01 ~]# mysql -uroot -pbirenchong123.com
mysql> show databases;
2
3
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)
2
3
4
5
# 修改代码指向新数据库
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
3
4
5
6
7
8
9
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',
2
3
4
5
6
7
# 扩展多台相同的Web服务器
# 为何要扩展多台web节点
- 单台
web
服务器能抗住的访问量是有限的,配置多台web
服务器能提升更高的访问速度。 - 扩展多台节点解决什么问题
- 1.单台
web
节点如果故障,会导致业务down
机; - 2.多台
web
节点能保证业务的持续稳定,扩展性高; - 3.多台
web
节点能有效的提升用户访问网站的速度;
- 1.单台
# 扩展多web节点架构演变
# 扩展多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
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
2
3
4
5
6
7
8
9
# LNP配置导入
1.将 web01
的nginx
配置文件导入到web02
[root@web02~]# scp -rp root@172.16.1.7:/etc/nginx /etc/
2.将web01
的php
配置文件导入到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
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
2
# 拆分静态资源至独立服务器
# 为何要拆分静态资源
- 当后端的
web
节点出现多台时,会导致用户上传的图片、视频附件等内容仅上传至一台web
服务器,那么其他的web
服务器则无法访问到该图片。 - 如果增加一台共享存储能解决什么问题
- 1.保证了多台
web
节点静态资源一致。 - 2.有效节省多台
web
节点的存储空间。 - 3.统一管理静态资源,便于后期推送至
CDN
进行静态资源加速
- 1.保证了多台
# 拆分静态资源架构演变
# 增加共享存储环境准备
主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|
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
3
4
2.创建共享目录,并进行授权
[root@nfs ~]# mkdir /data/{blog,zh} -p
[root@nfs ~]# chown -R www.www /data/
2
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
3
4
5
2.查找 wordpress
静态资源,然后;
# 首先打开浏览器->右键->检查->Network->
# 然后点击左上角的Select按钮->点击对应的图片
# 最后提取站点中对应的url地址->
# http://blog.birenchong.cn/wp-content/uploads/2021/08/timg.gif
2
3
4
3.拷贝静态资源至nfs
共享存储
[root@web01 ~]# cd /code/wordpress/wp-content/
[root@web01 wp-content]# scp -rp uploads/* root@172.16.1.31:/data/blog
2
# 节点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
3
# 节点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
2
3
# 扩展节点带来的新问题
- 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) 负载均衡有多种调度算法来满足企业不同需求;
- 1.DNS轮询