# Nginx 基础架构 LNMP

# 1. LNMP 架构基本概述

# 1.1 什么是 LNMP
  • LNMP 是一套技术的组合,L=Linux、N=Nginx、M=[MySQL|Mariadb]、P=[PHP|Python];
  • nginx 仅支持解析 html 文件;图片传输;视频传输,不支持 php 脚本文件;
# 1.2 LNMP 实现过程

用户请求 http://hmallleasing.com/index.php,对于 Nginx 服务而言,是无法处理 index.php 这样的脚本,那么 Nginx 该如何配置,才能支持这样的动态请求呢?

第一步:当用户发起 HTTP 请求,请求首先被 Nginx 接收;

第二步:Nginx 通过预先定义好的 location 规则进行匹配;

第三步:Nginx 将匹配到的动态内容,通过 fastcgi 协议传到给后端的 php 应用服务处理

1.jpg

# 1.3 LNMP 实现细节

Nginx、PHP、MySQL 之间是如何工作的?

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

2.jpg

# 2.LNMP 架构环境安装

# 2.1 Nginx 安装

1. 使用官方仓库安装 Nginx

[root@web01 ~]# cat /etc/yum.repos.d/nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[root@web01 ~]# yum install nginx -y

2. 配置 Nginx 进程运行用户

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

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

