🤣 一篇不正经但很管用的生产环境实战教程

"看完这篇文章,你就从'啥也不会'变成了'哇你好厉害'"

📖 劝退环节~哈哈

你好啊!点进来看这篇文章,说明你和我一样,想搞一个正经的网站——但又不想看那种满屏术语、读三行就犯困的教程。

我懂你,所以这篇文章会有点不一样:

  • 该正经的地方不正经该幽默的地方不幽默(毕竟生活已经够苦了,哈哈哈~)

我会带你从一个空荡荡的服务器,一步步搭出一个能抗住流量、不怕图片丢失、用户登录不怕掉线的正经网站。

看完这篇文章你会得到

  1. 一台跑着WordPress的服务器(单机版)

  2. 一个由5台服务器组成的豪华集群(分布式版)

  3. 一堆你可以拿去吹牛的知识点

  4. 若干深夜排障时会用到的救命命令

阅读时间:大概够你喝两杯咖啡
难度系数:⭐⭐⭐(三颗星,真的不难)
装逼系数:⭐⭐⭐⭐⭐(五颗星,学会了你就是公司最靓的仔)

⚠️ 友情提示:本文基于麒麟V10系统(国产操作系统之光)。如果你用的是CentOS、RHEL、AlmaLinux、Rocky Linux,照样能用,别慌。

🤔 在开始之前,先花5分钟搞懂这些概念(不然你会哭)

我知道你很急,但你先别急,先搞懂这几个东西是干啥的,不然做到一半你会回来翻这一节的。

什么是LNMP?(装逼必备基础知识)

LNMP不是榴莲牛奶披萨,而是四个软件的缩写:

字母 全称 中文名 打个你能听懂的比方
L Linux 操作系统 房子的地基和框架
N Nginx 反向代理服务器 前台小哥,负责迎客
M MySQL/MariaDB 数据库 仓库管理员,管货的
P PHP 脚本语言 厨师,负责做饭

整个流程是这样的

  1. 你在浏览器输入网址 → 就像你走到一家餐厅门口

  2. Nginx(前台小哥)问:"您好几位?想吃点啥?"

  3. 如果需要做饭,小哥喊:"后厨,来个客!"

  4. PHP(厨师)开始炒菜,需要食材就去问MySQL(仓库管理员)

  5. PHP把炒好的菜(HTML页面)交给Nginx

  6. Nginx把菜端给你(浏览器)

简单吧?就是这么回事。

为什么要把一台服务器拆成五台?(老板问起来你要会答)

刚开始你开了个小面馆,你一个人又当老板又当厨师又当服务员,忙得过来,后来生意火了,你一个人忙不过来了——客人等太久,面煮糊了,收银还找错钱。

这时候你就需要:

架构 啥意思 什么时候用
单机 一台服务器干所有活 日访问量<1000,比如你自己的博客
分布式 数据库一台、存储一台、Web好几台 日访问量>10000,比如公司官网

打个比方

  • 单机 = 你一个人开小面馆

  • 分布式 = 你开了个连锁餐厅:有人专门和面、有人专门炒菜、有人专门收银、有人专门端盘子

一句话总结:单机是"一个人累死",分布式是"一群人一起干活,谁也不累"。

生产环境的三大"潜规则":

这几条是我踩过坑之后才明白的,你直接记住就行:

  1. 永远不要在白天搞事情

    • 选凌晨3-5点,用户都在睡觉,你搞砸了也没人知道

    • 双11、618这种日子,打死不能动

  2. 动手之前先备份,备份,备份

    • 重要的事情说三遍

    • 你以为"我就改一下没事的" → 然后你就出事了

  3. 先在测试环境玩一遍

    • 就像你要上台表演,得先彩排吧?

    • 别在正式服务器上直接试,那是找刺激

🎯 第一部分:单机部署——从一台空服务器到WordPress上线

场景:你有一台崭新的、啥也没有的服务器,要从零开始把它变成一台能跑WordPress的机器。

难度:⭐⭐(跟着敲就行,不需要动脑子)

步骤一:怎么连上服务器

