[步骤] 个人 WordPress 网站实现多节点 (负载均衡加高可用) 和 Content Delivery Network (CDN) 的重点设置 (非自建集群版)

步骤一:拓扑规划

1.1 列表

Content Delivery Network (CDN)
多个可以独立运行的 LNMP + SSL 服务器节点

1.2 拓扑图

                 Access the website 
                 through the root domain                              
Client Browser -------------------------------------> Server Node Two 
                 CDN (Content Delivery Network)  |     ^
                 GeoDNS                          |     |  Fully Copy 
                 DNS Failover                    |     |  Regularly
                                                 |     |  by Shell Scripts
                                                 |     |
                                                 ---> Server Node One
                                                       ^
               Edit the website                        |
               through the www. prefix                 |
Edit Console -------------------------------------------
               DNS record point directly to 
               the server IP address

1.3 拓扑图简介

1) 每个 Server Node 都是一个独立运行的 LNMP + SSL 服务器节点
2) 整个架构没有任何自建集群,管理员只在指定服务器节点上进行编辑,然后通过 Shell 脚本定期全量备份到其他服务器节点上
3) 客户端浏览器通过根域名访问网站,管理员通过带 www. 前缀的域名编辑网站
4) 通过禁用 CDN (Content Delivery Network) 的 Cookie 来确保管理员无法通过 CDN (Content Delivery Network) 登录网站的后台。例如防止管理员在 Server Node Two 上登录并修改网站,然后新修改的内容又被 Server Node One 上的老内容覆盖了
5) 本架构实现了 Content Delivery Network (CDN) 网站缓存加速、GeoDNS 用户自动就近访问离自己位置最近的服务器节点、DNS Failover 如果某台服务器挂掉就会被自动踢出然后让后面的访问者都去访问那个好的节点以实现高可用

步骤二:搭建传统的 LNMP + SSL 平台

(步骤略)

步骤三:个人 WordPress 网站实现多节点 (负载均衡加高可用) 和 Content Delivery Network (CDN) 的重点设置

3.1 如果 WordPress 安装了 AIOS (All In One WP Security & Firewall) 插件的话禁用 Enable rename login page feature 以保证获取有效 Cookie

WordPress Dashboard –> AIOS –> Brute Force –> Rename login page –> Enable rename login page feature –> Disable

(补充:如果开启了此功能,则管理员可能无法通过带 www. 前缀的域名登录,因为登录网站时可能无法获得有效的 Cookie)

3.2 通过 Nginx 的配置文件 (/etc/nginx.conf) 分别实现带 www. 前缀的域名和根域名的特定配置

1) 将带 www. 前缀的域名和根域名分开设置成 2 个 server 模块
2) 带 www. 前缀的域名除了这几个文件后缀对其他所有文件的访问都跳转到根域名,这样可以确保只能通过根域名访问网站对外的内容,但是通过带 www. 前缀的域名和根域名都可以访问网站的后台:

wp-login.php|admin-ajax.php|wp-admin|wp-json|wp-includes|wp-content/plugins|wp-content/themes|wp-content/uploads

3) 根域名不对以下文件进行缓存以防止 CDN (Content Delivery Network) 缓存导致网站主页被网站内的其他网页覆盖:

index.php$

(
补充:

)

3.3 通过 WordPress 的配置文件 (/usr/share/nginx/html/wp-config.php) 实现 WordPress 网站可以接受双域名直接访问

# vi /usr/share/nginx/html/wp-config.php

添加以下内容:

......
$domain = array("eternalcenter.com", "www.eternalcenter.com");
if(in_array($_SERVER['HTTP_HOST'], $domain)){
    define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST']);
    define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST']);
}
......

(
补充:
1) 这里以设置 WordPress 网站可以接受双域名 eternalcenter.com 和 www.eternalcenter.com 2 个域名直接访问为例
2) 这样设置后不会出现访问 1 个域名时却被 WordPress 程序自动跳转到另 1 个域名的情况
)