[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx
# 2.2 PHP 安装
#1、移除旧版 php
[root@web01 ~]# yum remove php-mysql-5.4 php php-fpm php-common
#2、安装扩展源
[root@web01 ~]# yum localinstall https://mirror.webtatic.com/yum/el7/webtatic-release.rpm -y
#3、安装 php7.1 版本
[root@web01 ~]# 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@web01 ~]# sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
[root@web01 ~]# sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
#5、启动 php
[root@web01 ~]# systemctl start php-fpm && systemctl enable php-fpm
# 2.3 MySQL 安装
#1、下载 MySQL 官方扩展源
[root@web01 ~]# rpm -ivh http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql57-community-release-el7-10.noarch.rpm
	
#2、安装 mysql5.7,文件过大可能会导致下载缓慢
[root@web01 ~]# yum install mysql-community-server -y
#3、启动并加入开机自动启动
[root@web01 ~]# systemctl start mysqld && systemctl enable mysqld
#4、查看端口是否启动
[root@web01 ~]# netstat -lntp|grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      1911/mysqld  
	
#5、由于 mysql5.7 默认配置密码,需要过滤 temporary password 关键字查看对应登陆数据库密码
[root@web01 ~]# grep 'temporary password' /var/log/mysqld.log
#6、登录 mysql 数据库 [password 中填写上一步过滤的密码]
[root@web01 ~]# mysql -uroot -p$(awk '/temporary password/{print $NF}' /var/log/mysqld.log)
	
#7、重新修改数据库密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Superman*2025';
#8、添加 app 用户
mysql> grant all on *.* to 'app'@'192.168.1.%' identified by 'Superman*2025';
#9、允许 root 用户在任何地方进行远程登录,并具有所有库任何操作权限,具体操作如下
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Superman*2025' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

# 3.LNMP 架构环境配置

在配置 Nginx 与 PHP 集成之前, 我们需要先了解 Nginx 的 Fastcgi 代理配置语法

# 3.1 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;

4. 通过图形方式展示 fastcgi_index 与 fastcgi_param 作用。

3.jpg

# 3.2 Nginx 与 PHP 集成

1. 编写 Nginx 配置文件

[root@web01 conf.d]# cat php.hmallleasing.com.conf 
[root@web01 ~]# cat /etc/nginx/conf.d/php.hmallleasing.com.conf
server {
	server_name php.hmallleasing.com;
	listen 80;
	root /code;
	
	location / {
		index index.php index.html;
	}
	
	location ~ \.php$ {
		fastcgi_pass   127.0.0.1:9000;
		fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		include        fastcgi_params;
	}
}
[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl reload nginx

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

[root@web01 ~]# cat /code/index.php 
<?php
	phpinfo();
?>

3. 通过浏览器访问 /info.php,返回如下页面表示 nginx 与 php 配置成功;

1.jpg

# 3.3 PHP 与 MySQL 集成

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

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

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

[root@web01 ~]# php /code/mysqli.php
php连接MySQL数据库成功

# 4. 部署开源产品

# 4.1 部署博客 Wordpress
# 4.1.1 配置 Nginx

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

[root@web01 ~]# cat /etc/nginx/conf.d/blog.hmallleasing.com.conf
server {
	listen 80;
	server_name blog.hmallleasing.com;
	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@web01 ~]# nginx -t
[root@web01 ~]# systemctl reload nginx
# 4.1.2 配置 MySQL
[root@web01 ~]# mysql -uroot -pSuperman*2025
mysql> create database wordpress;
mysql> exit
# 4.1.3 部署 Wordpress

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

[root@web01 ~]# mkdir /code
[root@web01 ~]# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
[root@web01 ~]# tar xf wordpress-4.9.4-zh_CN.tar.gz -C /code

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

[root@web01 ~]# chown -R www.www /code/wordpress/

3.wordpress 相关主题

[root@web01 ~]# wget http://cdn.xuliangwei.com/Origami-1.1.0.zip
[root@web01 ~]# wget http://cdn.xuliangwei.com/QQ2.8.zip
# 4.2 部署知乎产品 Wecenter
# 4.2.1 配置 Nginx

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

[root@web01 ~]# cat /etc/nginx/conf.d/zh.hmallleasing.com.conf
server {
	listen 80;
	server_name zh.hmallleasing.com;
	root /code/zh;
	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@web01 ~]# nginx -t
[root@web01 ~]# systemctl restart nginx
# 4.2.2 配置 MySQL

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

[root@web01 ~]# mysql -uroot -pSuperman*2025
mysql> create database zh;
mysql> exit

4.2.3 部署 Wecenter

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

[root@web01 zh]# ll /code/zh/WeCenter_3-2-1

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

[root@web01 code]# mkdir /code/zh
[root@web01 code]# chown -R www.www /code/zh/

# 5. 拆分数据库至独立服务器

# 5.1 为何要拆分数据库

由于单台服务器运行 LNMP 架构会导致网站访问缓慢,当系统内存被吃满时,很容易导致系统出现 oom,从而 kill 掉 MySQL 数据库,所以需要将 web 和数据库进行独立部署。

# 5.2 数据库拆分架构演变

1.png

# 5.3 数据库拆分环境准备
主机名称应用环境外网地址内网地址
web01nginx+php10.0.0.7172.16.1.7
db01mysql172.16.1.51
# 5.4 数据库拆分实现步骤
# 5.4.1 web 服务操作如下
[root@web01 ~]# mysqldump -uroot -p'Superman*2025' --all-databases > mysql-all.sql

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

[root@web01 ~]# scp mysql-all.sql root@172.16.1.51:/tmp
# 5.4.2 数据库服务操作如下

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

#1、下载 MySQL 官方扩展源
[root@db01 ~]# rpm -ivh http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql57-community-release-el7-10.noarch.rpm
	
#2、安装 mysql5.7,文件过大可能会导致下载缓慢
[root@db01 ~]# yum install mysql-community-server -y
#3、启动并加入开机自动启动
[root@db01 ~]# systemctl start mysqld && systemctl enable mysqld
#4、查看端口是否启动
[root@db01 ~]# netstat -lntp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3788/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      4018/master         
tcp6       0      0 :::3306                 :::*                    LISTEN      4628/mysqld         
tcp6       0      0 :::22                   :::*                    LISTEN      3788/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      4018/master 
	
#5、由于 mysql5.7 默认配置密码,需要过滤 temporary password 关键字查看对应登陆数据库密码
[root@db01 ~]# grep 'temporary password' /var/log/mysqld.log
#6、登录 mysql 数据库 [password 中填写上一步过滤的密码]
[root@db01 ~]# mysql -uroot -p$(awk '/temporary password/{print $NF}' /var/log/mysqld.log)
	
#7、重新修改数据库密码
mysql> ALTER USER 'root'@'%' IDENTIFIED BY 'passwd';
mysql> grant all on *.* to 'app'@'192.168.40.%' identified by 'passwd';
#8、导入备份数据
[root@db01 ~]# mysql -uroot < /tmp/mysql-all.sql
# 5.4.3 修改代码指向新数据库

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

[root@web01 code]# cat /code/wordpress/wp-config.php 
/** WordPress数据库的名称 */
define('DB_NAME', 'wordpress');
/** MySQL数据库用户名 */
define('DB_USER', 'app');
/** MySQL数据库密码 */
define('DB_PASSWORD', 'Superman*2025');
/** MySQL主机 */
define('DB_HOST', '192.168.1.51');

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

[root@web01 zh]#  find ./ -type f | xargs grep -iR "Superman*2025"
$config['charset'] = 'utf8';
$config['prefix'] = 'aws_';
$config['driver'] = 'MySQLi';
$config['master'] = array (
  'charset' => 'utf8',
  'host' => '192.168.1.51',
  'username' => 'app',
  'password' => 'Superman*2025',
  'dbname' => 'zh',
  'port' => '3306',
);
$config['slave'] = false;
$config['port'] = '3306';

# 6. 扩展多台相同的 Web 服务器

# 6.1 为何要扩展多台 web 节点

单台 web 服务器能抗住的访问量是有限的,配置多台 web 服务器能提升更高的访问速度。

扩展多台节点解决什么问题:

  • 1. 单台 web 节点如果故障,会导致业务 down 机;
  • 2. 多台 web 节点能保证业务的持续稳定,扩展性高;
  • 3. 多台 web 节点能有效的提升用户访问网站的速度;
# 6.2 扩展多 web 节点架构演变

2.png

# 6.3 扩展多 web 节点环境准备
主机名称应用环境外网地址内网地址
web01nginx+php10.0.0.7172.16.1.7
web02nginx+php10.0.0.78172.16.1.8
db01mysql172.16.1.51
# 6.4 扩展多 web 节点实现步骤

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

# 6.4.1 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
# 6.4.2 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/
# 6.4.3 导入代码文件

1. 将 web01 的代码打包传输到 web02 服务器上,在 web1 上线进行打包操作

[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 /
# 6.4.4 启动服务验证

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

[root@web02 ~]# systemctl start nginx php-fpm
[root@web02 ~]# systemctl enable nginx php-fpm

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

# 7.1 为何要拆分静态资源

当后端的 web 节点出现多台时,会导致用户上传的图片、视频附件等内容仅上传至一台 web 服务器,那么其他的 web 服务器则无法访问到该图片。

如果增加一台共享存储能解决什么问题:

  • 1. 保证了多台 web 节点静态资源一致。
  • 2. 有效节省多台 web 节点的存储空间。
  • 3. 统一管理静态资源,便于后期推送至 CDN 进行静态资源加速
# 7.2 拆分静态资源架构演变

3.png

# 7.3 增加共享存储环境准备
主机名称应用环境外网地址内网地址
web01nginx+php10.0.0.7172.16.1.7
web02nginx+php10.0.0.78172.16.1.8
nfsnfs172.16.1.32
db01mysql172.16.1.51
# 7.4 增加共享存储实现步骤
# 7.4.1 配置 NFS 存储

1. 安装并配置 nfs

[root@nfs ~]# yum install nfs-utils -y
[root@nfs ~]# groupadd -g666 www
[root@nfs ~]# useradd -u666 -g666 www
[root@nfs ~]# cat /etc/exports
/data/blog 192.168.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zh 192.168.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

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

[root@nfs ~]# mkfs.xfs /dev/sdb
[root@nfs ~]# mkdir /data/{blog,zh} -p
[root@nfs ~]# mount -t xfs /dev/sdb /data
[root@nfs ~]# chown -R www.www /data/

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

[root@nfs ~]# systemctl restart nfs-server && systemctl enable nfs-server
# 7.4.2 导入静态资源至存储

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

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

2. 查找 Wordpress 静态资源,然后

# 首先打开浏览器 -> 右键 -> 检查 ->Network->
# 然后点击左上角的 Select 按钮 -> 点击对应的图片
# 最后提取站点中对应的 url 地址 ->http://blog.oldxu.net/wpcontent/uploads/2018/11/timg.gif

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

[root@web01 ~]# cd /code/wordpress/wp-content/
[root@web01 wp-content]# scp -rp uploads/* root@172.16.1.32:/data/blog
# 7.4.3 节点 1 接入共享存储

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

[root@web01 ~]# mount -t nfs 192.168.1.32:/data/blog /code/wordpress/wp-content/uploads/
[root@web01 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   92G  2.2G   89G   3% /
devtmpfs                 3.9G     0  3.9G   0% /dev
tmpfs                    3.9G     0  3.9G   0% /dev/shm
tmpfs                    3.9G  8.9M  3.9G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda1               1014M  146M  869M  15% /boot
tmpfs                    783M     0  783M   0% /run/user/0
192.168.1.32:/data/blog   92G  2.0G   90G   3% /code/wordpress/wp-content/uploa

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

[root@web01 ~]# tail -1 /etc/fstab
172.16.1.32:/data/blog /code/wordpress/wp-content/uploads nfs defaults 0 0
[root@web01 ~]# mount -a
# 7.4.4 节点 2 接入共享存储

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

[root@web02 conf.d]# mount -t nfs 192.168.1.32:/data/blog /code/wordpress/wp-content/uploads/
[root@web02 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   92G  2.2G   89G   3% /
devtmpfs                 3.9G     0  3.9G   0% /dev
tmpfs                    3.9G     0  3.9G   0% /dev/shm
tmpfs                    3.9G  8.8M  3.9G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda1               1014M  146M  869M  15% /boot
tmpfs                    783M     0  783M   0% /run/user/0
192.168.1.32:/data/blog   92G  2.0G   90G   3% /code/wordpress/wp-content/uploads

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

[root@web02 ~]# tail -1 /etc/fstab
172.16.1.32:/data/blog /code/wordpress/wp-content/uploads nfs defaults 0 0
[root@web02 ~]# mount -a
此文章已被阅读次数:正在加载...更新于

请我喝[茶]~( ̄▽ ̄)~*

Xu Yong 微信支付

微信支付

Xu Yong 支付宝

支付宝