分类: 锦囊

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

  • 使用区块主题时发现找不到自定义CSS界面怎么办?

    1. 经典主题的直接路径

    大多数情况下,你可以直接在浏览器地址栏输入:

    你的域名/wp-admin/customize.php?autofocus[section]=custom_css

    • 说明: 这个 URL 会直接触发 WordPress 的 Customizer 并定位到“额外 CSS”选项卡。
    • 前提: 你必须已经登录了管理员账号。

    2. 其他相关的后台路径

    如果你想找的是物理文件路径或对应的后台编辑器:

    • 后台编辑器路径: 你的域名/wp-admin/theme-editor.php?file=style.css (注意:除非是子主题,否则不建议在这里改,更新主题会丢代码)
    • 常规后台首页: 你的域名/wp-admin/

    3. 为什么有时候找不到?

    如果你在 wp-admin 后面输入上述路径显示 “权限不足”“页面不存在”,通常有以下两种可能:

    1. 权限限制: 你当前的账号不是“管理员(Administrator)”级别。
    2. 区块主题(FSE): 如果你使用的是最新的区块主题(如 Twenty Twenty-Four),WordPress 默认隐藏了传统的“自定义”菜单。

    针对区块主题强行开启“自定义”界面的方法: 直接访问:你的域名/wp-admin/customize.php 虽然菜单里没有,但这个页面路径通常依然有效,进去后依然能看到“额外 CSS”选项。

  • docker部署wordpress

    1. 创建并进入目标目录

    首先,在 /opt 下创建一个专属目录。由于 /opt 权限通常较高,需要使用 sudo

    sudo mkdir -p /opt/wordpress-app
    sudo chown $USER:$USER /opt/wordpress-app  # 将所有权改为当前用户,方便操作
    cd /opt/wordpress-app

    2. 编写 docker-compose.yml

    在该目录下创建配置文件。我们将使用 相对路径,这样 Docker 会自动在 /opt/wordpress-app 下创建数据文件夹。

    cd /opt/wordpress-app  # 进入项目目录里
    
    nano docker-compose.yml

    粘贴以下内容

    services:
      db:
        image: mariadb:10.11
        restart: always
        environment:
          # 1. 数据库超级管理员 (root) 的密码
          # 建议设置一个非常复杂的密码,仅用于后台维护,WordPress 运行不直接使用它。
          MYSQL_ROOT_PASSWORD: your_root_password
          # 2. 自动创建的数据库名称
          # WordPress 的数据都会存放在这个名为 "wordpress" 的库里。
          MYSQL_DATABASE: wordpress
          # 3. WordPress 专用数据库用户名
          # 为了安全,不建议让网页程序直接使用 root 账号,这里创建一个普通用户。
          MYSQL_USER: wordpress_user
          # 4. WordPress 专用数据库用户的密码
          MYSQL_PASSWORD: your_password
        volumes:
          # 数据将存储在 /opt/wordpress-app/db_data
          - ./db_data:/var/lib/mysql
    
      wordpress:
        image: wordpress:latest
        restart: always
        ports:
          - "80:80"  # 如果没被占用,直接用 80 端口
        environment:
          WORDPRESS_DB_HOST: db
          WORDPRESS_DB_USER: wordpress_user
          WORDPRESS_DB_PASSWORD: your_password
          WORDPRESS_DB_NAME: wordpress
        volumes:
          # 代码和图片将存储在 /opt/wordpress-app/wp_data
          - ./wp_data:/var/www/html
        depends_on:
          - db

    3. 启动容器

    如果出现此类报错

    root@VM-4-5-debian:/opt/wordpress-app# docker-compose up -d
    
    -bash: docker-compose: command not found

    更换较新的指令

    docker compose up -d

    如果出现这个错误原因很简单,服务器无法连接到 Docker Hub 官方镜像库

    具体来说,i/o timeout(连接超时)通常是由以下两个原因导致的:

    IPv6 优先问题:报错信息中出现了 [2a03:2880...],这说明你的系统正尝试通过 IPv6 连接 Docker 官网,但腾讯云的公网环境可能对 IPv6 支持不畅。

    网络环境限制:在国内直接拉取 docker.io 的镜像经常会遇到网络波动或被屏蔽的情况。

    root@VM-4-5-debian:/opt/wordpress-app# docker compose up -d
    [+] up 2/2
     ✘ Image mariadb:10.11    Error failed to resolve reference "docker.io/library/mariadb:10.11": failed to do request: Head "https://registry-1.docke...       30.0s
     ! Image wordpress:latest Interrupted                                                                                                                        30.0s
    Error response from daemon: failed to resolve reference "docker.io/library/mariadb:10.11": failed to do request: Head "https://registry-1.docker.io/v2/library/mariadb/manifests/10.11": dial tcp [2a03:2880:f10e:83:face:b00c:0:25de]:443: i/o timeout
    root@VM-4-5-debian:/opt/wordpress-app# 

    🛠️ 解决方案

    彻底禁用 IPv6(针对腾讯云最有效的方案)

    从报错日志看,Docker 一直在尝试通过 IPv6 (2a03:2880...) 连接。国内很多环境的 IPv6 虽然能分配地址,但路由是不通的。

    最简单的办法:让 Debian 彻底优先使用 IPv4。

    1. 打开文件:
    sudo nano /etc/gai.conf

    找到第 54 行左右的这行代码: #precedence ::ffff:0:0/96 100

    去掉前面的 #,保存退出(Ctrl+O, Enter, Ctrl+X)。

    无需重启,直接再次执行:

    docker compose up -d

    依旧失败,不着急国内的环境就是复杂一些。

    最后更换公共代理加速器

    换成目前国内维护比较勤快的第三方代理加速器。

    1. 修改 daemon.json

    将你之前的 registry-mirrors 内容替换为以下几个(这是目前 2026 年比较稳定的几个):

    sudo nano /etc/docker/daemon.json

    修改为:

    {
      "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://huecker.io",
        "https://dockerhub.timeweb.cloud",
        "https://noohub.net"
      ],
      "log-driver": "json-file",
      "log-opts": { "max-size": "100m", "max-file": "3" },
      "live-restore": true
    }

    重启docker

    sudo systemctl daemon-reload
    sudo systemctl restart docker

    启动(在wordpress-app目录里执行)

    docker compose up -d

    1.确认容器运行状态

    docker compose ps

    2.开放防火墙(腾讯云关键步骤)

    你的 Docker 映射了端口(比如 8080:8080:80),但腾讯云默认的安全组可能拦截了外部访问:

    • 登录 腾讯云控制台 -> 云服务器 -> 实例。
    • 点击 安全组 -> 修改规则
    • 添加一条:协议端口 TCP:80 (或者你设置的 8080),来源选择 0.0.0.0/0(全开)。

    3. 完成 Web 安装

    在浏览器输入:http://你的服务器公网IP

    • 看到 WordPress 著名的“五分钟安装”界面,就说明成功了!
    • 数据库连接信息如果你按之前的配置填,主机名(Host)记得填 db(这是 Compose 内部的服务名),而不是 localhost
    点击继续

    填写基本信息

    完结撒花

    通过域名访问wordpress

    1. 准备 Nginx 配置文件

    /opt/wordpress-app 目录下创建一个 nginx 文件夹,用来存放配置:

    mkdir -p /opt/wordpress-app/nginx/conf.d

    创建一个名为 default.conf 的配置文件:

    nano /opt/wordpress-app/nginx/conf.d/default.conf

    写入以下内容(记得替换域名):

    server {
        listen 80;
        server_name yourdomain.com; # 替换成你的域名
    
        location / {
            proxy_pass http://wordpress:80; # 这里的 wordpress 对应 compose 里的服务名
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

    2. 更新 docker-compose.yml

    修改你现有的配置文件,把 Nginx 加进去,并注意端口冲突(WordPress 容器不需要再向外暴露 80 端口了,交给 Nginx 暴露)。

    services:
      db:
        image: mariadb:10.11
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: your_root_password
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpress_user
          MYSQL_PASSWORD: your_password
        volumes:
          - ./db_data:/var/lib/mysql
    
      wordpress:
        image: wordpress:latest
        restart: always
        # 删掉之前的 ports: - "80:80",因为我们不需要外部直接访问 WP
        environment:
          WORDPRESS_DB_HOST: db
          WORDPRESS_DB_USER: wordpress_user
          WORDPRESS_DB_PASSWORD: your_password
          WORDPRESS_DB_NAME: wordpress
        volumes:
          - ./wp_data:/var/www/html
        depends_on:
          - db
    
      nginx:
        image: nginx:alpine
        restart: always
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./nginx/conf.d:/etc/nginx/conf.d
        depends_on:
          - wordpress

    3. 部署并验证

    1. 域名解析:在你的域名服务商处,将域名指向腾讯云服务器的公网 IP
    2. 重启服务
    cd /opt/wordpress-app
    docker compose up -d

    访问域名看看效果

    最后需要到wordpress后台设置里

    访问:http://你的域名/wp-admin/

    填写完,保存更改就可以通过域名访问我们的网站了。

  • 腾讯云服务器Debian12升级Debian13

    升级前准备

    1. 快照备份(非常重要): 在腾讯云控制台为你的服务器创建云硬盘快照。如果升级失败导致系统无法启动,这是唯一的“后悔药”。
    2. 更新现有系统: 确保当前 Debian 12 是最新状态。
    sudo apt update && sudo apt upgrade -y && sudo apt full-upgrade -y

    升级步骤

    1. 修改软件源

    Debian 的升级核心在于更换 /etc/apt/sources.list 中的代号。你需要将 bookworm 替换为 trixie

    sudo sed -i 's/bookworm/trixie/g' /etc/apt/sources.list
    sudo sed -i 's/bookworm/trixie/g' /etc/apt/sources.list.d/*.list

    注意: 对于腾讯云内网源(mirrors.tencentyun.com),通常只需执行上述替换即可。

    2. 更新软件包列表

    告知系统你现在指向的是 Debian 13 的仓库。

    sudo apt update

    3. 执行最小升级 (Minimal Upgrade)

    为了降低冲突风险,建议先升级基础软件包。

    sudo apt upgrade --without-new-pkgs -y

    4. 执行全量升级 (Full Upgrade)

    这是最关键的一步,系统会删除旧包并安装 Debian 13 的新包(包括内核)。

    sudo apt full-upgrade -y

    交互提示: 升级过程中,系统可能会询问你是否保留现有的配置文件(如 sshd_config)。如果你之前对服务器做过特殊配置,建议选 N(保留当前版本);如果不确定,通常选 Y(使用开发者版本)

    5. 清理与重启

    删除不再需要的旧依赖包并重启服务器。

    sudo apt autoremove -y
    sudo reboot

    验证升级结果

    重启后重新连接 SSH,查看内核和系统版本:

    cat /etc/debian_version
    # 应该显示 13.x 或 trixie/sid
    uname -a
    # 查看新内核是否生效

    完结撒花

  • Docker 服务器完整运维指南(个人服务器推荐架构)

    随着越来越多服务可以通过 Docker 部署,很多个人服务器都会运行多个项目,例如博客、密码管理器、数据库等。

    如果一开始没有规划好服务器结构,后期往往会出现:

    • 项目目录混乱
    • 数据难以备份
    • 迁移服务器困难
    • 运维成本越来越高

    本文整理了一套 个人服务器 Docker 运维方案,适用于长期稳定运行。

    一、服务器目录规划

    Linux 系统推荐遵循 Filesystem Hierarchy Standard。

    其中:

    • /opt 用于存放第三方软件
    • 非系统程序建议统一放在 /opt

    因此推荐目录结构:

    /opt

     └── docker

          ├── nginx

          ├── wordpress

          ├── bitwarden

          ├── mysql

          └── redis

    说明:

    目录用途
    /opt/docker所有 Docker 项目
    nginx反向代理
    wordpress博客系统
    bitwarden密码管理
    mysql数据库
    redis缓存服务

    这样规划的优点:

    • 结构清晰
    • 运维简单
    • 迁移服务器方便

    二、Docker 项目标准结构

    每个 Docker 项目建议统一结构:

    project-name

     ├── docker-compose.yml

     ├── data

     ├── config

     └── logs

    例如 WordPress:

    /opt/docker/wordpress

     ├── docker-compose.yml

     ├── data

     ├── db

     └── logs

    说明:

    目录用途
    docker-compose.yml容器启动配置
    data程序数据
    config配置文件
    logs日志

    三、推荐部署的基础服务

    一台个人服务器通常包含以下服务:

    1 Nginx 反向代理

    推荐使用 Nginx 统一反向代理。

    目录结构:

    /opt/docker/nginx

     ├── docker-compose.yml

     ├── conf

     │    ├── blog.conf

     │    ├── panel.conf

     │    └── vault.conf

     ├── html

     └── logs

    用于反代:

    • 博客
    • 面板
    • API 服务

    2 WordPress 博客

    博客系统推荐使用 WordPress。

    优点:

    • 插件丰富
    • 主题丰富
    • SEO 友好
    • 社区活跃

    目录:

    /opt/docker/wordpress

    3 Bitwarden 密码管理

    密码管理推荐自建 Bitwarden。

    优点:

    • 开源
    • 支持浏览器插件
    • 支持手机 App
    • 支持自托管

    目录:

    /opt/docker/bitwarden

    四、Docker 常用运维命令

    查看容器:

    docker ps

    查看日志:

    docker logs 容器名

    进入容器:

    docker exec -it 容器名 bash

    重启容器:

    docker restart 容器名

    停止项目:

    docker compose down

    启动项目:

    docker compose up -d

    五、服务器迁移方法

    如果需要更换服务器,只需要迁移 /opt/docker 目录。

    1 停止容器

    docker compose down

    2 打包数据

    tar -czvf docker-backup.tar.gz /opt/docker

    3 传输到新服务器

    scp docker-backup.tar.gz root@新服务器:/opt

    4 解压

    tar -xzvf docker-backup.tar.gz

    5 启动服务

    cd /opt/docker

    docker compose up -d

    完成迁移。

    六、Docker 数据备份

    建议每天备份服务器数据。

    备份命令:

    tar -czvf /backup/docker-$(date +%F).tar.gz /opt/docker

    定时任务:

    crontab -e

    加入:

    0 3 * * * tar -czvf /backup/docker-$(date +\%F).tar.gz /opt/docker

    每天凌晨 3 点自动备份。

    七、服务器安全建议

    1. 使用 SSH Key 登录
    2. 禁止 root 远程登录
    3. 开启防火墙
    4. 定期更新系统
    5. 定期备份数据

    八、推荐服务器运维习惯

    1️⃣ 所有项目统一 /opt/docker

    2️⃣ 每个项目独立目录

    3️⃣ 使用 docker-compose 管理

    4️⃣ 所有数据必须挂载

    5️⃣ 定期备份服务器

    九、总结

    通过合理规划服务器结构,可以获得以下优势:

    • 清晰的项目结构
    • 简单的服务器迁移
    • 方便的数据备份
    • 更专业的运维管理

    这套结构非常适合:

    • 个人博客服务器
    • 自建云服务
    • 开发测试服务器

    长期使用也不会混乱。

    如果需要进一步提升运维效率,可以继续优化:

    • 自动备份脚本
    • 自动 SSL 证书
    • 统一反向代理
    • Docker 一键部署脚本

    这样就能打造一套稳定的个人服务器环境。

  • 运维复盘: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提供