【网络运维】 WordPress 部署复盘

WordPress 部署复盘


一、项目背景与目标

在 Ubuntu 22.04+ 系统上部署私人 WordPress 博客网站,与已有的 Nginx 文件共享服务共存。通过本地 hosts 解析域名访问博客和文件共享。

初始环境:

  • Ubuntu 系统,已安装并运行 Nginx
  • Nginx 已配置 /etc/nginx/sites-available/file-share 用于文件目录浏览
  • 服务器 IP:192.168.x.x(示例,实际为内网地址)
  • 目标:博客 + 文件共享互不影响

二、部署架构设计

复制代码
┌──────────────────────────────────────────────────────────────────────────────────┐
│                    Nginx (80端口)                                                 │
├──────────────────────────────────────────────────────────────────────────────────┤
│  server_name: example.blog   →  /var/www/html/wordpress  (博客)
│  server_name: file.example.blog + 192.168.x.x  →  /home/user/downloads  (文件共享)
├──────────────────────────────────────────────────────────────────────────────────┤
│                    PHP 8.3-FPM                                                   │
│                  unix socket: php8.3-fpm.sock                                    │
├──────────────────────────────────────────────────────────────────────────────────┤
│                    MariaDB                                                       │
│              数据库: wordpress 用户: wp_user                                       │
└──────────────────────────────────────────────────────────────────────────────────┘

核心设计思路:

  • 通过 Nginx 的 server_name 指令区分不同服务
  • WordPress 使用独立配置文件,与文件共享配置分离
  • 客户端通过修改 hosts 文件实现域名解析(无需 DNS 服务器)

三、部署关键步骤及命令详解

步骤1:安装 LNMP 环境

1.1 安装 PHP 8.3

bash 复制代码
sudo apt update
sudo apt install -y php8.3-fpm php8.3-mysql php8.3-gd php8.3-mbstring php8.3-curl

命令意图

  • php8.3-fpm:PHP FastCGI 进程管理器,Nginx 通过它处理 PHP 请求
  • php8.3-mysql:PHP 连接 MySQL/MariaDB 的扩展
  • php8.3-gd:图像处理扩展,WordPress 生成缩略图必需
  • php8.3-mbstring:多字节字符串处理,处理中文内容必需
  • php8.3-curl:HTTP 请求库,WordPress 访问外部 API/更新时需要

1.2 安装 MariaDB

bash 复制代码
sudo apt install -y mariadb-server
sudo systemctl enable mariadb --now

命令意图

  • enable --now:同时执行"开机自启"和"立即启动"两个操作

1.3 安全初始化数据库

bash 复制代码
sudo mysql_secure_installation

命令意图:交互式安全配置脚本,依次询问:设置 root 密码、删除匿名用户、禁止 root 远程登录、删除测试数据库。

1.4 创建 WordPress 数据库和用户

sql 复制代码
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;

命令意图

  • CHARACTER SET utf8mb4:支持完整的 UTF-8 字符集(包括 emoji 表情)
  • 'wp_user'@'localhost':限定用户只能从本机连接,提高安全性
  • FLUSH PRIVILEGES:让权限变更立即生效

步骤2:配置 Nginx 虚拟主机

2.1 文件共享配置(已有,仅展示关键部分)

nginx 复制代码
server {
    listen 80;
    server_name file.example.blog 192.168.x.x;  # 域名+IP双匹配

    root /home/user/downloads;

    location / {
        autoindex on;           # 开启目录列表
        autoindex_exact_size off;  # 显示文件大小为KB/MB而非字节
        autoindex_localtime on;    # 显示本地时间而非UTC
        charset utf-8;            # 支持中文文件名显示
    }
}

2.2 WordPress 博客配置(新建)

nginx 复制代码
server {
    listen 80;
    server_name example.blog www.example.blog;

    root /var/www/html/wordpress;
    index index.php index.html index.htm;

    # URL 重写,实现伪静态
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # PHP 请求代理到 FPM
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
    }

    # 禁止访问隐藏文件(安全防护)
    location ~ /\. {
        deny all;
    }

    # 静态资源缓存优化
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        expires max;
        log_not_found off;
    }
}

