- LNMP架构概述
- LNMP架构环境部署
- LNMP架构环境配置
- 部署博客产WordPress
- 部署知乎产品Wecenter
- 拆分数据库至独立服务器
- 扩展多台相同的Web服务器
- 拆分静态资源至独立服务器
-曾老湿, 江湖人称曾老大。
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
LNMP架构概述
什么是LNMP |
---|
LNMP
是一套技术的组合,L=Linux、N=Nginx、M~=MySQL、P~=PHP
LNMP架构是如何工作的 |
---|
首先Nginx服务是不能处理动态请求,那么当用户发起动态请求时, Nginx又是如何进行处理的。
当用户发起http请求,请求会被Nginx处理,如果是静态资源请求Nginx则直接返回,如果是动态请求Nginx则通过fastcgi协议转交给后端的PHP程序处理,具体如下图所示

Nginx与Fast-CGO详细工作流程 |
---|

1.用户通过http
协议发起请求,请求会先抵达LNMP
架构中的Nginx
2.Nginx
会根据用户的请求进行判断,这个判断是有Location
进行完成
3.判断用户请求的是静态页面,Nginx
直接进行处理
4.判断用户请求的是动态页面,Nginx
会将该请求交给fastcgi
协议下发
5.fastgi
会将请求交给php-fpm
管理进程, php-fpm
管理进程接收到后会调用具体的工作进程warrap
6.warrap
进程会调用php
程序进行解析,如果只是解析代码php
直接返回
7.如果有查询数据库操作,则由php
连接数据库(用户 密码 IP)发起查询的操作
8.最终数据由*mysql->php->php-fpm->fastcgi->nginx->http->user
LNMP架构环境部署
使用官方仓库安装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
修改nginx用户 |
---|
[root@nginx ~]# groupadd www -g 666
[root@nginx ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
#修改nginx配置文件
[root@nginx ~]# sed -i '/^user/c user www;' /etc/nginx/nginx.conf
启动Nginx加入开机自启 |
---|
[root@nginx ~]# systemctl start nginx
[root@nginx ~]# systemctl enable nginx
使用第三方扩展源安装php7.1 |
---|
# 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
[root@nginx ~]# yum remove php-mysql-5.4 php php-fpm php-common
#配置第三方源
[root@nginx ~]# vim /etc/yum.repos.d/php.repo
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
[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
配置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
启动php-fpm加入开机自启 |
---|
[root@nginx ~]# systemctl start php-fpm
[root@nginx ~]# systemctl enable php-fpm
安装Mariadb数据库 |
---|
[root@nginx ~]# yum install mariadb-server -y
启动Mariadb加入开机自动 |
---|
[root@nginx ~]# systemctl start mariadb
[root@nginx ~]# systemctl enable mariadb
给Mariadb配置登陆密码 |
---|
[root@nginx ~]# mysqladmin password 'Zls123.com'
[root@nginx ~]# mysql -uroot -pZls123.com
LNMP架构环境配置
在将Nginx与PHP集成过程中,需要先了解Fastcgi代理配置语法
1.设置fastcgi
服务器的地址,该地址可以指定为域名或IP地址,以及端口
Syntax: fastcgi_pass address;
Default: —
Context: location, if in location
#语法示例
fastcgi_pass localhost:9000;
fastcgi_pass unix:/tmp/fastcgi.socket;
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 /code$fastcgi_script_name;
4.通过图形方式展示fastcgi_index
与fastcgi_param
作用


5.最终Nginx连接Fastcgi服务器配置如下
代码语言:javascript复制[root@nginx ~]# cat /etc/nginx/conf.d/php.conf
server {
listen 80;
server_name php.driverzeng.com;
location / {
root /code;
index index.php index.html;
}
location ~ .php$ {
root /code;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name
}
}
6.在/code目录下创建info.php文件,测试能否通过浏览器访问,访问成功如下图
代码语言:javascript复制[root@nginx ~]# cat /code/info.php
<?php
phpinfo();
?>

按照刚才的配置,页面打开一片空白。
代码语言:javascript复制[root@nginx ~]# cat /etc/nginx/conf.d/php.conf
server {
listen 80;
server_name php.driverzeng.com;
location / {
root /code;
index index.php index.html;
}
location ~ .php$ {
root /code;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

7.在/code
目录下创建mysqli.php
文件,填入对应的数据库IP、用户名、密码
[root@nginx ~]# cat /code/mysqli.php
<?php
$servername = "localhost";
$username = "root";
$password = "Zls123.com";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检测连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "小哥哥,php可以连接MySQL...";
?>
<img style='width:100%;height:100%;' src=https://blog.driverzeng.com/zenglaoshi/php_mysql.png>

部署博客产WordPress
1)配置Nginx
虚拟主机站点,域名为blog.driverzeng.com
#1.nginx具体配置信息
[root@nginx ~]# cat /etc/nginx/conf.d/wordpress.conf
server {
listen 80;
server_name blog.driverzeng.com;
root /code/wordpress;
index index.php index.html;
location ~ .php$ {
root /code/wordpress;
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服务
代码语言:javascript复制[root@nginx ~]# systemctl restart nginx
3)获取wordpress
产品,解压并部署wordress
[root@nginx ~]# mkdir /code
[root@nginx ~]# cd /code
[root@nginx code]# wget https://cn.wordpress.org/wordpress-5.0.3-zh_CN.tar.gz
#永远下载最新版
[root@nginx code]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
[root@nginx ~]# tar xf wordpress-5.0.3-zh_CN.tar.gz
[root@nginx ~]# chown -R www.www /code/wordpress/
4)由于wordpress
产品需要依赖数据库,所以需要手动建立数据库
[root@nginx ~]# mysql -uroot -pZls123.com
mysql> create database wordpress;
mysql> exit
5)通过浏览器访问wordpress,并部署该产品








思考问题:上传文件报错413,如何解决? 提示:nginx上传大小的限制
部署知乎产品Wecenter
1.配置Nginx
虚拟主机站点,域名为zh.driverzeng.com
#1.nginx具体配置信息
[root@http-server ~]# cat /etc/nginx/conf.d/zh.conf
server {
listen 80;
server_name zh.driverzeng.com;
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@http-server ~]# systemctl restart nginx
2.下载Wecenter
产品,部署Wecenter
并授权
官方下载地址:TP
代码语言:javascript复制[root@web02 ~]# wget http://ahdx.down.chinaz.com/201605/WeCenter_v3.2.1.zip
[root@web02 ~]# unzip WeCenter_3-2-1.zip
[root@web02 ~]# mv WeCenter_3-2-1/ /code/zh
[root@web02 ~]# chown -R www.www /code/zh/
3.由于wecenter
产品需要依赖数据库, 所以需要手动建立数据库
#1.登陆数据库
[root@http-server ~]# mysql -uroot -pZls123.com
#2.创建wordpress数据库
MariaDB [(none)]> create database zh;
MariaDB [(none)]> exit
3.通过浏览器访问网站
http://zh.driverzeng.com/install/







当然除了这些产品,还有很多我们可以尝试着搭建的: phpmyadmin zblog discuz edusoho
拆分数据库至独立服务器
为什么要进行数据库的拆分 |
---|
由于单台服务器运行LNMP
架构会导致网站访问缓慢,当内存被占满时,很容易导致系统出现oom
从而kill屌MySQL数据库,所以要将web和数据库进行独立部署。
数据库拆分后解决了什么问题 |
---|
1.缓解web网站的压力 2.增强数据库读写性能 3.提高用户访问速度
数据库拆分架构演变过程,如下图所示 |
---|

数据库拆分 |
---|
主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|
web01 | nginx php | 10.0.0.7 | 172.16.1.7 |
db01 | mysql | 10.0.0.51 | 172.16.1.51 |
数据库拆分 |
---|
1.web01网站服务器操作如下
1)备份web01上的数据库,Zls123.com是数据库密码
代码语言:javascript复制[root@web01 ~]# mysqldump -uroot -p'Zls123.com' -A > mysql-all.sql
2)将web01上备份的数据库拷贝至db01服务器上
代码语言:javascript复制[root@web01 ~]# scp mysql-all.sql root@172.16.1.51:/tmp
2.db01数据库服务器操作如下
1)将web01服务器上推送的数据库备份文件恢复至db01服务器新数据库中
代码语言:javascript复制[root@db01 ~]# yum install mariadb mariadb-server -y
[root@db01 ~]# systemctl start mariadb
[root@db01 ~]# systemctl enable mariadb
[root@db01 ~]# mysql -uroot -p'Zls123.com' < /tmp/mysql-all.sql
2)数据库导入完成后,重启数据库,使用新密码进行登录,并检查数据库已被导入成功
代码语言:javascript复制[root@db01 ~]# systemctl restart mariadb
[root@db01 ~]# mysql -uroot -pZls123.com
mysql> show databases;
3)在新数据库上授权,允许所有网段,通过all账户连接并操作该数据库
代码语言:javascript复制#授权所有权限 grant all privileges
#授权所有库所有表 *.*
#将授权赋予给哪个用户,这个用户只能通过哪个网段过来(%所有) 'all'@'%'
#授权该用户登录的密码 identified by
mysql> grant all on *.* to zls@'%' identified by 'Zls123.com';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
3.web01修改代码连接新数据库环境
1)修改WordPress
产品代码连接数据库的配置文件
[root@web01 ~]# vim /code/wordpress/wp-config.php
# 数据库名称
define('DB_NAME', 'wordpress');
# 数据库用户
define('DB_USER', 'zls');
# 数据库密码
define('DB_PASSWORD', 'Zls123.com');
# 数据库地址
define('DB_HOST', '172.16.1.51');
2)修改wecenter
产品代码连接数据库的配置文件
[root@web01 zh]# grep -iR "Zls123.com"|grep -v cache
system/config/database.php: 'password' => 'Zls123.com',
[root@web01 zh]# vim /code/zh/system/config/database.php
'host' => '172.16.1.51',
'username' => 'zls',
'password' => 'Zls123.com',
'dbname' => 'zh',
3)最后访问网站,成功打开,至此拆分数据库完成
扩展多台相同的Web服务器
为什么要扩展多台web节点 |
---|
单台web服务器能抗住的访问量是有限的,配置多台web服务器能提升更高的访问速度。
扩展多台web解决了什么问题 |
---|
1.单台web节点如果故障,会导致业务down机
2.多台web节点能保证业务的持续稳定,扩展性高
3.多台web节点能有效的提升用户访问网站的速度
3.多台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 | 10.0.0.51 | 172.16.1.51 |
快速扩展一台web节点详细步骤 |
---|
通过web01现有环境快速的扩展一台web02的服务器,数据库统一使用db01
1)创建www用户
代码语言:javascript复制[root@web02 ~]# groupadd -g666 www
[root@web02 ~]# useradd -u666 -g666 www
2)安装LNP
代码语言:javascript复制[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
3)将web01的nginx配置文件导入到web02
代码语言:javascript复制[root@web02 ~]# scp -rp root@172.16.1.7:/etc/nginx /etc/
4)将web01的php配置文件导入到web02
代码语言:javascript复制[root@web02 ~]# scp -rp root@172.16.1.7:/etc/php-fpm.d /etc/
5)将web01的产品代码打包传输到web02服务器上,在web01上线进行打包操作
代码语言:javascript复制[root@web01 ~]# tar czf code.tar.gz /code
[root@web01 ~]# scp code.tar.gz root@172.16.1.8:/tmp
#在web02服务器上进行解压
[root@web02 ~]# tar xf /tmp/code.tar.gz -C /
6)最后启动nginx与php-fpm,并加入开机自启
代码语言:javascript复制[root@web02 ~]# systemctl start nginx php-fpm
[root@web02 ~]# systemctl enable nginx php-fpm
拆分静态资源至独立服务器
为什么拆分静态资源至独立存储服务器 |
---|
当后端的web
节点出现多台时,会导致用户上传的图片、视频附件等内容仅上传至一台web
服务器,那么其他的web服务器则无法访问到该图片。
新增一台nfs存储解决了什么问题 |
---|
1.保证了多台web节点静态资源一致。
2.有效节省多台web节点的存储空间。
3.统一管理静态资源,便于后期推送至CDN进行静态资源加速
多台web节点技术架构组成,如下图所示 |
---|

