WEB服务-Nginx之6-LNMP架构
WEB服务-Nginx之6-LNMP架构
LNMP架构概述
LNMP
是一套技术的组合,L=Linux、N=Nginx、M=MySQL、P=PHP
FastCGI
Nginx不能直接处理动态请求,而是通过CGI协议将客户端请求转发给第三方服务处理,第三方服务器会新建新的进程处理用户的请求,处理完成后返回数据给Nginx并回收进程,最后Nginx再返回给客户端。
通用网关接口(common gateway interface,简称CGI),CGI(协议)是web服务器和外部应用程序之间的接口标准,是cgi程序和web服务器之间传递信息的标准化接口。
FastCGI每次处理完请求之后会保留请求处理进程,使这个进程可以处理多个请求。这样每个请求都不用再重新创建一个进程,提升了处理效率。
PHP-FPM
PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能。进程包括master进程和worker进程。
- master进程只有一个,负责监听端口,接受来自webserver的请求。
- worker进程一般会有多个,每个进程嵌入一个PHP解析器,进行PHP代码的处理。
LNMP架构工作原理
当用户发起http
请求,请求会被Nginx
处理,如果是静态资源请求Nginx
则直接返回,如果是动态请求Nginx
则通过FastCGI
协议转交给后端的PHP程序处理,具体如下图所示
Nginx与Fast-CGO详细工作流程
- 用户通过
http
协议发起请求,请求会先抵达LNMP
架构中的Nginx
Nginx
会根据用户的请求进行判断,这个判断由Location
完成- 判断用户请求的是静态页面,
Nginx
直接进行处理 - 判断用户请求的是动态页面,
Nginx
会将该请求交给FastCGI
协议下发 FastCGI
会将请求交给php-fpm
管理进程,php-fpm
管理进程接收到后会调用具体的工作进程warrap
warrap
进程会调用php
程序进行解析,如果只是解析代码php
直接返回- 如果有查询数据库操作,则由
php
连接数据库(用户 密码 IP)发起查询的操作 - 最终数据由
mysql->php->php-fpm->FastCGI->nginx->http->user
返回
LNMP架构环境部署
- 使用官方仓库安装Nginx
[root@web01 ~]# cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/\$basearch/
gpgcheck=0
enabled=1
EOF
[root@web01 ~]# yum install -y gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel nginx
- 统一用户:修改nginx默认运行用户
[root@web01 ~]# groupadd www -g 666 && useradd www -u 666 -g 666 -s /sbin/nologin -M
[root@web01 ~]# sed -i '/^user/c user www;' /etc/nginx/nginx.conf
- 启动Nginx并加入开机自启
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx
- 使用epel的额外软件包安装php
- Webtatic仓库源安装,最新到
php72
版本
[root@web01 ~]# yum install epel-release -y
[root@web01 ~]# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
[root@web01 ~]# cat > /etc/yum.repos.d/php.repo <<EOF
[php-webtatic]
name=PHP Repository
baseurl=http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck=0
enabled=1
EOF
# 卸载冲突软件
[root@web01 ~]# yum -y remove php-mysql-5.4 php php-fpm php-common
# 安装php7.2及相关插件 --nogpgcheck # 禁用gpg签名检查
[root@web01 ~]# yum -y install php72w php72w-cli php72w-common \
php72w-devel php72w-embedded php72w-gd php72w-mcrypt php72w-mbstring \
php72w-pdo php72w-xml php72w-fpm php72w-mysqlnd php72w-opcache \
php72w-pecl-memcached php72w-pecl-redis php72w-pecl-mongodb --nogpgcheck
- REMI是由Remi Collect创建和维护的免费仓库,主要提供最新版本的PHP stack、全功能和其他一些软件包。最新到
php80
版本。# 方法一:可以使用yum直接安装自动配置软件包 [root@web01 ~]# yum install -y https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm # 方法二:也可以使用rpm安装 [root@web01 ~]# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm [root@web01 ~]# rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm
安装php及相关插件
[root@web01 ~]# yum -y --enablerepo=remi-php72 install php72-php-fpm php72-php-mysql php72 php72-cli php72-common \ php72-devel php72-embedded php72-gd php72-mcrypt php72-mbstring \ php72-pdo php72-xml php72-opcache \ php72-pecl-memcached php72-pecl-redis php72-pecl-mongodb
REMI仓库源
[root@web01 ~]# rpm -ql remi-release /etc/pki/rpm-gpg/RPM-GPG-KEY-remi /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2017 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2019 /etc/pki/rpm-gpg/RPM-GPG-KEY-remi2020 /etc/yum.repos.d/remi-glpi91.repo /etc/yum.repos.d/remi-glpi92.repo /etc/yum.repos.d/remi-glpi93.repo /etc/yum.repos.d/remi-glpi94.repo /etc/yum.repos.d/remi-modular.repo /etc/yum.repos.d/remi-php54.repo /etc/yum.repos.d/remi-php70.repo /etc/yum.repos.d/remi-php71.repo /etc/yum.repos.d/remi-php72.repo /etc/yum.repos.d/remi-php73.repo /etc/yum.repos.d/remi-php74.repo /etc/yum.repos.d/remi-php80.repo /etc/yum.repos.d/remi-safe.repo /etc/yum.repos.d/remi.repo
- 统一用户:修改php-fpm用户
[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
php-fpm配置文件
[root@web01 ~]# cat /etc/php-fpm.d/www.conf [www] listen = 127.0.0.1:9000 # 监听端口及IP,只指定端口默认所有IP地址都可以连接 listen.allowed_clients = 127.0.0.1 # 允许客户端从哪个源IP地址访问,注释掉允许所有人访问 user = nginx # 启动php-fpm的用户 group = nginx # 启动php-fpm的用户组 pm = dynamic # 动态模式进程管理 pm.max_children = 500 # 静态方式下开启的php-fpm进程数量,在动态方式下他限定php-fpm的最大进程数 pm.start_servers = 100 # 动态模式下初始进程数,必须大于等于pm.min_spare_servers和小于等于pm.max_children的值。 pm.min_spare_servers = 100 # 最小空闲进程数 pm.max_spare_servers = 200 # 最大空闲进程数 pm.max_requests = 500000 # 进程累计请求回收值,会重启 pm.status_path = /pm_status # 状态访问URL ping.path = /ping # ping访问动地址 ping.response = ping-pong # ping返回值 slowlog = /var/log/php-fpm/www-slow.log # 慢日志路径 php_admin_value[error_log] = /var/log/php-fpm/www-error.log # 错误日志 php_admin_flag[log_errors] = on php_value[session.save_handler] = files # phpsession保存方式及路径 php_value[session.save_path] = /var/lib/php/session # 当时使用file保存session的文件路径
- 启动php-fpm并加入开机自启
[root@web01 ~]# systemctl start php-fpm
[root@web01 ~]# systemctl enable php-fpm
- 安装Mariadb数据库
[root@web01 ~]# yum -y install mariadb-server
- 启动Mariadb并加入开机自启
[root@web01 ~]# systemctl start mariadb
[root@web01 ~]# systemctl enable mariadb
- Mariadb配置登陆密码
[root@web01 ~]# mysqladmin password '123'
[root@web01 ~]# mysql -uroot -p123
FastCGI模块
Nginx基于ngx_http_fastcgi_module
模块实现通过FastCGI
协议将指定的客户端请求转发至php-fpm处理,其配置指令如下:
fastcgi_pass
设置服务器地址:域名或IP地址,以及端口
Syntax: fastcgi_pass address;
Default: -
Context: location, if in location
# 语法示例
fastcgi_pass localhost:9000;
fastcgi_pass unix:/tmp/fastcgi.socket;
fastcgi_index
设置默认主页文件,需要配合fastcgi_param
使用
Syntax: fastcgi_index name;
Default: -
Context: http, server, location
fastcgi_param
设置变量,并将设置的变量传递到后端的 fastcgi 服务器
Syntax: fastcgi_param parameter value [if_not_empty];
Default: -
Context: http, server, location
# 可将Nginx内置变量赋值给自定义key
fastcgi_param REMOTE_ADDR $remote_addr; # 客户端源IP
fastcgi_param REMOTE_PORT $remote_port; # 客户端源端口
fastcgi_param SERVER_ADDR $server_addr; # 请求的服务器IP地址
fastcgi_param SERVER_PORT $server_port; # 请求的服务器端口
fastcgi_param SERVER_NAME $server_name; # 请求的server name
#语法示例
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /code$fastcgi_script_name;
注意:
使用
fastcgi_param
需要包含配置文件/etc/nginx/fastcgi_params
include fastcgi_params;
fastcgi_index 与 fastcgi_param 作用图解:
不包含fastcgi_param
配置文件测试:
- 配置
Nginx
:
[root@web01 ~]# cat /etc/nginx/conf.d/php.conf
server {
listen 80;
server_name php.oldboy.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;
}
}
- 在
/code
目录下创建info.php
文件
[root@web01 ~]# cat /code/info.php
<?php
phpinfo();
?>
- 重载
nginx
服务,浏览器访问http://10.0.0.7/info.php,访问成功如下图:页面存在,一片空白。
fastcgi_cache_path
设置fastcgi的缓存路径和其他参数。
Syntax: fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [min_free=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default: -
Context: http
path # 缓存位置为磁盘上的文件系统路径
max_size=size # 磁盘path路径中存放缓存数据的文件大小上限
levels=levels # 缓存目录的层次结构级别,以及每一级的目录数量:从1到3,每个级别接受值1或2。
keys_zone=name:size # 设置缓存名称及k/v映射的内存空间的名称及大小
inactive=time # 缓存有效时间,默认10分钟,需要在 time 时间内,至少要被访问到 fastcgi_cache_min_uses 指定的次数方可被视为活动缓存。
指令:
# 调用指定的缓存空间来缓存数据
Syntax: fastcgi_cache zone | off;
Default: fastcgi_cache off;
Context: http, server, location
# 定义用作缓存项的key的字符串,示例:fastcgi_cache_key $request_uri;<br>
Syntax: fastcgi_cache_key string;
Default: -
Context: http, server, location
# 指定使用缓存的请求方法
Syntax: fastcgi_cache_methods GET | HEAD | POST ...;
Default: fastcgi_cache_methods GET HEAD;
Context: http, server, location
# 缓存空间中的缓存项在inactive定义的非活动时间内,至少要被访问到此处所指定的次数方可被视为活动缓存
Syntax: fastcgi_cache_min_uses number;
Default: fastcgi_cache_min_uses 1;
Context: http, server, location
# 收到后端服务器响应后,fastcgi服务器是否关闭连接,建议启用长连接
Syntax: fastcgi_keep_conn on | off;
Default: fastcgi_keep_conn off;
Context: http, server, location
# 设置不同响应代码的缓存时间。示例:fastcgi_cache_valid 404 1m;
Syntax: fastcgi_cache_valid [code ...] time; # 不指定code,默认仅缓存200、301和302响应
Default: -
Context: http, server, location
# 禁止响应头中指定信息返回。默认不会将"Status"、"X-Accel-..."返回
Syntax: fastcgi_hide_header field;
Default: -
Context: http, server, location
# 允许响应头中指定信息返回。默认不会将"Status"、"X-Accel-..."返回
Syntax: fastcgi_pass_header field;
Default: -
Context: http, server, location
示例:
http {
...
fastcgi_cache_path /var/cache/nginx/fcgi_cache levels=1:2:1 keys_zone=fcgicache:20m inactive=120s;
server {
...
location ~* \.php$ {
...
fastcgi_cache fcgicache;
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
}
}
}
LNMP架构环境配置
- 使用
Nginx
作为Fastcgi
代理配置:
[root@nginx ~]# cat /etc/nginx/conf.d/php.conf
server {
listen 80;
server_name php.oldboy.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;
}
}
- 在
/code
目录下创建info.php
文件
[root@web01 ~]# cat /code/info.php
<?php
phpinfo();
?>
- 重载
nginx
服务,浏览器访问http://10.0.0.7/info.php,访问成功如下图:
- 在
/code
目录下创建mysqli.php
文件,填入对应的数据库IP、用户名、密码
[root@web01 ~]# cat /code/mysqli.php
<?php
$servername = "localhost";
$username = "root";
$password = "123";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检测连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "php连接MySQL成功...";
?>
<img style='width:100%;height:100%;' src=http://area.sinaapp.com/bingImg/>
- 重载
nginx
服务,浏览器访问http://10.0.0.7/mysqli.php,访问成功如下图:
部署博客产品WordPress
Nginx
配置虚拟主机站点,域名为blog.oldboy.com
[root@web01 ~]# cat /etc/nginx/conf.d/wordpress.conf
server {
listen 80;
server_name blog.oldboy.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;
}
}
- 重载
nginx
服务
[root@web01 ~]# systemctl restart nginx
- 进入
/code
目录,下载wordpress
指定版本或最新版本,并解压
中文官网:https://cn.wordpress.org/
[root@web01 ~]# cd /code
[root@web01 code]# wget https://cn.wordpress.org/wordpress-5.4.2-zh_CN.tar.gz
[root@web01 code]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz # 永远下载最新中文版
[root@web01 ~]# tar xf wordpress-5.0.3-zh_CN.tar.gz
- 统一用户:修改
wordpress
目录属主属组
[root@web01 ~]# chown -R www.www /code/wordpress/
- 手动建立
wordpress
数据库
# 交互式
[root@web01 ~]# mysql -uroot -p123
mysql> create database wordpress;
mysql> exit
# 非交互式
[root@web01 ~]# mysql -e 'create database wordpress;'
- 通过浏览器访问
wordpress
网站:http://blog.oldboy.com/,并部署该产品
部署知乎产品WeCenter
Nginx
配置虚拟主机站点,域名为zh.oldboy.com
[root@web01 ~]# cat /etc/nginx/conf.d/zh.conf
server {
listen 80;
server_name zh.oldboy.com;
root /code/wecenter;
index index.php index.html;
location ~ \.php$ {
root /code/wecenter;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
- 重载
nginx
服务
[root@web01 ~]# systemctl restart nginx
- 创建并进入
/code/wecenter
目录,下载wecenter
,并解压
官方下载地址:https://www.wecenter.com/downloads/
[root@web01 ~]# mkdir -p /code/wecenter && cd /code/wecenter
[root@web01 wecenter]# rz
[root@web01 wecenter]# unzip WeCenter_3-6-0.zip
- 统一用户:修改
wecenter
目录属主属组
[root@web01 ~]# chown -R www.www /code/wecenter/
- 手动建立
wecenter
数据库
[root@web01 ~]# mysql -uroot -p123
MariaDB [(none)]> create database wecenter;
MariaDB [(none)]> exit
- 通过浏览器访问
wecenter
网站:http://zh.oldboy.com/install/,并部署该产品
部署教育产品edusoho
Nginx
配置虚拟主机站点,域名为edu.oldboy.com
[root@web01 ~]# vim /etc/nginx/conf.d/edu.conf
server {
listen 80;
server_name edu.oldboy.com;
root /code/edusoho/web;
client_max_body_size 200m;
location / {
index app.php;
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/$1 last;
}
location ~ ^/udisk {
internal;
root /code/edusoho/app/data/;
}
location ~ ^/(app|app_dev)\.php(/|$) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
fastcgi_param HTTP_X-Sendfile-Type X-Accel-Redirect;
fastcgi_param HTTP_X-Accel-Mapping /udisk=/code/edusoho/app/data/udisk;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;
}
# 配置设置图片格式文件
location ~* \.(jpg|jpeg|gif|png|ico|swf)$ {
# 过期时间为3年
expires 3y;
# 关闭日志记录
access_log off;
# 关闭gzip压缩,减少CPU消耗,因为图片的压缩率不高。
gzip off;
}
# 配置css/js文件
location ~* \.(css|js)$ {
access_log off;
expires 3y;
}
# 禁止用户上传目录下所有.php文件的访问,提高安全性
location ~ ^/files/.*\.(php|php5)$ {
deny all;
}
# 以下配置允许运行.php的程序,方便于其他第三方系统的集成。
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
- 重载
nginx
服务
[root@web01 ~]# systemctl reload nginx
- 进入
/code
目录,下载edusoho
,并解压
官方下载地址:https://edusoho.com/download/edusoho
官方最新版:
[root@web01 ~]# cd /code [root@web01 /code]# wget http://edusoho-official.oss-cn-hangzhou.aliyuncs.com/2020-09-17/357acb5ca3d2336b/edusoho-8.7.15.zip [root@web01 /code]# unzip edusoho-8.7.15.zip
[root@web01 ~]# cd /code
[root@web01 /code]# wget http://download.edusoho.com/edusoho-8.2.17.tar.gz
[root@web01 /code]# tar xf edusoho-8.2.17.tar.gz
- 统一用户:修改
edusoho
目录属主属组
[root@web01 /code]# chown -R www.www /code/edusoho/
- 修改
php-fpm
上传大小并重载
[root@web01 ~]# sed -i '/post_max_size/c post_max_size = 200M' /etc/php.ini
[root@web01 ~]# sed -i '/upload_max_filesize/c upload_max_filesize = 200M' /etc/php.ini
[root@web01 ~]# systemctl reload php-fpm
- 通过浏览器访问
edusoho
网站:http://edu.oldboy.com/,并部署该产品
当然除了这些产品,还有很多我们可以搭建的产品:
- phpmyadmin
- zblog
- discuz 论坛
- ...
模块拆分:数据库
为什么要拆分数据库?
由于单台服务器运行 LNMP
架构会导致网站访问缓慢,当内存被占满时,很容易导致系统出现oom
从而kill
掉MySQL
数据 库,所以要将web服务和数据库服务拆分部署。
新增一台db数据库服务器解决了什么问题?
- 缓解web网站的压力
- 增强数据库读写性能
- 提高用户访问速度
架构图示:
拆分准备服务器:
主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|
web01 | nginx+php | 10.0.0.7 | 172.16.1.7 |
db01 | mysql | 10.0.0.51 | 172.16.1.51 |
- web01服务器操作步骤:
- 备份web01上的数据库,123是数据库密码
[root@web01 ~]# mysqldump -uroot -p'123' -A > mysql-all.sql
- 将web01上备份的数据库拷贝至db01服务器上
[root@web01 ~]# scp mysql-all.sql root@172.16.1.51:/tmp
- db01服务器操作步骤:
- 安装
mariadb-server
,启动,加入开机启动,并配置登录密码
[root@db01 ~]# yum -y install mariadb mariadb-server
[root@db01 ~]# systemctl start mariadb
[root@db01 ~]# systemctl enable mariadb
[root@db01 ~]# mysqladmin password '123'
- 将web01服务器推送来的数据库备份文件恢复至db01服务器的数据库中
[root@db01 ~]# mysql -uroot -p'123' < /tmp/mysql-all.sql
- 重启数据库服务,并检查数据库是否导入成功
[root@db01 ~]# systemctl restart mariadb
[root@db01 ~]# mysql -uroot -p123
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.5.5-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wecenter |
| wordpress |
+--------------------+
6 rows in set (0.104 sec)
MariaDB [(none)]>
- 在db01服务器的数据库上授权,允许所有网段,通过all账户连接并操作该数据库
# 授权所有权限 grant all
# 授权所有库所有表 *.*
# 将授权赋予给哪个用户,这个用户只能通过哪个网段过来(%所有) 'lzy'@'%'
# 授权该用户登录的密码 identified by
mysql> grant all on *.* to 'root'@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
免交互设置:
- 同上
[root@db01 ~]# mysql -e 'grant all on *.* to 'root'@'%' identified by '123';flush privileges;'
- 创建
wordpress
数据库,wordpress
用户,只能通过10.0.0.0
段网络访问以wordpress.开头
的数据库有所有权限
,密码是123
[root@db01 ~]# mysql -e 'create database wordpress;grant all on wordpress.* to wordpress@"10.0.0.%" identified by "123"'
- web01服务器:修改各个产品连接数据库的配置
localhost-->172.16.1.51
- 修改
wordpress
产品连接数据库的配置文件
[root@web01 ~]# vim /code/wordpress/wp-config.php
# 数据库名称
define('DB_NAME', 'wordpress');
# 数据库用户
define('DB_USER', 'root');
# 数据库密码
define('DB_PASSWORD', '123');
# 数据库地址
define('DB_HOST', '172.16.1.51');
- 修改
wecenter
产品代码连接数据库的配置文件
[root@web01 ~]# vim /code/wecenter/system/config/database.php
<?php
$config['charset'] = 'utf8mb4';^M
$config['prefix'] = 'aws_';^M
$config['driver'] = 'MySQLi';^M
$config['master'] = array (
'charset' => 'utf8mb4',
'host' => '172.16.1.51',
'username' => 'root',
'password' => '123',
'dbname' => 'wecenter',
);^M
$config['slave'] = false;^M
- 最后关闭web01服务器上的mariadb服务
[root@web01 ~]# systemctl stop mariadb
[root@web01 ~]# systemctl disable mariadb
- 通过浏览器访问
wordpress
网站:http://blog.oldboy.com/wecenter
网站:http://zh.oldboy.com/
成功打开,至此拆分数据库完成
水平扩展:增加Web服务器数量
为什么要扩展多台web节点?
单台web服务器能支持的访问量是有限的,配置多台web服务器能支持更多的访问量和提供更高的访问速度。
扩展多台web节点解决了什么问题?
- 多台web节点能保证业务的持续稳定,而单台web节点如果故障,会导致业务down机
- 多台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
- 创建www用户
[root@web02 ~]# groupadd www -g 666 && useradd www -u 666 -g 666 -s /sbin/nologin -M
- 部署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 -y install nginx php72w php72w-cli php72w-common \
php72w-devel php72w-embedded php72w-gd php72w-mcrypt php72w-mbstring \
php72w-pdo php72w-xml php72w-fpm php72w-mysqlnd php72w-opcache \
php72w-pecl-memcached php72w-pecl-redis php72w-pecl-mongodb
- 将web01的nginx配置文件导入到web02
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/nginx /etc/
- 将web01的php配置文件导入到web02
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/php-fpm.d /etc/
- 将web01的产品代码打包传输到web02服务器上线
[root@web01 ~]# tar czf code.tar.gz /code
[root@web01 ~]# scp code.tar.gz root@172.16.1.8:/tmp
[root@web02 ~]# tar xf /tmp/code.tar.gz -C /
- 最后web02启动nginx与php-fpm,并加入开机自启
[root@web02 ~]# systemctl start nginx php-fpm
[root@web02 ~]# systemctl enable nginx php-fpm
模块拆分:Web静态资源
为什么要拆分Web静态资源?
当后端的 web 节点出现多台时,如果用户上传的图片、视频附件等内容仅上传至一台web服务器,那么其他的web服务器无法访问到该图片。
新增一台nfs存储服务器解决了什么问题?
- 保证多台web节点静态资源一致
- 有效节省多台web节点的存储空间
- 统一管理静态资源,便于后期推送至CDN,进行静态资源加速
架构图示:
拆分准备服务器:
主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|
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服务器操作步骤:
- 安装
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)
- 创建
nfs
共享目录,并进行授权
[root@nfs01 ~]# mkdir /data/{blog,zh} -p
[root@nfs01 ~]# chown -R www.www /data/
- 启动
nfs
服务,并加入开机自启
[root@nfs01 ~]# systemctl start nfs-server
[root@nfs01 ~]# systemctl enable nfs-server
- web01服务器操作步骤:
- 安装
nfs-utils
,然后使用showmount
查看服务端共享的资源
[root@web01 ~]# yum -y install nfs-utils
[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
- 查找Wordpress静态资源存放的位置
浏览器->右键检查->选择Network->选择左上角的Select按钮->点击对应的图片->左下栏自动选择对应的url地址,如
下:
http://blog.oldboy.com/wp-content/uploads/2018/11/timg.gif
- 备份Wordpress的静态资源,因为该服务器上的资源最全
[root@web01 ~]# mv /code/wordpress/wp-content/uploads/ /code/wordpress/wp-content/uploads_bak/
- 创建目录授予权限,挂载
nfs
共享目录,恢复对应的数据
[root@web01 ~]# mkdir /code/wordpress/wp-content/uploads/ && chown www.www /code/wordpress/wp-content/uploads/
[root@web01 ~]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
[root@web01 ~]# cp -rp /code/wordpress/wp-content/uploads_bak/* /code/wordpress/wp-content/uploads/
- 设置开机自动挂载并测试
[root@web01 wp-content]# cat >> /etc/fstab <<EOF
172.16.1.31:/data/blog /code/wordpress/wp-content/uploads nfs defaults 0 0
EOF
[root@web01 wp-content]# mount -a
- 查找wecenter静态资源存放的位置
http://blog.oldboy.com/wp-content/uploads/2018/11/timg.gif
- 备份wecenter的静态资源
[root@web01 ~]# mv /code/wecenter/uploads/ /code/wecenter/uploads_bak/
- 创建目录授予权限,挂载
nfs
共享目录,恢复对应的数据
[root@web01 ~]# mkdir /code/wecenter/uploads/ && chown www.www /code/wecenter/uploads/
[root@web01 ~]# mount -t nfs 172.16.1.31:/data/zh /code/wecenter/uploads/
[root@web01 ~]# cp -rp /code/wecenter/uploads_bak/* /code/wecenter/uploads/
- 设置开机自动挂载并测试
[root@web01 wp-content]# cat >> /etc/fstab <<EOF
172.16.1.31:/data/zh /code/wecenter/uploads nfs defaults 0 0
EOF
[root@web01 wp-content]# mount -a
- web02服务器操作步骤:
- 直接挂载
nfs
[root@web02 ~]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
[root@web02 ~]# mount -t nfs 172.16.1.31:/data/zh /code/wecenter/uploads/
- 设置开机自动挂载并测试
[root@web02 ~]# cat >> /etc/fstab <<EOF
172.16.1.31:/data/blog /code/wordpress/wp-content/uploads nfs defaults 0 0
172.16.1.31:/data/zh /code/wecenter/uploads nfs defaults 0 0
EOF
[root@web02 ~]# mount –a