WEB服务-Nginx之6-LNMP架构

WEB服务-Nginx之6-LNMP架构

LNMP架构概述

LNMP 是一套技术的组合,L=Linux、N=Nginx、M=MySQL、P=PHP


FastCGI

Nginx不能直接处理动态请求,而是通过CGI协议将客户端请求转发给第三方服务处理,第三方服务器会新建新的进程处理用户的请求,处理完成后返回数据给Nginx并回收进程,最后Nginx再返回给客户端。

img

通用网关接口(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程序处理,具体如下图所示

image-20200910230537598


Nginx与Fast-CGO详细工作流程

image-20200910230928754

  1. 用户通过 http 协议发起请求,请求会先抵达 LNMP 架构中的 Nginx
  2. Nginx 会根据用户的请求进行判断,这个判断由 Location 完成
  3. 判断用户请求的是静态页面, Nginx 直接进行处理
  4. 判断用户请求的是动态页面, Nginx 会将该请求交给 FastCGI 协议下发
  5. FastCGI 会将请求交给 php-fpm 管理进程, php-fpm 管理进程接收到后会调用具体的工作进程 warrap
  6. warrap 进程会调用 php 程序进行解析,如果只是解析代码 php 直接返回
  7. 如果有查询数据库操作,则由 php 连接数据库(用户 密码 IP)发起查询的操作
  8. 最终数据由 mysql->php->php-fpm->FastCGI->nginx->http->user返回

LNMP架构环境部署

  1. 使用官方仓库安装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

  1. 统一用户:修改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

  1. 启动Nginx并加入开机自启
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx

  1. 使用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

  1. 统一用户:修改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的文件路径

  1. 启动php-fpm并加入开机自启
[root@web01 ~]# systemctl start php-fpm
[root@web01 ~]# systemctl enable php-fpm

  1. 安装Mariadb数据库
[root@web01 ~]# yum -y install mariadb-server

  1. 启动Mariadb并加入开机自启
[root@web01 ~]# systemctl start mariadb
[root@web01 ~]# systemctl enable mariadb

  1. 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 作用图解:

image-20200913110636091

不包含fastcgi_param配置文件测试:

  1. 配置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;
        }
}
  1. /code目录下创建info.php文件
[root@web01 ~]# cat /code/info.php
<?php
      phpinfo();
?>
  1. 重载nginx服务,浏览器访问http://10.0.0.7/info.php,访问成功如下图:页面存在,一片空白。

image-20200913113025793


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架构环境配置

  1. 使用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;
        }
}
  1. /code目录下创建info.php文件
[root@web01 ~]# cat /code/info.php
<?php
      phpinfo();
?>
  1. 重载nginx服务,浏览器访问http://10.0.0.7/info.php,访问成功如下图:

image-20200913133722198

  1. /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/>
  1. 重载nginx服务,浏览器访问http://10.0.0.7/mysqli.php,访问成功如下图:

image-20200913134354253

部署博客产品WordPress

  1. 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;
		}
}
  1. 重载nginx服务
[root@web01 ~]# systemctl restart nginx
  1. 进入/code目录,下载wordpress指定版本或最新版本,并解压

官网:https://wordpress.org/

中文官网: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
  1. 统一用户:修改wordpress目录属主属组
[root@web01 ~]# chown -R www.www /code/wordpress/
  1. 手动建立wordpress数据库
# 交互式
[root@web01 ~]# mysql -uroot -p123
mysql> create database wordpress;
mysql> exit

# 非交互式
[root@web01 ~]# mysql -e 'create database wordpress;'
  1. 通过浏览器访问wordpress网站:http://blog.oldboy.com/,并部署该产品

image-20200913135958532

image-20200913140026886

image-20200913140039091

image-20200913140222955

image-20200913140336113

image-20200913140405737

image-20200913140442111

image-20200913140519466


部署知乎产品WeCenter

  1. 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;
	}
}
  1. 重载nginx服务
[root@web01 ~]# systemctl restart nginx
  1. 创建并进入/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
  1. 统一用户:修改wecenter目录属主属组
[root@web01 ~]# chown -R www.www /code/wecenter/
  1. 手动建立wecenter数据库
[root@web01 ~]# mysql -uroot -p123
MariaDB [(none)]> create database wecenter;
MariaDB [(none)]> exit
  1. 通过浏览器访问wecenter网站:http://zh.oldboy.com/install/,并部署该产品

image-20200913151120262

image-20200913151215063

image-20200913151309247

image-20200913151451260

image-20200913151430383

image-20200913151517010


部署教育产品edusoho

  1. 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;
    }
}
  1. 重载nginx服务
[root@web01 ~]# systemctl reload nginx
  1. 进入/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
  1. 统一用户:修改edusoho目录属主属组