你需要一个SSH工具,SSH就是安全的远程连接方式,简单来说就是让你能坐在家里操控远在机房的服务器。

推荐工具

  • Windows:Xshell(好用但收费)、Putty(免费但丑)、Windows Terminal(微软官方,颜值高)

  • Mac/Linux:直接打开终端(Terminal)

连接命令(把IP换成你的服务器IP):

ssh root@123.45.67.89

然后输入密码。注意:输入密码的时候屏幕上啥也不显示,这是正常的,不是键盘坏了。

步骤二:先做两件"前戏"(别想歪)

连上服务器后,先做两个小事情,就像饭前洗手一样:

# 1. 更新软件包列表(就像去超市之前先看看有什么打折)
yum update -y

这个-y的意思是"别再问我了,我确定、一定以及肯定要更新",不用手动按Y。

# 2. 看看时间对不对
date

如果时间不对,执行:

timedatectl set-timezone Asia/Shanghai

为什么要调时间? 时间不对会有两个后果:

  • HTTPS证书会报错(浏览器说"这个网站不安全")

  • 出问题了看日志,时间全乱了,你根本不知道先发生什么后发生什么

步骤三:防火墙——服务器的门卫大爷

防火墙就像小区门卫,控制谁能进来、从哪个门进来。

为了快速部署,我们先关掉防火墙(仅限内网环境)

systemctl stop firewalld      # 门卫大爷下班了
systemctl disable firewalld   # 以后也别来了

⚠️ 如果你的服务器有公网IP(谁都能访问),千万别关防火墙! 应该这样做:

# 给门卫大爷说:80号和443号门可以让客人进,其他门不行
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload

# 看看哪些门开放了
firewall-cmd --list-ports

什么是端口? 把服务器想象成一栋大楼,端口就是不同的门:

  • 80号门:专门给普通网页(HTTP)进出

  • 443号门:专门给加密网页(HTTPS)进出

  • 3306号门:专门给数据库(MySQL)进出,这个门保安把守很严

步骤四:安装Nginx——招聘前台小哥

Nginx就是前台接待员,所有客人来了先找他。

# 安装Nginx
yum install nginx -y

装完了得让他上班:

systemctl start nginx      # 小哥,开始上班!
systemctl enable nginx     # 以后服务器重启了,小哥也能自动来上班
systemctl status nginx     # 看看小哥在不在工位上

验证一下:打开浏览器,输入你的服务器IP。如果看到"Welcome to nginx",恭喜你,前台小哥已经就位了!

步骤五:安装MySQL——招聘仓库管理员

MySQL(其实是MariaDB,它俩差不多,就像可口可乐和百事可乐)负责存数据:文章、用户、评论,全都归他管。

# 安装数据库
yum install mariadb mariadb-server -y

# 让仓管上班
systemctl start mariadb
systemctl enable mariadb

⚠️ 这一步很重要:给仓管定规矩(初始化数据库)

mysql_secure_installation

这个脚本会问你几个问题,我翻译成人话:

问题 人话翻译 该怎么回答
Enter current password for root 当前root密码是啥? 刚装完没有密码,直接回车
Set root password? 要不要设置root密码? 必须Y,然后输入一个你自己能记住但别人猜不到的密码
Remove anonymous users? 要不要删掉匿名用户? Y,不能让陌生人随便进仓库
Disallow root login remotely? 禁止root远程登录? Y,root权限太大,只能在本地用
Remove test database? 删掉测试数据库? Y,留着没用还危险
Reload privilege tables? 重新加载权限表? Y,让刚才的设置生效

什么是强密码? 至少12位,包含大小写字母+数字+符号。比如:MyWp@2024#Good,别用123456,那是把钥匙挂在门上。

步骤六:安装PHP——招聘厨师

WordPress是用PHP写的,所以需要一个PHP厨师来"炒菜"。

# 安装PHP和一堆扩展(扩展就是厨师的专用工具)
yum install php php-fpm php-mysqlnd php-gd php-xml php-mbstring php-json php-zip -y

这些扩展都是干什么的? 好比厨师的专用厨具:

扩展 厨具类比 没有它会怎样
php 厨师本人 WordPress完全没法运行
php-fpm 厨师长,管理其他厨师 Nginx不知道怎么找厨师
php-mysqlnd 去仓库拿货的小推车 连不上数据库,网站报错
php-gd 切菜刀 上传图片后做不出缩略图
php-xml 擀面杖 RSS订阅、站点地图不能用
php-mbstring 能处理中文的菜谱 中文文章可能乱码
php-json 打包外卖的盒子 古腾堡编辑器会出问题
php-zip 保鲜膜 没法在线装插件和主题
# 看看厨师来了没
php -v

步骤七:让Nginx和PHP手拉手干活

Nginx自己不会执行PHP代码,他得把PHP相关的请求转交给PHP-FPM(厨师长)。

# 让厨师长上班
systemctl start php-fpm
systemctl enable php-fpm

配置Nginx,告诉前台小哥遇到PHP文件该找谁

vim /etc/nginx/conf.d/wordpress.conf

把下面的内容贴进去,我会逐行进行解释的,不要害怕~

# 这是一个"站点配置",告诉Nginx怎么处理这个网站
server {
    # 监听80号门(HTTP端口)
    listen 80;
    
    # 这个网站绑定的域名(_表示"谁来都行")
    # 如果你有真实域名,改成 server_name www.你的域名.com;
    server_name _;
    
    # 网站文件放在哪里(根目录)
    root /var/www/html;
    
    # 默认首页:用户访问目录时,优先找哪个文件
    index index.php;

    # 处理普通请求(比如 https://你的网站/about)
    location / {
        # 按顺序尝试找文件:
        # $uri = 用户请求的路径
        # $uri/ = 如果没文件,试试看是不是目录
        # /index.php?$args = 都找不到,交给WordPress的入口文件处理
        # 这行看不懂没关系,记住是WordPress的标准配置就行
        try_files $uri $uri/ /index.php?$args;
    }

    # 处理PHP文件(比如 https://你的网站/wp-admin/admin-ajax.php)
    location ~ \.php$ {
        # 把PHP请求转发给PHP-FPM(厨师长)
        # 127.0.0.1:9000 就是本机的9000号门
        fastcgi_pass 127.0.0.1:9000;
        
        # 默认首页文件
        fastcgi_index index.php;
        
        # 告诉PHP-FPM要执行哪个PHP文件
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        
        # 导入一堆标准配置(不用管,知道是标配就行)
        include fastcgi_params;
    }
}

保存退出后,检查一下有没有写错:

nginx -t

如果看到syntax is oktest is successful,说明没问题。然后:

systemctl restart nginx   # 让配置生效

步骤八:下载WordPress(把菜买回来)

# 进入网站根目录
cd /var/www/html

# 下载WordPress(中文版,看得懂)
wget https://cn.wordpress.org/latest-zh_CN.tar.gz

# 解压(把压缩包打开)
tar -xzf latest-zh_CN.tar.gz