(
注意:
1) 此时 WordPress 后台 Settings –> General 里的 WordPress Address (URL) 栏和 Site Address (URL) 将被锁定,无法在 WordPress 后台修改
2) 进入修改主题时可能会报错 “Non-existent changeset UUID.” 或者直接无法显示
)

3.4 通过 Content Delivery Network (CDN) 的设置实现特定功能

3.4.1 为网站添加 Content Delivery Network (CDN) Pull

(步骤略)

3.4.2 添加 Edge rules 以防止网站首页混乱以及让 Content Delivery Network (CDN) 自动产生的网站访问链接无法被访问

1) 将 */ 和 /index.php 的 Override Cache Time 设置为 0 seconds
2) 将 Content Delivery Network (CDN) 自动产生的网站访问链接 https://8cc443b6-4.b-cdn.net/ 设置为 Block Request

(
补充:
1) 这里以假设 Content Delivery Network (CDN) 自动产生的网站访问链接是 https://8cc443b6-4.b-cdn.net/ 为例
2) 这里以使用 bunny.net 的后台进行设置为例
)

3.4.3 给 ‘s’ 参数开启 query string sort 功能以防止 Content Delivery Network (CDN) 影响 WordPress 网站的搜索功能

Dashboard –> CDN –> click Content Delivery Network (CDN) Pull –> Caching –> General –> Query string sort (enable) –> Vary Cache –> URL Query String (enable) –> Parameter list: –> write ‘s’

(补充:这里以使用 bunny.net 的后台进行设置为例)

3.4.4 开启 Strip response cookies 功能以防止管理员在 Server Node Two 上登录并修改网站,然后新修改的内容又被 Server Node One 上的老内容覆盖了

Dashboard –> CDN –> click Content Delivery Network (CDN) Pull –> Caching –> General –> Strip response cookies (enable)

(补充:这里以使用 bunny.net 的后台进行设置为例)

3.4.5 允许关键爬虫访问 WordPress 网站以允许 Google 等搜索引擎可以持续收录此网站

Dashboard –> CDN –> click Content Delivery Network (CDN) Pull –> Settings –> SEO crawlers –> Allow (enable)

(补充:这里以使用 bunny.net 的后台进行设置为例)

[工具] Shell 将本地的 SSL 证书恢复到本地的 LNMP + SSL

介绍

基本信息

作者:朱明宇
名称:将本地的 SSL 证书恢复到本地的 LNMP + SSL
作用:将本地的 SSL 证书恢复到本地的 LNMP + SSL

使用方法

1. 将网站的 SSL 公钥、网站的 SSL 私钥 2 个文件放在此脚本中变量 tmppath 对应的目录里
2. 给此脚本添加执行权限
3. 执行此脚本

脚本分割线里的变量

tmppath=/bcache #本地存放 SSL 证书的名称
cmidname=fullchain #SSL 公钥的名称
kmidname=privkey #SSL 私钥的名称
sslpath=/etc/letsencrypt/live/eternalcenter.com/ #本地 LNMP + SSL 存放公私的目录

注意

1. 本地需要已经搭建好 LNMP 平台
2. 必须以 root 的身份执行此脚本

脚本

#!/bin/bash

####################### Separator ########################

tmppath=/bcache
cmidname=fullchain
kmidname=privkey
sslpath=/etc/letsencrypt/live/eternalcenter.com/

####################### Separator ########################


nowdirectory=`pwd`


cd $tmppath


crtfile=`ls | grep $cmidname | grep -E \.pem$ | tail -1`
keyfile=`ls | grep $kmidname | grep -E \.pem$ | tail -1`