[root@web01 /code]# chown -R www.www /code/edusoho/
  1. 修改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
  1. 通过浏览器访问edusoho网站:http://edu.oldboy.com/,并部署该产品

image-20200917094209809

image-20200917094249031

image-20200917094305915

image-20200917094345173

image-20200917094551021

image-20200917094613634

image-20200917094637125


当然除了这些产品,还有很多我们可以搭建的产品:

  • phpmyadmin
  • zblog
  • discuz 论坛
  • ...

模块拆分:数据库

为什么要拆分数据库?

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


新增一台db数据库服务器解决了什么问题?

  1. 缓解web网站的压力
  2. 增强数据库读写性能
  3. 提高用户访问速度

架构图示:

image-20200913095844765


拆分准备服务器:

主机名称 应用环境 外网地址 内网地址
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上的数据库,123是数据库密码
[root@web01 ~]# mysqldump -uroot -p'123' -A > mysql-all.sql
  1. 将web01上备份的数据库拷贝至db01服务器上
[root@web01 ~]# scp mysql-all.sql root@172.16.1.51:/tmp

  1. db01服务器操作步骤:
  1. 安装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'
  1. 将web01服务器推送来的数据库备份文件恢复至db01服务器的数据库中
[root@db01 ~]# mysql -uroot -p'123' < /tmp/mysql-all.sql
  1. 重启数据库服务,并检查数据库是否导入成功
[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)]> 
  1. 在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"'

  1. web01服务器:修改各个产品连接数据库的配置localhost-->172.16.1.51
  1. 修改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');
  1. 修改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
  1. 最后关闭web01服务器上的mariadb服务
[root@web01 ~]# systemctl stop mariadb
[root@web01 ~]# systemctl disable mariadb
  1. 通过浏览器访问

成功打开,至此拆分数据库完成

水平扩展:增加Web服务器数量

为什么要扩展多台web节点?

单台web服务器能支持的访问量是有限的,配置多台web服务器能支持更多的访问量和提供更高的访问速度。


扩展多台web节点解决了什么问题?

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

架构图示:

image-20200913101117094


扩展准备服务器:

主机名称 应用环境 外网地址 内网地址
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用户
[root@web02 ~]# groupadd www -g 666 && useradd www -u 666 -g 666 -s /sbin/nologin -M
  1. 部署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
  1. 将web01的nginx配置文件导入到web02
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/nginx /etc/
  1. 将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
[root@web02 ~]# tar xf /tmp/code.tar.gz -C /
  1. 最后web02启动nginx与php-fpm,并加入开机自启
[root@web02 ~]# systemctl start nginx php-fpm
[root@web02 ~]# systemctl enable nginx php-fpm

模块拆分:Web静态资源

为什么要拆分Web静态资源?

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


新增一台nfs存储服务器解决了什么问题?

  1. 保证多台web节点静态资源一致
  2. 有效节省多台web节点的存储空间
  3. 统一管理静态资源,便于后期推送至CDN,进行静态资源加速

架构图示:

image-20200913101955823


拆分准备服务器:

主机名称 应用环境 外网地址 内网地址
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

  1. 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)
  1. 创建nfs共享目录,并进行授权
[root@nfs01 ~]# mkdir /data/{blog,zh} -p
[root@nfs01 ~]# chown -R www.www /data/
  1. 启动nfs服务,并加入开机自启
[root@nfs01 ~]# systemctl start nfs-server
[root@nfs01 ~]# systemctl enable nfs-server

  1. web01服务器操作步骤:
  1. 安装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
  1. 查找Wordpress静态资源存放的位置

浏览器->右键检查->选择Network->选择左上角的Select按钮->点击对应的图片->左下栏自动选择对应的url地址,如
下:

http://blog.oldboy.com/wp-content/uploads/2018/11/timg.gif
  1. 备份Wordpress的静态资源,因为该服务器上的资源最全
[root@web01 ~]# mv /code/wordpress/wp-content/uploads/ /code/wordpress/wp-content/uploads_bak/
  1. 创建目录授予权限,挂载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/
  1. 设置开机自动挂载并测试
[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
  1. 查找wecenter静态资源存放的位置
http://blog.oldboy.com/wp-content/uploads/2018/11/timg.gif
  1. 备份wecenter的静态资源
[root@web01 ~]# mv /code/wecenter/uploads/ /code/wecenter/uploads_bak/
  1. 创建目录授予权限,挂载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/
  1. 设置开机自动挂载并测试
[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

  1. web02服务器操作步骤:
  1. 直接挂载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/
  1. 设置开机自动挂载并测试
[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
posted @ 2021-06-05 10:37  原因与结果  阅读(117)  评论(0编辑  收藏  举报