配置意图

  • try_files $uri $uri/ /index.php?$args:WordPress 伪静态的核心配置。先尝试直接访问文件或目录,都不存在时交给 index.php 处理
  • fastcgi_pass unix:/var/run/php/php8.3-fpm.sock:通过 Unix socket 连接 PHP-FPM,比 TCP 性能更好
  • location ~ /\.:阻止访问 .git.env 等敏感文件
  • expires max:静态资源设置远期过期时间,减少重复请求

2.3 启用配置并重载

bash 复制代码
sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
sudo nginx -t                    # 测试配置文件语法
sudo systemctl reload nginx      # 重载配置(不中断服务)

步骤3:部署 WordPress

3.1 下载并解压

bash 复制代码
cd /tmp
wget https://wordpress.org/wordpress-6.6.tar.gz
sudo tar -xzf /tmp/wordpress-6.6.tar.gz -C /var/www/html/

命令意图:下载 WordPress 6.6 版本(兼容 PHP 8.3),解压到 Nginx 根目录

3.2 设置文件权限

bash 复制代码
sudo chown -R www-data:www-data /var/www/html/wordpress
sudo chmod -R 755 /var/www/html/wordpress

命令意图

  • www-data:Ubuntu 上 Nginx 和 PHP-FPM 的默认运行用户
  • 755:目录和文件所有者可读写执行,其他用户可读可执行

步骤4:配置 wp-config.php

php 复制代码
<?php
define('DB_NAME', 'wordpress');
define('DB_USER', 'wp_user');
define('DB_PASSWORD', 'your_password');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');

$table_prefix = 'wp_';

// 调试配置
define('WP_DEBUG', false);
@ini_set('display_errors', 0);

if (!defined('ABSPATH')) {
    define('ABSPATH', __DIR__ . '/');
}

require_once ABSPATH . 'wp-settings.php';

配置意图

  • WP_DEBUG:设为 false 禁止在前端显示错误
  • @ini_set('display_errors', 0):强制关闭错误输出,@ 符号抑制可能的错误提示

四、问题与应对措施详解

问题1:PHP 版本依赖冲突

现象:

复制代码
php-common : 破坏: php8.1-common 但是 8.1.2-1ubuntu2.23 正要被安装
E: 无法修正错误

原因: 系统中已有的 php-common 包与 php8.1-common 冲突。

应对措施:

bash 复制代码
# 先检查系统中已有的 PHP 相关包
dpkg -l | grep php

# 移除冲突的旧包
sudo apt remove php-common

# 更新软件源后重新安装
sudo apt update
sudo apt install php8.3-fpm

有效性: ✅ 有效
缺陷: 如果系统中有其他应用依赖旧版 PHP,直接移除会导致它们无法运行。


问题2:DNS 解析到错误 IP

现象:

  • http://192.168.x.x 能正常访问
  • http://example.blog 访问失败

原因: 客户端 hosts 文件中 IP 配置错误。

应对措施:

bash 复制代码
# 1. 在服务器上确认实际 IP
ip a | grep "inet " | grep -v 127.0.0.1
# 输出示例:inet 192.168.x.x/24

# 2. 在客户端修正 hosts 文件
# Windows: C:\Windows\System32\drivers\etc\hosts
# Mac/Linux: /etc/hosts
# 添加:
192.168.x.x  example.blog  file.example.blog

# 3. 刷新 DNS 缓存
# Windows: ipconfig /flushdns
# Mac: sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

有效性: ✅ 有效
缺陷: 仅限修改的那台机器生效,局域网其他设备需要各自配置 hosts。


问题3:get_magic_quotes_gpc() 函数未定义

现象:

复制代码
PHP Fatal error: Uncaught Error: Call to undefined function get_magic_quotes_gpc()
in /var/www/html/wordpress/wp-includes/load.php on line 651

原因: 此函数在 PHP 7.4 中被标记为废弃,PHP 8.0 中完全移除。部分 WordPress 版本仍有多处调用。

应对措施:

bash 复制代码
# 方案:下载兼容版本(根本解决方案)
cd /tmp
wget https://wordpress.org/wordpress-6.6.tar.gz
sudo tar -xzf /tmp/wordpress-6.6.tar.gz -C /tmp/
sudo cp -a /tmp/wordpress/wp-admin /var/www/html/wordpress/
sudo cp -a /tmp/wordpress/wp-includes /var/www/html/wordpress/
sudo cp /tmp/wordpress/wp-*.php /var/www/html/wordpress/

