分类: 锦囊

记录遇到的 IT 问题解决方案,方便日后查阅。

  • 运维复盘:WordPress 事故恢复与架构升级实战记录

    1. 事故背景
      现状:服务器上有运行中的 WordPress 和 MySQL 8.0 容器。

    问题:/root/wordpress-app/ 目录下的 docker-compose.yml 丢失,导致无法对现有容器进行升级、维护或修改。

    需求:

    100% 还原配置文件。

    解决站点健康中提示的“页面缓存”性能问题。

    提升安全性(更换默认/已知密码)。

    1. 阶段一:逆向工程——找回配置
      由于容器还在运行,我们通过 Docker 内部信息反推配置。

    找回密码:通过 docker inspect wordpress_app | grep WORDPRESS_DB_PASSWORD 获取了连接密码。

    定位数据卷:通过 docker inspect 确认了数据卷名为 wordpress-app_wp_data 和 wordpress-app_db_data。

    重构 YAML:

    关键点:在 volumes 部分必须标记 external: true。这告诉 Docker:“卷已经存在了,直接挂载就好,千万别给我创建新的空卷”,否则数据会丢失。

    1. 阶段二:性能飞跃——引入双层缓存
      为了解决 WordPress 提示的“页面缓存”告警,我们实施了架构升级。

    架构图示
    操作步骤
    修改配置:在 docker-compose.yml 中新增 redis 服务。

    配置注入:在 WordPress 环境变量中加入 WORDPRESS_CONFIG_EXTRA,自动将 Redis 链接信息写入 wp-config.php。

    应用变更:执行 docker compose up -d。此时 WordPress 容器被“Recreated”(重建),但由于数据卷是外部挂载的,文章和图片毫发无损。

    插件激活:

    WP Super Cache:实现页面级静态化(解决站点健康告警)。

    Redis Object Cache:实现数据库查询缓存(提升后台操作速度)。

    1. 阶段三:安全加固——修改数据库密码
      修改已运行中的 MySQL 密码不能只改配置文件,必须遵循“锁钥匙同步”原则。

    关键流程:
    手动换锁:进入容器内部修改 MySQL 用户表。

    Bash

    docker exec -it wordpress_db mysql -u root -p旧密码
    ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘新密码’;
    FLUSH PRIVILEGES;
    同步钥匙:将 docker-compose.yml 中的两处密码同步修改为新密码。

    重启生效:执行 docker compose up -d,让 WordPress 带着新钥匙重新连接数据库。

    1. 核心:最终版生产环境 docker-compose.yml
      YAML

    name: wordpress-app

    services:
    db:
    image: mysql:8.0
    container_name: wordpress_db
    restart: always
    environment:
    MYSQL_DATABASE: wordpress
    MYSQL_ROOT_PASSWORD: “你的新密码”
    volumes:
    – wordpress-app_db_data:/var/lib/mysql

    redis:
    image: redis:6-alpine
    container_name: wordpress_redis
    restart: always

    wordpress:
    image: wordpress:latest
    container_name: wordpress_app
    restart: always
    ports:
    – “8080:80”
    environment:
    WORDPRESS_DB_HOST: db
    WORDPRESS_DB_USER: root
    WORDPRESS_DB_PASSWORD: “你的新密码”
    WORDPRESS_CONFIG_EXTRA: |
    define( ‘WP_REDIS_HOST’, ‘redis’ );
    define( ‘WP_REDIS_PORT’, 6379 );
    volumes:
    – wordpress-app_wp_data:/var/www/html
    depends_on:
    – db
    – redis

    volumes:
    wordpress-app_wp_data:
    external: true
    wordpress-app_db_data:
    external: true

    1. 经验与教训 (Best Practices)
      配置文件是灵魂:一定要备份 docker-compose.yml 到云端或 Git。

    External 是护身符:只要使用了外部卷(External Volumes),容器随便怎么删,数据永远在宿主机磁盘上。

    缓存是刚需:对于 WordPress,WP Super Cache + Redis 是标配,能极大延长服务器寿命。

  • 🛡️ WordPress 后台安全加固总结

    1. 核心防御原理

    我们在 Nginx 反向代理层(也就是你服务器的最外层大门)建立了一套“白名单准入机制”。

    • 逻辑: 只有来自你授权的 IP 地址,Nginx 才会将请求转发给 Docker 里的 WordPress 容器;其他所有 IP 访问敏感路径时,直接由 Nginx 拦截并返回 403 Forbidden
    • 优势: 攻击者无法通过暴力破解尝试密码,因为他们连登录页面都打不开,同时也减轻了 WordPress 插件和数据库的运算压力。

    2. 配置结构梳理

    你在 /etc/nginx/sites-available/wordpress 中实现的规则分为三个层次:

    访问路径规则策略目的
    / (全站首页/文章)全员开放保证读者能正常访问你的网站内容。
    /wp-admin/admin-ajax.php全员开放关键点:保证前台功能的动态加载(如评论、翻页)不失效。
    wp-admin & wp-login.phpIP 白名单只有你的 IP 能看到后台登录框,彻底封死暴力破解入口。

    3. 故障排除回顾(解决冲突)

    在配置过程中,我们遇到了 conflicting server name 警告,这是新手常踩的坑:

    • 问题: defaultwordpress 两个配置文件同时声明了对 yaoyuan.me 的所有权。
    • 解决: 通过删除 /etc/nginx/sites-enabled/default 软链接,确保了 Nginx 路径唯一化,让新规则真正生效。

    4. 日常维护手册

    • 查看被拦下的倒霉蛋:使用 tail -f /var/log/nginx/error.log | grep “forbidden”。
    • 自己被锁在外面了:
      1. SSH 登录服务器。
      2. 执行 curl ifconfig.me 获取当前新 IP。
      3. 修改 allow 后的 IP,运行 nginx -s reload
    • 增加办公环境 IP:在 allow 下方直接增加一行 allow x.x.x.x; 即可,记得保留最后一行 deny all;。

  • 用通俗易懂的方式讲解充电、电流、电压、电池相关知识,帮你建立基础电力概念。


    1️⃣ 电压 (Voltage, V)

    • 作用:就像水管里的水压,推动电流流动。
    • 单位:伏特 (V)
    • 例子:你电动车电池是 60 V,意思是电池能推动电流流动的“压力”大约是 60 伏特。

    2️⃣ 电流 (Current, A)

    • 作用:就像水管里的水流量,决定每秒钟有多少电流流过。
    • 单位:安培 (A)
    • 例子:你的充电器输出 2.6 A,意思是每秒钟有 2.6 安培的电流流进电池,给电池充电。
    • 注意:电流太大会烧坏电池,太小充电会很慢。2.6 A 对 20 Ah 铅酸电池来说是安全且温和的充电速度。

    3️⃣ 功率 (Power, W)

    • 作用:电压 × 电流,表示“电力工作量”或者“用电速度”。
    • 公式

    功率(W)=电压(V)×电流(A)功率(W) = 电压(V) \times 电流(A)功率(W)=电压(V)×电流(A)

    • 例子:你的充电器输出 68–74 V,2.6 A,大约功率是:

    68×2.6177W,74×2.6192W68 \times 2.6 \approx 177 W, \quad 74 \times 2.6 \approx 192 W68×2.6≈177W,74×2.6≈192W

    和标称 200 W 非常接近,说明数据匹配。


    4️⃣ 电池容量 (Capacity, Ah)

    • 作用:就像水桶大小,表示电池能储存多少电量。
    • 单位:安培小时 (Ah)
    • 例子:20 Ah 的电池,理论上可以输出 20 A 电流 1 小时,或者 2 A 电流 10 小时。

    5️⃣ 铅酸电池充电方式

    • 铅酸电池有标称电压(12 V/块),5 块串联就是 60 V。
    • 充电电压通常比标称电压略高(68–74 V),保证电池能充满。
    • 充电电流不宜过大,0.1–0.3C(C 是电池容量 Ah)是安全的充电速度。
      • 你 20 Ah 电池,0.1C ≈ 2 A,0.3C ≈ 6 A → 2.6 A 很安全。

    6️⃣ 插排额定功率

    • 插排上写的 2500 W,表示它能承受的最大功率是 2500 W。
    • 你的充电器只有 200 W,插排承受能力远大于充电器消耗,所以安全无忧

    7️⃣ 电压、电流、功率的关系

    你可以把它类比成水管系统

    概念类比数值对应
    电压 V水压推动水流的压力
    电流 A水流量每秒流过的水量
    功率 W水的能量流速水压 × 流量

    这样理解,就能知道为什么充电器功率低、电压对、插排大功率都没问题。


    “电压、电流、功率、电池容量”概念的水管示意图

    图片由CHATGPT提供