
文章目录
在宝塔面板上用 LNMP(Linux + Nginx + MySQL + PHP)部署 WordPress,建站向导点几下就能跑起来,但「能打开首页」和「能长期稳定运行」之间差着好几个配置项。这篇按实际部署顺序讲清楚每一处该配什么、配错的症状是什么、以及改之前该留什么退路。

开工前:把环境和现状先记下来
部署前先花三分钟记录现状,这一步在出问题时能省掉大量排查时间。需要记的是:操作系统与版本、Nginx 版本、PHP 版本、MySQL/MariaDB 版本、站点根目录的绝对路径、以及当前是否已存在旧站点(是否有要迁移的数据)。
同时确认两件事:一是磁盘剩余空间,WordPress 本身很小,但媒体文件和备份会持续增长,留出几 GB 余量;二是服务器时间与时区,时间不对会让 SSL 证书校验失败、定时任务错乱,宝塔面板里可以直接同步。
如果是迁移而不是全新部署,先把旧站做一次完整备份并确认能恢复,再在新环境动工。迁移场景下最常见的失败不是技术难度,而是备份没验证过,回滚时发现备份本身是坏的。
网站根目录与运行目录:指向错了会怎样
宝塔创建站点时会指定一个根目录,默认是 /www/wwwroot/域名。这里有两个概念要分清:网站根目录是文件存放的位置,运行目录是 Nginx 实际对外提供服务的子路径。
WordPress 安装在根目录时(index.php 直接位于根),运行目录留空或填「/」。如果把 WordPress 放在了子目录,比如 /www/wwwroot/域名/blog/,那运行目录就要指向 /blog,否则访问域名时 Nginx 找不到可执行的入口文件。
指向错了有三种典型症状,可以对照判断:
| 症状 | 可能原因 | 检查位置 |
|---|---|---|
| 首页 403,且页面显示目录列表 | 运行目录指向了空目录,或没有可索引文件 | 站点设置 → 网站目录 |
| 首页正常,文章页全部 404 | 伪静态规则没生效 | 站点设置 → 伪静态 |
| 前台正常,后台登录跳转后 404 | Nginx 未正确透传路径给 PHP | 站点配置文件 |
另一个容易忽略的项是「防跨站攻击(open_basedir)」。宝塔默认会开启它,把 PHP 能访问的文件范围限制在站点目录内。这个限制本身是好的,但某些插件需要读取站点目录之外的文件(比如系统字体、其他目录的备份),此时会报「open_basedir restriction in effect」。确认插件可信后,可以在站点设置里关闭该限制,或者把需要的路径加进白名单。
还要注意站点目录下是否残留了默认的 index.html。宝塔新建站点常会放一个占位页面,如果 WordPress 文件传上去后首页仍然显示「站点创建成功」,就是把 index.html 排在 index.php 前面被优先解析了,删掉或改名即可。
目录 755 / 文件 644:权限基线怎么落
权限决定了「谁能读、谁能写、谁能执行」,是部署阶段最容易配错、症状又最不像权限问题的一项。基线值很好记:
| 对象 | 推荐值 | 含义 | 配错后的症状 |
|---|---|---|---|
| 目录 | 755 | 属主可读写执行,其他用户可读可执行 | 缺执行位时 WordPress 认为该目录不存在 |
| 普通文件 | 644 | 属主可写,其他用户只读 | 过宽(666/777)会带来写入风险 |
| wp-config.php | 600 或 640 | 只有属主和 Web 用户能读 | 644 时同服务器其他用户可读取数据库口令 |
| 上传目录 | 755(属主正确即可) | 由 PHP 进程写入 | 上传失败、无法生成缩略图 |
批量落到命令行就是下面两条,执行时把路径换成自己的站点根目录:
find /www/wwwroot/你的域名 -type d -exec chmod 755 {} ;
find /www/wwwroot/你的域名 -type f -exec chmod 644 {} ;
顺序是先目录后文件,反过来会把目录也设成 644,导致整个站点打不开。如果已经犯了这个错,重新按上面的顺序执行一遍即可恢复。
权限位的具体含义、为什么目录必须有执行位,以及缺执行位时那些「看起来完全不像权限问题」的症状,在WordPress 目录权限设置里有更细的拆解。
属主与 Web 用户:谁读谁写
权限位只对「属主 / 属组 / 其他」三类身份生效,所以属主设置和权限位同样重要。判断标准很简单:PHP 进程是以哪个用户运行的,站点文件就应该归哪个用户所有。
获取报价
邮箱 + 需求 + 预算区间,24 小时内回复报价。
宝塔环境下通常是 www 用户(有些环境是 nginx 或 php-fpm 各自的运行用户)。可以在站点目录下放一个临时 PHP 文件输出执行用户,或者用 ps 命令查看 php-fpm 进程:
ps aux | grep php-fpm | grep -v grep
# 输出第一列就是 PHP 进程的运行用户
确认后统一属主:
chown -R www:www /www/wwwroot/你的域名
最常见的故障场景是:用 root 账号通过 SSH 上传或解压缩了站点文件,文件属主变成了 root,于是 WordPress 无法写入上传目录、无法自动更新、无法生成缩略图,而前台页面看起来一切正常。这种「只读不写」的状态很迷惑人,排查时第一件事就是看属主。
补充一个容易混淆的点:如果 PHP 进程用户就是文件的属主,那么系统只看属主那一位的权限,此时即使把属组和其他设成 000 也不影响 WordPress 写入。反过来,如果属主是 root 而 PHP 是 www,那么无论如何放宽「其他」权限都不如直接改属主来得干净。
伪静态规则:Nginx 怎么写才不出 404
WordPress 的固定链接依赖重写规则把 /about/ 这类路径交给 index.php 处理。Nginx 不会自动读 .htaccess,规则必须写在站点配置里。宝塔的「伪静态」下拉里可以直接选 wordpress,它会写入下面这段:
location / {
try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
第一行是核心:先尝试按真实文件找,找不到再按目录找,都找不到就交给 index.php 并带上原始参数。第二行保证访问 /wp-admin 时补上尾斜杠,否则后台部分页面会出错。
保存后可以在后台「设置 → 固定链接」点一次保存来刷新规则缓存。判断规则是否生效的方法很直接:把固定链接设成「文章名」,然后打开任意一篇文章,能正常显示就是生效了。
如果文章页 404 而首页正常,按这个顺序查:伪静态规则是否保存成功 → 站点配置文件里 location / 是否被其他规则覆盖 → PHP 解析配置是否正确。宝塔里改完伪静态不需要重启 Nginx,但如果是手工编辑的站点配置文件,需要重载配置才生效。
另外,如果站点启用了 CDN,要注意 CDN 会缓存 301/302 跳转。在跳转规则还没确认稳定前,先不要开启 CDN 的缓存,否则会拿到旧规则产生的跳转,具体的影响和缓解方式见WordPress 接入 CDN。
PHP 版本与扩展:必装清单与参数
WordPress 对 PHP 版本有最低要求,但真正决定「能不能顺畅运行」的是扩展是否齐全。缺扩展时症状各有特点:
| 扩展 | 作用 | 缺失时的症状 |
|---|---|---|
| mysqli 或 pdo_mysql | 连接数据库 | 安装时即报「无法连接数据库」 |
| curl | 外部 HTTP 请求 | 更新检查、API 调用全部超时 |
| mbstring | 多字节字符串处理 | 中文摘要截取异常、部分插件报错 |
| gd 或 imagick | 图片处理 | 无法生成缩略图、无法裁剪 |
| fileinfo | 识别文件类型 | 上传文件被拒绝、媒体类型判断失败 |
| zip | 压缩包处理 | 无法在线更新核心与插件 |
| intl | 国际化 | 部分多语言插件报错 |
| opcache | 字节码缓存 | 不装也能跑,但性能明显偏低 |
PHP 参数同样要在宝塔的「PHP 设置」里调,几项常见的:
memory_limit = 256M ; 站点较大或插件较多时建议 256M 起
max_execution_time = 300 ; 备份、导入、大图处理需要
upload_max_filesize = 64M ; 决定单文件最大可上传体积
post_max_size = 64M ; 需 ≥ upload_max_filesize
max_input_vars = 3000 ; 菜单项多、表单字段多时容易触顶
改完参数需要重载 PHP 服务才生效。宝塔在 PHP 设置页面改完会有提示按钮,如果用命令行,对应的是重载 php-fpm。
关于版本选择:WordPress 核心对新版 PHP 兼容性良好,新版 PHP 通常也带来性能提升。但换版本前要确认所用的商业主题和插件声明支持该版本,跨度大的升级(比如从 7.4 跳到 8.x)容易遇到废弃函数报错。稳妥做法是先在测试环境升,跑一遍站点健康和主要页面再上生产。
数据库与 wp-config.php 的关键项
建库时注意字符集选 utf8mb4,排序规则用 utf8mb4_general_ci 或 utf8mb4_unicode_ci。utf8mb4 才能存下 emoji 和部分生僻字,选成 utf8 会出现「Incorrect string value」这类插入失败。
wp-config.php 是站点的核心配置文件,部署阶段值得检查这几项:
// 调试开关:排错时开,正式站点保持关闭
define( 'WP_DEBUG', false );
// 关闭后台的主题与插件文件编辑器,减少误操作与攻击面
define( 'DISALLOW_FILE_EDIT', true );
// 站点地址:迁移或换域名时临时用这两个常量救急
define( 'WP_HOME', 'https://你的域名' );
define( 'WP_SITEURL', 'https://你的域名' );
// 强制直接写文件,避免部分环境下更新时反复弹 FTP 凭据
define( 'FS_METHOD', 'direct' );
WP_DEBUG 在排错时打开能看到具体报错,但正式站点长期开着会把服务器路径等信息暴露在页面上,排查完务必关掉。FS_METHOD 设为 direct 的前提是文件属主正确,否则反而会让更新失败。
密钥(AUTH_KEY 等八项)建议每次全新安装都重新生成,不要用别人示例里的值。可以在官方密钥生成服务上取,或者用 wp-cli 的 rewrite 命令。
SSL 证书与强制跳转
宝塔里申请 Let’s Encrypt 证书只需在站点设置的 SSL 页面选择「Let’s Encrypt」并勾选域名,验证方式用文件验证最简单(要求域名已解析到本机且 80 端口可访问)。
申请到证书后打开「强制 HTTPS」。这里有个常见坑:开启强制跳转后,如果站点内部仍有 http 的资源地址,浏览器会拦截混合内容,表现为页面能打开但图片或样式不加载。处理办法是把数据库里的旧 http 地址批量替换成 https,并检查主题里硬编码的 http 资源。
证书到期前宝塔会自动续签,前提是文件验证路径没被规则拦住。如果用 Nginx 把 /.well-known/ 也做了跳转或鉴权,续签会失败。判断方法很简单:手动访问一次 /.well-known/acme-challenge/ 下的验证文件,能读到内容就说明通道是通的。证书链与跳转的完整配置方式见WordPress HTTPS 配置。
部署完成后按这个顺序验证
部署不是「首页能打开」就结束了。按下面顺序逐项确认,任何一项不通过就在这一步停下来,不要继续往下配:
- 前台首页返回 200,且显示的是 WordPress 内容而不是宝塔的占位页。
- 后台 /wp-admin 能登录,登录后不出现跳转循环。
- 把固定链接改成「文章名」,打开任意一篇文章确认不是 404。
- 上传一张图片,确认能生成缩略图(这一步同时验证属主、权限和图片扩展)。
- 在后台「工具 → 站点健康」里看一遍状态标签,处理掉所有「关键」项。
- 提交一次站点上的表单,确认邮件能发出(验证 mail 函数或 SMTP 配置)。
- 检查「设置 → 阅读」里「建议搜索引擎不索引本站点」是否处于未勾选状态。
- 确认 sitemap 可访问,robots.txt 内容符合预期。
- 做一次完整备份(文件 + 数据库),确认备份文件存在且大小合理。
- 把备份恢复流程在测试环境演练一遍,验证备份真的能用。
第 7 项尤其容易被漏掉,它的后果也最严重:勾选后整站输出 noindex,搜索引擎会放弃收录,而页面看起来完全正常。上线前建议照着上线前检查清单逐条过一遍。
常见问题
宝塔部署 WordPress 通常需要多久?
纯环境搭建加上 WordPress 安装,熟悉流程的话半小时以内能完成。如果需要数据迁移、主题定制或多站点配置,通常按天计,取决于内容量和是否有二次开发。
可以完全自己动手吗?
有 Linux 基础可以按上面的顺序操作。但生产站点建议先在测试环境完整走一遍,因为权限、伪静态、证书这几项的失误会让站点直接不可用,而排查时往往要反复修改配置。
做之前必须先备份吗?
必须,而且备份要覆盖文件与数据库两部分。更重要的是确认能恢复——只备份不演练,等于把风险留在恢复的那一刻才发现。
迁移后前台样式全丢了,是什么原因?
多半是站点地址没同步更新。迁移换域名后,数据库里仍存着旧地址。用 WP_HOME / WP_SITEURL 两个常量临时指定新地址,登录后进入后台保存一次固定链接,再用搜索替换工具把库里的旧域名批量换掉。
需要专业团队?
如果希望有人帮你把环境、权限、证书和上线检查一次做对,我们的部署服务覆盖从服务器配置到上线验证的完整链路,交付时附带配置说明,便于后续自行维护。
更多 WordPress 技术文章,见技术文章栏目。