有效性: ✅ 彻底解决,WordPress 6.6+ 已适配 PHP 8.x
缺陷: 旧版本 WordPress 站点若存量较大,升级核心文件需提前全量备份。


问题4:数据库表缺失

现象:

复制代码
Table 'wordpress.wp_options' doesn't exist
Table 'wordpress.wp_terms' doesn't exist

原因: 手动清空数据库后安装流程中断,建表不完整。

应对措施:

sql 复制代码
-- 用 WordPress 核心函数重建所有表
-- 执行 wp_install() 前需要运行:
sudo -u www-data php -r "
define('WP_INSTALLING', true);
require_once '/var/www/html/wordpress/wp-load.php';
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
wp_install('我的博客', 'admin_user', 'admin@example.blog', true, null, 'admin_password');
"

有效性: ✅ 有效
缺陷: 依赖 WordPress 自身加载流程,如果依赖的基础表不存在,函数本身也会失败。


问题5:管理员账号不存在

现象:

  • 能进入登录页面
  • 输入账号密码提示用户不存在

原因: 数据库表存在,但 wp_users 表为空。

应对措施:

sql 复制代码
-- 直接用 SQL 创建管理员用户
INSERT INTO wp_users (user_login, user_pass, user_nicename, user_email, user_registered, display_name)
VALUES (
    'admin_user',
    '$2y$10$...',  -- password_hash() 结果
    'admin_user',
    'admin@example.blog',
    NOW(),
    'admin_user'
);

INSERT INTO wp_usermeta (user_id, meta_key, meta_value)
VALUES
    (1, 'wp_capabilities', 'a:1:{s:13:"administrator";b:1;}'),
    (1, 'wp_user_level', '10');

有效性: ✅ 直接有效
缺陷: 需要了解 WordPress 用户元数据的序列化格式,手动拼写容易出错。


问题6:FastCGI 缓冲区溢出

现象:

  • 页面 502 Bad Gateway
  • 错误日志:upstream sent too big header while reading response header from upstream

原因: PHP 输出的大量 Deprecated 警告超出了 Nginx 默认的 FastCGI 缓冲区大小。

应对措施:

bash 复制代码
# 方案1:在 php.ini 中彻底关闭错误输出(治本)
sudo sed -i 's/^display_errors = .*/display_errors = Off/' /etc/php/8.3/fpm/php.ini
sudo sed -i 's/^display_startup_errors = .*/display_startup_errors = Off/' /etc/php/8.3/fpm/php.ini

# 方案2:增大 Nginx 缓冲区(辅助)
echo "fastcgi_buffer_size 128k;" | sudo tee -a /etc/nginx/conf.d/buffers.conf
echo "fastcgi_buffers 4 256k;" | sudo tee -a /etc/nginx/conf.d/buffers.conf
echo "fastcgi_busy_buffers_size 256k;" | sudo tee -a /etc/nginx/conf.d/buffers.conf

# 重启服务
sudo systemctl restart php8.3-fpm
sudo nginx -t && sudo systemctl reload nginx

有效性: ✅ 组合方案有效
缺陷: 单纯关闭 display_errors 而不升级 WordPress 版本,PHP 依然会在后台产生警告。


问题7:登录后仪表盘白屏

现象: 登录成功但页面空白,无报错,F12 无网络请求。

原因: 数据库中设置的主题在 wp-content/themes/ 目录中不存在。

应对措施:

bash 复制代码
# 1. 检查可用主题
ls /var/www/html/wordpress/wp-content/themes/