# 把文件移到根目录
mv wordpress/* .

# 清理战场(删掉没用的)
rm -rf wordpress latest-zh_CN.tar.gz

⚠️ 设置权限(非常重要!不然后面会哭)

# 把所有文件的主人改成nginx用户
chown -R nginx:nginx /var/www/html

# 目录设置755权限(主人可以随便玩,别人只能看)
find /var/www/html -type d -exec chmod 755 {} \;

# 文件设置644权限(主人可以改,别人只能看)
find /var/www/html -type f -exec chmod 644 {} \;

为什么权限这么重要?

权限数字 啥意思 谁有这权限
7 (rwx) 可以读、写、执行 主人(nginx用户)
5 (r-x) 可以读、执行,但不能写 主人的朋友(nginx组)
4 (r--) 只能读 其他人

如果权限不对,你会遇到这些问题:

  • 上传图片失败 → "无法创建目录"

  • 安装插件失败 → "无法写入文件"

  • 更新失败 → "需要FTP凭证"

步骤九:创建数据库(给WordPress准备仓库)

# 登录数据库(输入之前设的root密码)
mysql -u root -p

进去之后,执行这些SQL(我会逐句解释):

-- 创建一个叫"wordpress"的数据库
-- utf8mb4是支持emoji的编码,比如😀这种表情
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- 创建一个专门给WordPress用的用户(不让它用root,安全)
-- IDENTIFIED BY 后面换成你自己的密码
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY '你的强密码';

-- 授权:这个用户只能用wordpress数据库,别的地方不能去
GRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';

-- 让授权生效
FLUSH PRIVILEGES;

-- 退出
EXIT;

给你一个可以直接复制粘贴的版本(记得改密码):

CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'Wp@2024#Good';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

步骤十:网页上完成安装(快成功了!)

  1. 打开浏览器,输入你的服务器IP(比如 http://123.45.67.89

  2. 选择语言:简体中文(应该不会有人选English吧)

  3. 填写数据库信息

问题 答案 备注
数据库名 wordpress 就是刚才创建的
用户名 wp_user 刚才创建的用户
密码 你设的密码 别填错了
数据库主机 localhost 数据库和网站在一台机器上
表前缀 wp_ 默认就行,也可以改成别的
  1. 点击"提交" → 如果看到"现在开始安装",恭喜你成功了

  2. 填写站点信息

问题 建议
站点标题 你网站的名字,随便起
用户名 管理员账号,别用admin(太容易被猜)
密码 强密码!WordPress会帮你生成一个
电子邮件 你的邮箱,找回密码用
  1. 点击"安装WordPress" → 等几秒钟

  2. 登录后台http://你的IP/wp-admin

🎉 恭喜!你从0到1搭好了一个WordPress网站!

🚀 第二部分:从单机到分布式——人生苦短,我要搞大

场景:你的网站突然火了(可能是你写了一篇《如何优雅地吃泡面》),访问量暴涨,单机开始卡了,老板说:"小张,赶紧解决一下!"

解决方案:把一台服务器拆成5台!

难度:⭐⭐⭐⭐(需要集中注意力,但还是能跟上的)

架构全景图(看起来很唬人)

机器清单(你需要5台服务器)

角色 IP地址 配置 干啥的 外号
负载均衡器 10.0.0.10 2核4G 把请求分给下面三台 "前台主管"
Web 01 10.0.0.7 4核8G 处理网站请求 "打工仔1号"
Web 02 10.0.0.8 4核8G 处理网站请求 "打工仔2号"
Web 03 10.0.0.9 4核8G 处理网站请求 "打工仔3号"
NFS存储 10.0.0.20 2核4G+大硬盘 放用户上传的图片 "共享文件夹"
MySQL 10.0.0.30 4核8G+SSD 放文章和用户数据 "大仓库"
Redis 10.0.0.40 2核4G 缓存 + 登录状态 "便利贴"

注意:这些IP是我编的,你要换成你服务器的真实IP。

迁移前必做:停服+备份(血的教训)

# 1. 停服!不让任何人写入新数据
systemctl stop nginx php-fpm

# 2. 备份数据库
mysqldump -uroot -p --all-databases | gzip > /tmp/all_dbs_$(date +%Y%m%d).sql.gz

# 3. 备份网站文件
tar -czf /tmp/wordpress_$(date +%Y%m%d).tar.gz /var/www/html/

# 4. 备份配置文件(万一搞错了还能恢复)
tar -czf /tmp/config_$(date +%Y%m%d).tar.gz /etc/nginx /etc/php-fpm.d /etc/my.cnf

第一步:数据库搬家(给仓库找个大房子)

1.1 在新数据库服务器上装MySQL
# SSH登录到10.0.0.30
ssh root@10.0.0.30

# 安装(和之前一样)
yum install mariadb mariadb-server -y
systemctl start mariadb
systemctl enable mariadb
mysql_secure_installation   # 别忘了这个
1.2 把数据传过去
# 在旧服务器上执行(把备份传过去)
scp /tmp/all_dbs_*.sql.gz root@10.0.0.30:/root/

scp = Secure Copy,安全的复制文件,就像快递,把文件从一台服务器寄到另一台。

1.3 在新服务器上导入数据
# 在新数据库服务器上执行
gunzip < /root/all_dbs_*.sql.gz | mysql -uroot -p

# 创建一个WordPress专用用户(不让它用root)
mysql -uroot -p -e "CREATE USER 'wordpress'@'10.0.0.%' IDENTIFIED BY 'Wp@2024#Good';"

# 给这个用户授权
mysql -uroot -p -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'10.0.0.%';"

# 刷新权限
mysql -uroot -p -e "FLUSH PRIVILEGES;"

注意10.0.0.% 里的%是通配符,意思是"10.0.0.x网段的所有IP都能来连接"。

第二步:搭建Redis——买一沓便利贴

Redis是什么?就是个超快的便利贴系统,你把东西写在便利贴上,贴在冰箱上,下次要看直接看冰箱,不用去仓库翻箱倒柜。

Redis的两个作用:

  1. 缓存数据库查询:不用每次都去翻仓库,快很多。

  2. 共享登录状态:用户在三台打工仔机器上都能保持登录。

# SSH登录到10.0.0.40
ssh root@10.0.0.40

# 安装Redis
yum install redis -y
systemctl start redis
systemctl enable redis

配置Redis(很重要)

vim /etc/redis.conf

找到并修改这些配置:

# 原来:bind 127.0.0.1
# 改成:0.0.0.0(意思是"谁都能来,但必须带密码")
bind 0.0.0.0

# 设置密码(不加密码,你家的便利贴谁都能看)
requirepass Redis@2024#Good

# 限制最大内存(不给Redis吃光服务器)
maxmemory 512mb

# 内存满了就扔掉最不常用的东西
maxmemory-policy allkeys-lru

# 保存到硬盘(重启不丢数据)
appendonly yes

重启Redis:

systemctl restart redis

# 测试一下
redis-cli -h 127.0.0.1 -p 6379
> AUTH Redis@2024#Good
> PING
# 应该返回 PONG
> exit

第三步:搭建NFS——共享文件夹

问题来了:三台打工仔机器,用户上传的图片存在哪里?

如果存在Web01,用户在Web02访问就看不到图片。

解决方案:NFS(网络文件系统),就是一个共享文件夹,三台机器都能访问。

# SSH登录到10.0.0.20
ssh root@10.0.0.20

# 安装NFS
yum install nfs-utils -y

# 创建共享目录
mkdir -p /nfs/wordpress/uploads

# 设置权限
chown -R nginx:nginx /nfs/wordpress/uploads

配置NFS

vim /etc/exports

添加这一行:

# 格式:共享目录  允许访问的网段(权限)
/nfs/wordpress/uploads 10.0.0.0/24(rw,sync,no_subtree_check,no_root_squash)

参数解释

参数 人话意思
rw 可以读写(不能只读,不然没法上传图片)
sync 直接写硬盘,不拖欠(安全第一)
no_subtree_check 别管那么多子目录,越快越好
no_root_squash root用户的权限保留

启动NFS:

systemctl start nfs-server
systemctl enable nfs-server

第四步:在打工仔机器上挂载NFS

每台Web服务器都要做

# 安装NFS客户端
yum install nfs-utils -y

# 创建挂载点
mkdir -p /var/www/html/wp-content/uploads

# 挂载
mount -t nfs 10.0.0.20:/nfs/wordpress/uploads /var/www/html/wp-content/uploads

# 验证(看看有没有挂载成功)
df -h | grep nfs

设置开机自动挂载

echo "10.0.0.20:/nfs/wordpress/uploads /var/www/html/wp-content/uploads nfs defaults,_netdev 0 0" >> /etc/fstab

第五步:配置三台打工仔机器

每台Web服务器都得装环境

yum install nginx php php-fpm php-mysqlnd php-redis php-gd php-xml php-mbstring -y

systemctl start nginx php-fpm
systemctl enable nginx php-fpm

把WordPress代码传过去

# 在旧服务器打包
tar -czf /tmp/wordpress_code.tar.gz -C /var/www/html .

# 传到三台机器
scp /tmp/wordpress_code.tar.gz root@10.0.0.7:/tmp/
scp /tmp/wordpress_code.tar.gz root@10.0.0.8:/tmp/
scp /tmp/wordpress_code.tar.gz root@10.0.0.9:/tmp/

# 解压(每台都要)
ssh root@10.0.0.7 "tar -xzf /tmp/wordpress_code.tar.gz -C /var/www/html/"

最关键的一步:修改wp-config.php

vim /var/www/html/wp-config.php

改成这样(三台机器要一模一样):

<?php
// ========== 数据库配置(指向大仓库)==========
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', 'Wp@2024#Good');
define('DB_HOST', '10.0.0.30');   // 数据库服务器IP

// ========== Redis配置(指向便利贴)==========
define('WP_REDIS_HOST', '10.0.0.40');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_PASSWORD', 'Redis@2024#Good');
define('WP_REDIS_DATABASE', 0);

// ========== 密钥(去这里拿:https://api.wordpress.org/secret-key/1.1/salt/)==========
// 三台机器必须一样!!!
define('AUTH_KEY',         '把你从上面链接拿到的字符串贴这里');
define('SECURE_AUTH_KEY',  '把你从上面链接拿到的字符串贴这里');
define('LOGGED_IN_KEY',    '把你从上面链接拿到的字符串贴这里');
define('NONCE_KEY',        '把你从上面链接拿到的字符串贴这里');
define('AUTH_SALT',        '把你从上面链接拿到的字符串贴这里');
define('SECURE_AUTH_SALT', '把你从上面链接拿到的字符串贴这里');
define('LOGGED_IN_SALT',   '把你从上面链接拿到的字符串贴这里');
define('NONCE_SALT',       '把你从上面链接拿到的字符串贴这里');
// ===========================================

$table_prefix = 'wp_';
define('WP_DEBUG', false);
require_once(ABSPATH . 'wp-settings.php');

第六步:配置负载均衡器(前台主管)

# SSH登录到10.0.0.10
ssh root@10.0.0.10

# 安装Nginx
yum install nginx -y
systemctl start nginx
systemctl enable nginx

编写负载均衡配置

vim /etc/nginx/conf.d/load-balancer.conf
# 定义打工仔小组
upstream wordpress_backend {
    # 最少连接数算法(谁闲着就分配给谁)
    least_conn;
    
    # 三台打工仔机器
    server 10.0.0.7:80 max_fails=3 fail_timeout=30s;
    server 10.0.0.8:80 max_fails=3 fail_timeout=30s;
    server 10.0.0.9:80 max_fails=3 fail_timeout=30s;
    
    # 黏性cookie:让同一个用户总是去同一台机器
    sticky cookie srv_id expires=1h domain=.你的域名.com;
}

server {
    listen 80;
    server_name 你的域名.com;
    
    location / {
        # 转发给打工仔小组
        proxy_pass http://wordpress_backend;
        
        # 保留客户信息(重要!)
        proxy_set_header Host $host;                              # 客户访问的域名
        proxy_set_header X-Real-IP $remote_addr;                 # 客户真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 经过的代理链
        proxy_set_header X-Forwarded-Proto $scheme;             # http还是https
        
        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}
nginx -t
systemctl restart nginx

第七步:把旧图片搬到NFS

# 在旧服务器打包
tar -cf /tmp/uploads_backup.tar /var/www/html/wp-content/uploads/

# 传到NFS服务器
scp /tmp/uploads_backup.tar root@10.0.0.20:/tmp/

# 在NFS服务器解压
ssh root@10.0.0.20 "tar -xf /tmp/uploads_backup.tar -C /nfs/wordpress/uploads/ --strip-components=5"

# 设置权限
ssh root@10.0.0.20 "chown -R nginx:nginx /nfs/wordpress/uploads"

第八步:装Redis插件

登录WordPress后台(现在通过负载均衡器的IP访问):

  1. 插件 → 安装新插件

  2. 搜索 "Redis Object Cache"

  3. 安装 → 启用

  4. 设置 → Redis → Enable Object Cache

第九步:验证(别急着庆祝,先检查)

验证清单

# 1. 数据库
mysql -h 10.0.0.30 -u wordpress -p -e "SELECT 1"

# 2. NFS
echo "test" > /var/www/html/wp-content/uploads/test.txt
# 去另一台Web服务器看:cat /var/www/html/wp-content/uploads/test.txt

# 3. Redis
redis-cli -h 10.0.0.40 -a Redis@2024#Good PING
# 返回 PONG

# 4. 打开浏览器访问 http://10.0.0.10
# 能打开就成功了!

第十步:切换DNS

一切正常后,把域名解析改成负载均衡器的IP(10.0.0.10)。

等DNS生效(可能几分钟到几小时),你的分布式WordPress就正式上线了!

🔧 常见翻车现场

Q1:麒麟V10离线环境怎么装软件?

# 挂载ISO镜像
mount -o loop Kylin-Server-V10.iso /mnt

# 创建本地源
cat > /etc/yum.repos.d/local.repo << EOF
[local]
name=Local Repository
baseurl=file:///mnt
enabled=1
gpgcheck=0
EOF

# 刷新并安装
yum clean all
yum makecache
yum install nginx -y

Q2:图片裂了,显示不出来?

症状:网页上有文字,但图片位置是个裂开的图标。

抢救

mount | grep nfs   # 看看NFS挂载了没
ls -la /var/www/html/wp-content/uploads/   # 看权限
showmount -e 10.0.0.20   # 看NFS服务器共享了啥

Q3:登录后刷一下就掉线了?

症状:刚登录进后台,刷新一下,又让你登录。

可能原因:Redis没干活。

抢救

redis-cli -h 10.0.0.40 -a Redis@2024#Good PING   # 能通吗
php -m | grep redis   # PHP Redis扩展装了没
grep WP_REDIS /var/www/html/wp-config.php   # 配置写对了吗

Q4:502 Bad Gateway?

症状:白屏,写着"502 Bad Gateway"。

翻译:前台小哥(Nginx)找了半天找不到厨师(PHP-FPM)。

抢救

systemctl status php-fpm   # 厨师在不在
systemctl restart php-fpm  # 把厨师叫醒

Q5:数据库连不上?

症状:"Error establishing a database connection"

抢救

systemctl status mariadb                    # 数据库活着吗
netstat -tlnp | grep 3306                   # 端口开了吗
telnet 10.0.0.30 3306                       # 网络通吗
mysql -h 10.0.0.30 -u wordpress -p -e "SELECT 1"   # 用户密码对吗

📋 上线前的"灵魂拷问"清单

  • 数据库能连上吗?(试过了没)

  • 三台Web的wp-config.php一样吗?(不一样会死得很惨)

  • NFS挂载好了吗?(新上传的图片另一台能看到吗)

  • Redis里有session吗?(redis-cli KEYS "*session*"

  • 通过负载均衡器能访问吗?(直接IP能打开吗)

  • 登录后刷新不掉线吗?(用浏览器试过了没)

  • 服务器重启后服务能自动起来吗?(reboot一下试试?)

🔄 万一翻车了怎么办?(回滚方案)

啥都别说了,直接切回旧服务器:

# 1. 停掉负载均衡器
ssh root@10.0.0.10 "systemctl stop nginx"

# 2. 启动旧服务器
ssh root@旧服务器IP "systemctl start nginx mariadb php-fpm"

# 3. 把域名解析改回旧服务器IP

等用户那边缓存的DNS更新了,就都恢复正常了。

🎁 彩蛋:一些让你少熬夜的技巧

  1. 永远开启错误日志

    error_log /var/log/nginx/error.log debug;

    出问题了看日志,别自己瞎猜。

  2. 配置好了先测试再上线

    nginx -t   # 检查配置有没有写错
  3. 备份!备份!备份!重要的事情说三遍,一个月备份一次也好过没有备份。

  4. 改配置之前先备份原文件

    cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%Y%m%d)

    改坏了可以快速恢复。

最后送你三句话

  1. 服务器出问题了不要慌,日志会告诉你答案。

  2. 生产环境操作,能不动就不动,非动不可就备份。

  3. 免费的才是最贵的(指熬夜排障的时间)。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