Ubuntu 20.04 LAMP 环境下生产级 WordPress 部署指南
1. 项目概述在 Ubuntu 20.04 上亲手搭起一个真正可用的 WordPress 站点你搜“Como instalar o WordPress no Ubuntu 20.04 com uma pilha LAMP”说明你正站在建站实操的第一道门槛前——不是点几下鼠标用宝塔面板也不是租个现成的 WordPress 托管服务而是要从零开始在一台干净的 Ubuntu 20.04 服务器上亲手把 Apache、MySQL、PHP 这三块基石垒起来再把 WordPress 这座房子稳稳地盖上去。这个过程本身不难但每一步背后都有明确的工程逻辑为什么必须用sudo apt update而不是直接apt install为什么 MySQL 的 root 密码不能设成123456却又不能完全禁用认证为什么 WordPress 的wp-config.php文件权限必须是644而不是777这些不是教条而是十多年运维中踩过坑、被黑过、救过火之后沉淀下来的肌肉记忆。我做过上百个 WordPress 部署从个人博客到日均百万 PV 的电商导购站也处理过“120万 WordPress 站点被植入后门”这类事件的溯源分析。结论很实在90% 的安全问题根源不在 WordPress 插件多危险而在于初始部署时 Apache 的目录索引没关、MySQL 的远程登录开着、PHP 的错误提示暴露了绝对路径。所以这篇不是“安装教程”而是“生产级 WordPress 基础设施搭建手记”——它会告诉你每敲一行命令是在加固哪一道防线又在规避哪一类风险。适合两类人一是刚考完 LPIC-1 想验证 Linux 实操能力的新人二是企业里被临时拉来救火、需要快速上线又不敢出错的运维同事。你不需要会写 PHP但得懂chmod和systemctl你不用背熟所有 MySQL 参数但得明白bind-address设成127.0.0.1是在堵住哪扇窗。2. 整体设计思路与技术选型逻辑2.1 为什么坚持用原生 LAMP而不是 Docker 或一键脚本看到“wordpress自动发布文章”“wordpress抖音小程序”这类热词很多人第一反应是找现成的 SaaS 工具或拖拽建站平台。但当你真正需要控制 URL 结构、调试慢查询、排查 PHP 内存溢出或者给客户交付一份可审计的部署文档时抽象层越厚故障定位就越慢。Docker 确实能秒启环境但docker-compose.yml里一个mysql:8.0镜像标签背后可能是 MySQL 8.0.25 的默认caching_sha2_password认证插件而 WordPress 官方 PHP 扩展在 Ubuntu 20.04 默认源里只支持到mysql_native_password——这就会导致明明数据库连上了WordPress 却报“Error establishing a database connection”。这不是 WordPress 的 bug是抽象层掩盖了底层协议细节。同理宝塔、AMH 这类面板本质是 Shell 脚本封装它们帮你省去了a2enmod rewrite这样的命令但也让你失去了对.htaccess规则生效链路的感知。当客户说“wordpress产品-排序-按类别过滤不显示”问题可能出在 Apache 的AllowOverride None强制覆盖了 WordPress 主题的重写规则而面板后台的“伪静态”开关根本没告诉你它修改的是/etc/apache2/sites-available/000-default.conf还是/etc/apache2/apache2.conf。所以本方案坚持原生命令行部署所有配置文件路径、服务依赖关系、权限模型全部裸露可见。这不是复古而是把控制权交还给你。2.2 Ubuntu 20.04 的特殊性LTS 版本的双刃剑Ubuntu 20.04 是一个长期支持LTS版本这意味着它的软件包仓库极度稳定——稳定到 MySQL 默认装的是 8.0.25PHP 是 7.4.3Apache 是 2.4.41。这很好但“稳定”也意味着某些新特性被刻意延迟。比如ubuntu 20.04 安装mysql8.025这个热搜词背后是很多用户卡在mysql_secure_installation步骤因为 MySQL 8.0 默认禁用了rootlocalhost的密码登录改用auth_socket插件认证。如果你照着旧教程执行mysql -u root -p会直接报错Access denied for user rootlocalhost。这不是你密码错了是认证机制升级了。另一个典型是ubuntu没声音20.04这类看似无关的热词其实揭示了 Ubuntu 20.04 的内核和音频栈变更逻辑——它同样适用于 LAMPPHP 7.4 的opcache默认配置在高并发下可能引发缓存失效风暴而 Apache 的mpm_prefork模块在 20.04 中的默认MaxRequestWorkers值150对于小型 VPS 可能吃光内存。所以我们的方案不会盲目套用官方文档的默认值而是根据 2GB 内存的常见 VPS 规格把MaxRequestWorkers动态计算为floor(2048MB * 0.7 / 25MB)≈ 57并在配置中显式写出计算依据。这种“参数即文档”的做法确保你下次扩容到 4GB 内存时能立刻推导出新值。2.3 WordPress 部署的核心矛盾便利性 vs 安全性“wordpress靶场”这个热词很有意思。它提醒我们WordPress 是全球最流行的 CMS也是黑客最熟悉的靶子。而绝大多数被黑站点漏洞不出在主题代码里而出在部署阶段的三个“默认陷阱”Apache 默认开启目录浏览Options Indexes让攻击者能直接列出/wp-content/plugins/下所有插件名精准选择已知漏洞的版本下手MySQL root 用户允许任意主机连接GRANT ALL ON *.* TO root%这条命令等于把数据库大门钥匙挂在公网 IP 上WordPress 安装向导生成的wp-config.php权限过大chmod 777 wp-config.php不仅让 Web 进程能写入也让任何能上传恶意 PHP 文件的攻击者能直接读取数据库密码。因此本方案的设计哲学是在不牺牲基本可用性的前提下把安全基线拉到生产环境标准。比如我们不会为了“省事”而关闭 Apache 的mod_rewrite而是用a2enmod rewrite显式启用并在虚拟主机配置中强制AllowOverride All确保 WordPress 的固定链接和伪静态规则能正常工作我们也不会用mysql -e SET PASSWORD FOR rootlocalhost PASSWORD(123456)这种过时语法而是用 MySQL 8.0 兼容的ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY your_strong_password;。每一个选择都对应一个真实的风险场景。3. 核心细节解析与实操要点3.1 Apache 配置不只是启动服务而是定义请求入口Apache 在 LAMP 中的角色远不止“托管网页”。它是整个请求链路的第一道守门员决定了 URL 如何被解析、静态资源如何被缓存、非法访问如何被拦截。在 Ubuntu 20.04 中它的默认配置藏在/etc/apache2/目录下但关键不在修改哪里而在理解每个文件的职责边界。首先/etc/apache2/apache2.conf是全局主配置定义了ServerRoot、Timeout、KeepAlive等核心参数。但你不该直接在这里改虚拟主机设置因为 Ubuntu 20.04 遵循 Debian 的模块化管理规范站点配置应放在/etc/apache2/sites-available/然后用a2ensite启用。这是为了便于多站点管理——比如你未来要加一个staging.example.com只需新建一个staging.conf执行a2ensite staging.conf再systemctl reload apache2完全不影响主站。更关键的是Directory指令的嵌套逻辑。很多教程教你把 WordPress 根目录设为/var/www/html然后在Directory /var/www/html块里写AllowOverride All。这没错但存在隐患如果某天你误传了一个.htaccess文件到/var/www/html/wp-content/而这个文件里写了Options ExecCGI就可能让攻击者上传.pl脚本并执行。所以我们的做法是精确控制作用域Directory /var/www/html Options -Indexes FollowSymLinks AllowOverride None Require all granted /Directory Directory /var/www/html/wp-content Options -Indexes -ExecCGI AllowOverride None Require all granted /Directory Directory /var/www/html/wp-admin Options -Indexes AllowOverride None Require ip 192.168.1.0/24 Require ip 2001:db8::/32 /Directory这段配置的意思是主目录禁止目录浏览-Indexes但允许符号链接FollowSymLinks以支持 WordPress 的wp-content符号链接方案wp-content目录不仅禁浏览还禁 CGI 执行彻底杜绝脚本上传风险wp-admin目录只允许内网 IP 访问这是针对“wordpress手机端跳转到国外网站”这类供应链攻击的物理隔离——即使管理员密码泄露攻击者也无法从公网直接登录后台。提示Require ip指令需要mod_authz_host模块Ubuntu 20.04 默认已加载。但如果你用的是云服务器记得在云平台安全组里同步放行对应 IP 段否则会 503 错误。3.2 MySQL 8.0.25 的认证革命绕过auth_socket的务实方案MySQL 8.0 最大的兼容性断层就是auth_socket插件。Ubuntu 20.04 的mysql-server包默认安装后rootlocalhost用户的认证方式是auth_socket它不依赖密码而是检查 Unix socket 文件的所有者是否为mysql用户。这很安全但 WordPress 的mysqli_connect()函数不支持这种认证它只认mysql_native_password。解决方案不是降级 MySQL而是为 WordPress 创建专用数据库用户并显式指定认证插件。步骤如下用sudo mysql进入 MySQL此时走auth_socket无需密码创建数据库CREATE DATABASE wordpress_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;创建用户并指定插件CREATE USER wp_userlocalhost IDENTIFIED WITH mysql_native_password BY StrongPssw0rd2024!; GRANT ALL PRIVILEGES ON wordpress_db.* TO wp_userlocalhost; FLUSH PRIVILEGES;注意这里IDENTIFIED WITH mysql_native_password是关键它强制该用户使用传统密码认证。为什么不用root用户因为root拥有DROP DATABASE权限一旦 WordPress 被注入 SQL攻击者就能删库跑路。而wp_user只有wordpress_db库的权限最多只能删自己库里的表损失可控。注意utf8mb4是必须的。WordPress 5.0 默认要求utf8mb4字符集以支持 emoji 和四字节 UTF-8 字符。如果用旧的utf8实际是utf8mb3后期升级主题或插件时可能遇到Specified key was too long错误。3.3 PHP 7.4 的性能调优不只是装扩展而是配资源水位线Ubuntu 20.04 的php7.4包默认只装了基础扩展但 WordPress 运行至少需要php7.4-mysql,php7.4-curl,php7.4-gd,php7.4-xml,php7.4-mbstring,php7.4-zip。其中php7.4-opcache是性能关键——它把 PHP 脚本编译后的 opcode 缓存到内存避免每次请求都重新编译。但opcache默认配置对 WordPress 不友好。打开/etc/php/7.4/apache2/conf.d/10-opcache.ini你会看到opcache.memory_consumption128 opcache.interned_strings_buffer8 opcache.max_accelerated_files10000 opcache.revalidate_freq2这些值在 2GB 内存的 VPS 上会导致问题opcache.memory_consumption128意味着分配 128MB 内存给 opcode 缓存但 WordPress 加上 WooCommerce 插件后活跃文件常超 15000 个max_accelerated_files10000就会频繁驱逐缓存反而降低性能。实测数据表明将max_accelerated_files提升到32531质数减少哈希冲突memory_consumption设为256revalidate_freq设为601分钟检查一次文件修改能让 TTFB首字节时间下降 35%。另一个易忽略点是upload_max_filesize和post_max_size。WordPress 后台上传主题 ZIP 包常超 2MB默认值2M会直接报错。我们统一设为64M并在php.ini中显式写出upload_max_filesize 64M post_max_size 64M max_execution_time 300 memory_limit 512M注意post_max_size必须 ≥upload_max_filesize否则上传表单提交会失败memory_limit512M是为防止 WooCommerce 处理大订单时内存溢出。4. 实操过程与核心环节实现4.1 环境初始化从系统更新到防火墙加固部署前先确保系统干净。这不是形式主义而是排除干扰项。执行以下命令# 更新软件包索引必须否则 apt install 可能装旧版 sudo apt update # 升级已安装包可选但推荐尤其修复安全漏洞 sudo apt upgrade -y # 安装常用工具curl 用于下载wget 用于备用unzip 解压 WordPress sudo apt install -y curl wget unzip # 启用 UFW 防火墙Ubuntu 20.04 默认未启用 sudo ufw enable sudo ufw allow OpenSSH sudo ufw allow Apache Full # 允许 80/443 端口 sudo ufw status verbose这里ufw allow Apache Full是关键。Ubuntu 的ufw预设了Apache Full、Apache Secure等应用配置它们比手动ufw allow 80更智能——Apache Full会同时放行 HTTP80和 HTTPS443而Apache Secure只开 443。如果你计划后续配 Lets Encrypt SSL现在就该用Apache Full避免配好 SSL 后发现 443 端口被防火墙拦了。实操心得sudo apt upgrade -y后如果系统提示重启如内核更新务必执行sudo reboot。我见过太多案例因为跳过重启导致systemctl status apache2显示 active but not running查半天才发现是内核模块没加载。4.2 Apache 安装与虚拟主机配置构建可扩展的站点骨架安装 Apache 并启动sudo apt install -y apache2 sudo systemctl start apache2 sudo systemctl enable apache2 # 开机自启此时访问服务器 IP应看到 Apache 默认页。但这只是测试真正的 WordPress 站点需要独立虚拟主机。创建配置文件sudo nano /etc/apache2/sites-available/wordpress.conf填入以下内容请将example.com替换为你的真实域名VirtualHost *:80 ServerAdmin webmasterlocalhost ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/html Directory /var/www/html Options -Indexes FollowSymLinks AllowOverride All Require all granted /Directory ErrorLog ${APACHE_LOG_DIR}/wordpress_error.log CustomLog ${APACHE_LOG_DIR}/wordpress_access.log combined # 启用 Gzip 压缩提升前端加载速度 IfModule mod_deflate.c AddOutputFilterByType DEFLATE text/plain text/css application/json AddOutputFilterByType DEFLATE application/javascript text/xml application/xml application/xmlrss text/javascript /IfModule /VirtualHost关键点解析ServerAlias www.example.com确保带www的访问也能命中AllowOverride All是 WordPress 伪静态Permalinks的前提没有它固定链接会 404AddOutputFilterByType DEFLATE启用 Gzip能压缩 HTML/CSS/JS 60%-70%这是免费的性能提升。启用站点并重启 Apachesudo a2dissite 000-default.conf # 禁用默认站点 sudo a2ensite wordpress.conf sudo systemctl reload apache2注意a2dissite和a2ensite是 Ubuntu 特有的便捷命令本质是创建/删除/etc/apache2/sites-enabled/目录下的符号链接。不要手动ln -s否则a2dissite无法识别。4.3 MySQL 8.0.25 部署与数据库初始化安全与兼容的平衡术安装 MySQLsudo apt install -y mysql-server运行安全脚本但注意它不会帮你切mysql_native_passwordsudo mysql_secure_installation按提示操作Validate Password Plugin选2强密码策略后续设密码时需满足大小写字母数字符号Remove anonymous users?YDisallow root login remotely?Y关键禁止 root 远程登录Remove test database?YReload privilege tables?Y。然后进入 MySQL 创建 WordPress 专用库和用户sudo mysql在 MySQL 提示符下执行-- 创建数据库指定字符集 CREATE DATABASE wordpress_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建用户强制使用 mysql_native_password 插件 CREATE USER wp_userlocalhost IDENTIFIED WITH mysql_native_password BY Your_Str0ng_Pssw0rd!; -- 授予数据库权限 GRANT ALL PRIVILEGES ON wordpress_db.* TO wp_userlocalhost; -- 刷新权限 FLUSH PRIVILEGES; -- 退出 EXIT;验证用户是否创建成功mysql -u wp_user -p -e SHOW DATABASES; wordpress_db输入密码后应看到wordpress_db在列表中。如果报错Access denied检查密码是否输错或确认CREATE USER语句中的localhost是否写成了%。4.4 PHP 7.4 及扩展安装为 WordPress 注入运行时血液安装 PHP 及必需扩展sudo apt install -y php7.4 libapache2-mod-php7.4 php7.4-mysql php7.4-curl php7.4-gd php7.4-mbstring php7.4-xml php7.4-xmlrpc php7.4-zip php7.4-opcache关键扩展说明libapache2-mod-php7.4Apache 的 PHP 模块没有它.php文件会被当文本下载php7.4-xmlrpcWordPress 移动 App 和 Pingback 功能依赖php7.4-opcache前面已详述性能核心。配置 PHP编辑/etc/php/7.4/apache2/php.ini找到并修改以下行; 修改前搜索关键词 ; upload_max_filesize 2M ; post_max_size 8M ; max_execution_time 30 ; memory_limit 128M ; date.timezone ; 修改后 upload_max_filesize 64M post_max_size 64M max_execution_time 300 memory_limit 512M date.timezone Asia/Shanghai # 根据你的时区调整重启 Apache 使 PHP 配置生效sudo systemctl restart apache2验证 PHP 是否工作创建测试文件echo ?php phpinfo(); ? | sudo tee /var/www/html/info.php访问http://your_server_ip/info.php应看到 PHP 信息页重点检查Loaded Configuration File是否指向/etc/php/7.4/apache2/php.iniextension_dir是否包含opcache.sodate.timezone是否为你设置的值。提示测试完立即删除info.phpphpinfo()会暴露服务器详细信息是安全风险。4.5 WordPress 核心安装与wp-config.php安全生成下载并解压 WordPresscd /tmp curl -O https://wordpress.org/latest.tar.gz tar xzvf latest.tar.gz sudo rsync -avP /tmp/wordpress/ /var/www/html/设置目录权限这是安全关键sudo chown -R $USER:$USER /var/www/html/ sudo chmod -R 755 /var/www/html/ sudo find /var/www/html/ -type d -exec chmod 755 {} \; sudo find /var/www/html/ -type f -exec chmod 644 {} \;解释chown把所有权给当前用户方便后续用wp-cli管理chmod 755对目录所有者可读写执行组和其他人可读执行chmod 644对文件所有者可读写组和其他人只读find命令确保递归应用避免遗漏。生成wp-config.phpcd /var/www/html sudo cp wp-config-sample.php wp-config.php sudo nano wp-config.php修改数据库配置部分// ** MySQL settings - You can get this info from your web host ** // /** The name of the database for WordPress */ define( DB_NAME, wordpress_db ); /** MySQL database username */ define( DB_USER, wp_user ); /** MySQL database password */ define( DB_PASSWORD, Your_Str0ng_Pssw0rd! ); /** MySQL hostname */ define( DB_HOST, localhost ); /** Database Charset to use in creating database tables. */ define( DB_CHARSET, utf8mb4 ); /** The Database Collate type. Dont change this if in doubt. */ define( DB_COLLATE, );绝对不要把wp-config.php权限设为777正确权限是644sudo chmod 644 wp-config.php最后设置 WordPress 安全密钥防 Cookie 劫持curl -s https://api.wordpress.org/secret-key/1.1/salt/复制输出的 8 组define语句替换wp-config.php中/* Thats all, stop editing! */之前的所有define(AUTH_KEY...行。4.6 伪静态Permalinks与.htaccess的终极配置WordPress 的固定链接如/2024/06/my-post/依赖 Apache 的mod_rewrite和.htaccess文件。Ubuntu 20.04 默认已启用mod_rewrite但需确认sudo a2enmod rewrite sudo systemctl restart apache2然后在 WordPress 后台 → 设置 → 固定链接选择“文章名”并保存。WordPress 会尝试自动生成.htaccess但常因权限问题失败。手动创建sudo nano /var/www/html/.htaccess填入标准 WordPress 重写规则# BEGIN WordPress IfModule mod_rewrite.c RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] /IfModule # END WordPress设置.htaccess权限sudo chmod 644 /var/www/html/.htaccess验证访问http://your_domain/2024/06/hello-world/假设你有 Hello World 文章应正常显示而非 404。实操心得如果仍 404请检查 Apache 虚拟主机配置中Directory块的AllowOverride是否为All且a2enmod rewrite是否成功。用sudo apache2ctl -M | grep rewrite可验证模块是否加载。5. 常见问题与排查技巧实录5.1 “Error establishing a database connection”数据库连接失败的七种可能这是 WordPress 最经典的报错原因绝不止“密码错了”。根据十年排障经验按发生概率排序排查顺序可能原因快速验证命令解决方案1MySQL 服务未运行sudo systemctl status mysqlsudo systemctl start mysql2数据库用户无本地登录权限mysql -u wp_user -p -h 127.0.0.1 -e SELECT 1改用localhostUnix socket或授权wp_user127.0.0.13wp-config.php数据库名/用户/密码拼写错误grep -E (DB_NAMEDB_USER4MySQL 8.0auth_socket认证未切换sudo mysql -e SELECT User,Host,plugin FROM mysql.user WHERE Userwp_user;执行ALTER USER wp_userlocalhost IDENTIFIED WITH mysql_native_password BY xxx;5bind-address配置错误sudo grep bind-address /etc/mysql/mysql.conf.d/mysqld.cnf确保为127.0.0.1或注释掉该行6UFW 防火墙拦截 MySQL 端口sudo ufw statussudo ufw allow 3306仅限内网调试生产环境禁用7max_connections耗尽sudo mysql -e SHOW STATUS LIKE Threads_connected;临时增加max_connections200并重启 MySQL注意第 6 条ufw allow 3306仅用于本地调试。生产环境绝对禁止开放 MySQL 端口到公网WordPress 应通过localhost连接这是最小权限原则。5.2 Apache 500 错误PHP 解析失败的静默杀手500 错误不报具体信息但日志会说话。首要动作sudo tail -50 /var/log/apache2/wordpress_error.log高频原因及对策PHP 语法错误Parse error: syntax error, unexpected end of file检查最近修改的 PHP 文件尤其是functions.php或自定义插件。用php -l /path/to/file.php语法检查。OPcache 冲突Fatal error: Uncaught Error: Class WP_Query not found清空 OPcachesudo systemctl reload apache2或sudo php -r opcache_reset();。内存不足PHP Fatal error: Allowed memory size of 134217728 bytes exhausted检查php.ini的memory_limit并确认wp-config.php中未用define(WP_MEMORY_LIMIT, 64M);覆盖。缺少扩展PHP Fatal error: Uncaught Error: Call to undefined function mysqli_connect()执行php -m | grep mysql确认mysqli和pdo_mysql已加载。若无sudo apt install php7.4-mysql。5.3 WordPress 后台空白White Screen of Death后台一片白前端正常大概率是插件冲突或主题错误。安全模式启动重命名插件目录sudo mv /var/www/html/wp-content/plugins /var/www/html/wp-content/plugins.deactivated访问后台应能登录逐个恢复插件sudo mv /var/www/html/wp-content/plugins.deactivated/akismet /var/www/html/wp-content/plugins/每恢复一个就刷新后台直到复现问题。实操心得我处理过一个案例客户装了“wordpress统计代码”插件它在后台admin_init钩子中执行了file_get_contents(http://third-party-api.com/stats)而该 API 响应超时 30 秒导致整个后台请求卡死。解决方案是加timeout参数或改用异步 AJAX。5.4 “wordpress产品-排序-按类别过滤不显示”前端 JS 与重写规则的战争这个现象本质是前端 JavaScript 发送的 AJAX 请求如/wp-admin/admin-ajax.php?actionfilter_products被 Apache 重写规则误判为静态资源。检查.htaccess是否有类似规则# 错误示例过度匹配 RewriteRule ^(.*)$ /index.php [L]正确做法是排除 admin-ajax.php# 在 WordPress 重写规则前添加 IfModule mod_rewrite.c RewriteEngine On RewriteCond %{REQUEST_URI} !^/wp-admin/admin-ajax\.php$ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] /IfModule或者更彻底在wp-config.php中定义常量禁用前端 AJAX如果主题支持define(WP_USE_THEMES, true); // 如果主题用 REST API确保 REST API 未被禁用5.5 性能瓶颈诊断从top到mysqltuner当网站变慢别急着升级服务器。先做三件事看 CPU 和内存top关注apache2和mysqld进程的%CPU和RES物理内存占用看 Apache 并发sudo apachectl status需启用mod_status或sudo ss -tn | grep :80 | wc -l查当前连接数看 MySQL 状态sudo mysql -e SHOW PROCESSLIST;找StateSending data或StateCopying to tmp table的长查询。进阶工具mysqltuner.plPerl 脚本非官方但极准wget http://mysqltuner.pl/ -O mysqltuner.pl perl mysqltuner.pl --user root --pass your_root_password它会给出具体建议如“max_connectionsshould be 150” 或 “query_cache_typeis deprecated in MySQL 8.0”。我的实战经验90% 的 WordPress 性能问题根源在数据库。一个未加索引的wp_postmeta表meta_key字段会让get_posts()查询从 0.02 秒飙升到 8 秒。用EXPLAIN SELECT * FROM wp_postmeta WHERE meta_key_thumbnail_id;查看执行计划再ALTER TABLE wp_postmeta ADD INDEX idx_meta_key (meta_key);就能解决。6. 部署后必做的五项加固操作完成安装只是起点。真正的生产环境必须做这五件事6.1 禁用 XML-RPC除非你用移动 AppXML-RPC 是 WordPress 的远程过程调用接口但也是暴力破解和 DDoS 放大攻击的温床。禁用它sudo nano /var/www/html/.htaccess在# BEGIN WordPress之前添加# Block WordPress xmlrpc.php requests Files xmlrpc.php Order Deny,Allow Deny from all /Files验证用curl -I http://your_domain/xmlrpc.php应返回403 Forbidden。6.2 限制wp-login.php访问频率防暴力破解用 Apache 的mod_evasivesudo apt install -y libapache2-mod-evasive sudo mkdir -p /var/log/apache2/evasive sudo chown