echo $crtfile
if [ -n "$crtfile" ];then
    rm -rf $sslpath/$crtfile
    mkdir -p $sslpath &> /dev/null
    mv $crtfile $sslpath/
    chcon -t httpd_config_t $sslpath/*
fi

echo $keyfile
if [ -n "$keyfile" ];then
    rm -rf $sslpath/$keyfile
    mkdir -p $sslpath &> /dev/null
    mv $keyfile $sslpath/
    chcon -t httpd_config_t $sslpath/*
fi

chcon -t httpd_config_t $sslpath

sudo systemctl restart nginx
sudo systemctl restart php-fpm

cd $nowdirectory

[工具] Shell 将本地 SSL 证书传送到远程服务器

介绍

基本信息

作者:朱明宇
名称:将本地 SSL 证书传送到远程服务器
作用:将本地 SSL 证书传送到远程服务器

使用方法

1. 给此脚本添加执行权限
2. 执行此脚本

脚本分割线里的变量

sslpath=”/etc/letsencrypt/live/eternalcenter.com” #本地存放 SSL 证书的目录
sslfile1=”fullchain.pem” #本地 SSL 证书的文件名,这个是公钥
sslfile2=”privkey.pem” #本地 SSL 证书的文件名,这个是私钥
bip=”192.168.0.1 192.168.0.2″ #远程服务器的 IP 地址,多个 IP 地址用空格分开
buser=”mingyuzhu” #登录远程服务器的用户名
bcache=”/bcache” #远程服务器存放 SSL 证书的目录

注意

1. 指定的用户必须要能无密码登录远程服务器
2. 指定的用户必须对远程服务器里指定的目录拥有所属权

脚本

#!/bin/bash

sslpath="/etc/letsencrypt/live/eternalcenter.com" #website cache
sslfile1="fullchain.pem"
sslfile2="privkey.pem"

bip="49.12.248.138"
buser="mingyuzhu"
bcache="/bcache"

######################## copy webiste date to remote server #########################

for i in `echo $bip`

do
ping -c4 -i0.8 -w4 $i &> /dev/null

if [ $? -eq 0 ];then
    ssh $buser@$i "who -b"
        if [ $? -eq 0 ];then
#            ssh $buser@$i "sudo mkdir $bcache ; sudo chown $buser:$buser $bcache"
            scp $sslpath/$sslfile1 $buser@$i:$bcache/ 
            scp $sslpath/$sslfile2 $buser@$i:$bcache/ 
        fi
fi
done

######################## copy webiste date to remote server #########################

[工具] Shell 将本地网站文件和网站数据库恢复到本地的 LNMP

介绍

基本信息

作者:朱明宇
名称:将本地网站文件和网站数据库恢复到本地的 LNMP
作用:将本地网站文件和网站数据库恢复到本地的 LNMP

使用方法

1. 将网站文件、网站数据库,2 个文件放在此脚本中变量 tmppath 对应的目录里
2. 给此脚本添加执行权限
3. 执行此脚本

脚本分割线里的变量

tmppath=/bcache #本地存放网站的文件备份、网站的 SSL 公钥、网站的 SSL 私钥、网站的数据库备份的地方
midname=eternalcenter #网站的文件备份和网站的数据库备份的中间名
webpath=/usr/share/nginx/html #网站文件在本地的正式存放位置
dbuser=ec #网站用于连接数据库的用户
dbname=ec #网站在数据库中的的库名

注意

1. 本地需要已经搭建好 LNMP 平台
2. 必须以 root 的身份执行此脚本
3. 脚本中类似 ”mysql -uroot -p’eternalcenter’ -e “drop database $dbname;”“ 中的 “eternalcenter“ 是指本地 MariaDB 数据库 root 用户的密码,需要修改成 MariaDB 数据库的 root 用户的真实密码
4. dbname=ec 网站在数据库中的的库名,每次执行此脚本时这个库里面以前的数据都会被清空

脚本

#!/bin/bash

####################### Separator ########################

tmppath=/bcache
midname=eternalcenter

webpath=/usr/share/nginx/html

dbuser=ec
dbname=ec

####################### Separator ########################

nowdirectory=`pwd`

cd $tmppath

sqlfile=`ls | grep $midname | grep -E \.sql$ | tail -1`
tarfile=`ls | grep $midname | grep -E \.tar | tail -1`


echo $sqlfile
if [ -n "$sqlfile" ];then
    mysql -uroot -p'eternalcenter' -e "drop database $dbname;"
    mysql -uroot -p'eternalcenter' -e "create database $dbname;"
    mysql -uroot -p'eternalcenter' -e "grant all privileges on $dbuser.* to \"$dbuser\"@\"localhost\";"
    mysql -uroot -p'eternalcenter' ec < $sqlfile
    rm -rf $sqlfile
fi

echo $tarfile
if [ -n "$tarfile" ];then
    rm -rf $webpath/*
    tar -zxvf $tarfile -C $webpath/ &> /dev/null
    rm -rf $tarfile
    chcon -t httpd_sys_content_t -R $webpath/*
    chown -R php-fpm:php-fpm $webpath/
fi


sudo systemctl restart nginx
sudo systemctl restart php-fpm
sudo systemctl restart mariadb

cd $nowdirectory

[工具] Shell 将本地 LNMP 的网站文件和网站数据备份并传送到远程服务器

介绍

基本信息

作者:朱明宇
名称:将本地 LNMP 的网站文件和网站数据备份并传送到远程服务器
作用:将本地 LNMP 的网站文件和网站数据备份并传送到远程服务器
使用方法

使用方法

1. 在此脚本的分割线内写入相应的内容
2. 给此脚本添加执行权限
3. 执行此脚本

脚本分割线里的变量

1. filename=eternalcenter-backup #备份文件的中间名
2. lpath=”/usr/share/nginx/html” #本地存放网站文件的目录
3. tcache=”/tcache” #本地临时存放网站文件备份和网站数据备份的目录
4. bip=”192.168.0.1 192.168.0.2″ #远程服务器的 IP 地址,多个 IP 地址可以用空格分开
5. buser=”mingyuzhu” #登录远程服务器的用户
6. bcache=”/bcache” #远程服务器用于存放备份的目录

注意

1. 本地需要已经搭建好 LNMP 平台
2. 用于远程服务器的用户,需要能免密钥 ssh 远程服务器,且对于本地用于备份数据的目录和远程服务器用于备份数据的目录拥有读和执行的权限
3. 脚本里的 ”mysqldump -uroot -p’eternalcenter’ lnmp > $tcache/$filename-$date.sql“ 是指本地 MariaDB 数据库用户是 root、密码是 eternalcenter、要备份的库名是 lnmp,这些都需要修改成真实环境中对应的值
4. tcache=”/tcache” 本地临时存放网站文件备份和网站数据备份的目录,每次执行此脚本时这个目录里面以前的文件都会被清空

脚本

#!/bin/bash


filename=eternalcenter-backup #middle name
lpath="/usr/share/nginx/html" #website server directory

tcache="/tcache" #website cache

bip="147.182.245.159"
buser="mingyuzhu"
bcache="/bcache"


date=$(date +%Y-%m-%d-%H)

######################## backup webiste date #########################
mkdir $tcache &> /dev/null
rm -rf $tcache/* &> /dev/null
mysqldump -uroot -p'ec@zhu mingyu#123abc!@#' ec > $tcache/$filename-$date.sql
cd $lpath
sudo tar -zcvf $tcache/$filename-$date.tar.gz .[!.]* * &> /dev/null
cd
######################## backup webiste date #########################


######################## copy webiste date to remote server #########################

for i in `echo $bip`

do
ping -c4 -i0.8 -w4 $i &> /dev/null

if [ $? -eq 0 ];then
    ssh $buser@$i "who -b"
        if [ $? -eq 0 ];then
#            ssh $buser@$i "sudo mkdir $bcache ; sudo chown $buser:$buser $bcache"
            scp $tcache/* $buser@$i:$bcache/ 
        fi
fi
done

######################## copy webiste date to remote server #########################