环境准备 |
---|
主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|
web01 | nginx php | 10.0.0.7 | 172.16.1.7 |
web02 | nginx php | 10.0.0.8 | 172.16.1.8 |
nfs | nfs | 10.0.0.31 | 172.16.1.31 |
db01 | mysql | 10.0.0.51 | 172.16.1.51 |
nfs服务端,操作步骤如下 |
---|
1) 安装并配置nfs
代码语言:javascript复制[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) 创建共享目录,并进行授权
代码语言:javascript复制[root@nfs01 ~]# mkdir /data/{blog,zh} -p
[root@nfs01 ~]# chown -R www.www /data/
3) 启动nfs服务,并加入开机自启
代码语言:javascript复制[root@nfs01 ~]# systemctl restart nfs-server
web01端操作步骤如下 |
---|
1) web01节点安装nfs,然后使用showmount查看服务端共享的资源
代码语言:javascript复制[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静态资源存放的位置
代码语言:javascript复制浏览器->右键->检查->Network->选择左上角的Select按钮->点击对应的图片,然后能获取到对应的url地址,如下
# http://blog.oldboy.com/wp-content/uploads/2018/11/timg.gif
3) 备份web01服务器上Wordpress的静态资源,因为该服务器上的资源资源最全
代码语言:javascript复制[root@web01 ~]# cd /code/wordpress/wp-content
[root@web01 wp-content]# cp uploads/ uploads_bak/
4) web01客户端执行挂载操作
代码语言:javascript复制[root@web01 wp-content]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
#恢复对应的数据
[root@web01 wp-content]# cp -rp uploads_bak/* uploads/
5) 将挂载信息加入开机自启
代码语言:javascript复制[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
web02端操作步骤如下 |
---|
1) web02客户端直接挂载nfs即可
代码语言:javascript复制[root@web02 ~]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
2) 将挂载信息加入开机自启
代码语言:javascript复制[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