# 2. 切换到存在的主题
sudo php -r "
\$mysqli = new mysqli('localhost', 'wp_user', 'your_password', 'wordpress');
\$mysqli->query(\"UPDATE wp_options SET option_value = 'twentysixteen' WHERE option_name = 'template'\");
\$mysqli->query(\"UPDATE wp_options SET option_value = 'twentysixteen' WHERE option_name = 'stylesheet'\");
\$mysqli->query(\"UPDATE wp_options SET option_value = 'twentysixteen' WHERE option_name = 'current_theme'\");
echo '已切换主题';
"

有效性: ✅ 有效
缺陷: 需要确认 wp-content/themes/ 中有可用主题。


问题8:WP_DEBUG 重复定义

现象:

复制代码
PHP Warning: Constant WP_DEBUG already defined in wp-config.php on line 19

原因: 调试过程中多次向 wp-config.php 追加了 define('WP_DEBUG', false);

应对措施:

bash 复制代码
# 方案:完整重写配置文件
sudo tee /var/www/html/wordpress/wp-config.php > /dev/null << 'EOF'
<?php
define('DB_NAME', 'wordpress');
define('DB_USER', 'wp_user');
define('DB_PASSWORD', 'your_password');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');
$table_prefix = 'wp_';
define('WP_DEBUG', false);
@ini_set('display_errors', 0);
if (!defined('ABSPATH')) {
    define('ABSPATH', __DIR__ . '/');
}
require_once ABSPATH . 'wp-settings.php';
EOF

有效性: ✅ 有效
缺陷: 完全重写时注意保留 $table_prefix 等自定义配置。


五、最终成功的完整部署方案

bash 复制代码
# 1. 下载兼容 PHP 8.3 的 WordPress 6.6
cd /tmp
wget https://wordpress.org/wordpress-6.6.tar.gz
sudo tar -xzf wordpress-6.6.tar.gz -C /tmp/

# 2. 备份配置文件
sudo cp /var/www/html/wordpress/wp-config.php /tmp/wp-config.php.bak

# 3. 增量更新核心文件(保留 wp-content 和配置)
sudo cp -a /tmp/wordpress/wp-admin /var/www/html/wordpress/
sudo cp -a /tmp/wordpress/wp-includes /var/www/html/wordpress/
sudo cp /tmp/wordpress/wp-*.php /var/www/html/wordpress/

# 4. 恢复配置并关闭调试
sudo cp /tmp/wp-config.php.bak /var/www/html/wordpress/wp-config.php
sudo sed -i "s/define('WP_DEBUG', true);/define('WP_DEBUG', false);/" /var/www/html/wordpress/wp-config.php

# 5. 修复权限
sudo chown -R www-data:www-data /var/www/html/wordpress
sudo chmod -R 755 /var/www/html/wordpress

# 6. PHP 全局关闭错误显示
sudo sed -i 's/^display_errors = .*/display_errors = Off/' /etc/php/8.3/fpm/php.ini

# 7. 重启所有服务
sudo systemctl restart php8.3-fpm
sudo systemctl restart nginx

# 8. 浏览器访问,点击"Update WordPress Database"完成升级

六、经验教训

序号 教训 详细说明
1 版本匹配是基础 部署前确认 WordPress 版本与 PHP 版本的兼容性。PHP 8.3 + WordPress 6.6 是经过验证的稳定组合
2 慎用手动操作数据库 直接 SQL 建表容易遗漏字段和索引,WordPress 的 wp_install() 是更可靠的选择
3 错误日志是定位问题第一手资料 sudo tail -f /var/log/nginx/error.log 是排查 PHP 问题的核心入口
4 增量更新优于全量重装 覆盖核心文件时保留 wp-contentwp-config.php,避免丢失上传内容和配置
5 生产环境务必关闭错误显示 WP_DEBUG=false + php.inidisplay_errors=Off,两者缺一不可
6 hosts 文件是双刃剑 本地调试方便,但也容易因忘记修改而误导排查方向
7 sed -i 操作前先备份 批量替换时极易破坏文件语法结构,大范围正则替换前先备份原文件
8 502 Bad Gateway 不一定是服务挂了 可能只是响应头太大,检查 upstream sent too big header 关键字

七、部署检查清单

  • http://192.168.x.x → 文件共享正常访问
  • http://file.example.blog → 文件共享正常访问
  • http://example.blog → WordPress 博客首页正常显示
  • http://example.blog/wp-admin/ → 后台登录正常
  • sudo tail /var/log/nginx/error.log → 无 PHP Fatal 错误
  • sudo systemctl status nginx php8.3-fpm mariadb → 三个服务均为 active
  • 上传图片测试 → wp-content/uploads 目录有写入权限
  • 固定链接设置为"文章名" → 伪静态正常工作
相关推荐
用户03284722207012 小时前
如何搭建本地yum源(上)
运维
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
网络研究院4 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
treesforest4 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
2601_961845154 天前
粉笔行测题库|系统班|刷题
网络·百度·微信·微信公众平台·facebook·新浪微博