# 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.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.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.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 配置成功;
# 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 数据库拆分架构演变
# 5.3 数据库拆分环境准备
主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|
web01 | nginx+php | 10.0.0.7 | 172.16.1.7 |
db01 | mysql | 172.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 节点架构演变
# 6.3 扩展多 web 节点环境准备
主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|
web01 | nginx+php | 10.0.0.7 | 172.16.1.7 |
web02 | nginx+php | 10.0.0.78 | 172.16.1.8 |
db01 | mysql | 172.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 拆分静态资源架构演变
# 7.3 增加共享存储环境准备
主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|
web01 | nginx+php | 10.0.0.7 | 172.16.1.7 |
web02 | nginx+php | 10.0.0.78 | 172.16.1.8 |
nfs | nfs | 172.16.1.32 | |
db01 | mysql | 172.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 |