搬瓦工搭建 WordPress 完整教程:域名、数据库、HTTPS 和备份

搬瓦工搭建 WordPress 完整教程:域名、数据库、HTTPS 和备份
搬瓦工运维与建站教程 · 从空白系统到 HTTPS 上线

这篇教程采用一种明确的部署方式:新装 Ubuntu 24.04 LTS + Nginx + PHP 8.3-FPM + MariaDB,不再叠加宝塔、1Panel 或 Docker。已有网站、面板或数据库的机器,不要直接覆盖下面的配置;先在新实例验证,再安排迁移。

示例只配置一个域名 site.example.com。所有出现该域名的位置都要替换为你拥有的真实域名;192.0.2.10 只是保留示例地址。网站标题和管理员密码通过安装页面填写,不在命令里设置公共默认密码。

一、准备系统、域名和回退方式

一套明确的部署方式
已有面板或其他站点时,不直接覆盖配置。

在 KiwiVM 选择适合的系统,确认 SSH 和控制台可以进入。系统重装会覆盖数据,已有内容先看 搬瓦工快照与自动备份教程;系统选择可参考 搬瓦工重装系统教程:Ubuntu / Debian 怎么选。

把域名 A 记录指向 VPS 的 IPv4。IPv6 尚未完成配置时,不要提前添加 AAAA。先用 DNS only 访问源站,后续再接入 CDN,避免一开始同时排查代理、证书和应用。

WordPress 当前建议 PHP 8.3+、MariaDB 10.11+ 或 MySQL 8.0+,并支持 HTTPS。不要因为旧版本还能启动,就继续在生产环境使用已结束维护的软件。插件兼容性也需要在升级前测试。[1]

二、安装基础软件,确认没有端口冲突

下面操作在 VPS 中执行。先按 SSH 密钥与安全设置 保留管理入口,再确认 UFW 或现有防火墙放行真实 SSH 端口。不要为了开网站先关闭整个防火墙。

cat /etc/os-release
sudo ss -lntp
sudo apt update
sudo apt install nginx mariadb-server php8.3-fpm php8.3-mysql \
  php8.3-curl php8.3-gd php8.3-intl php8.3-mbstring \
  php8.3-xml php8.3-zip curl ca-certificates certbot
sudo systemctl status nginx php8.3-fpm mariadb --no-pager

本文只使用 Ubuntu 24.04 的包名。其他版本应核对仓库和 PHP Socket,不要同时装多个来历不同的软件源。Web 服务需要开放 80/443;数据库只做本机连接,不需要放行 3306。

三、创建站点账号、目录和数据库

上线之前的顺序
安装前限制管理访问,避免空白站点被抢先初始化。

在全新部署中创建独立账号;若同名账号或目录已经存在,先停止并核对用途:

sudo adduser --system --group --home /var/www/bwh-site bwhwp
sudo install -d -o bwhwp -g www-data -m 0750 /var/www/bwh-site/public
sudo chown bwhwp:www-data /var/www/bwh-site
sudo chmod 0750 /var/www/bwh-site
sudo install -d -m 0755 /var/www/letsencrypt/.well-known/acme-challenge

进入数据库交互终端,创建仅供该站使用的数据库和账号。下方密码必须先换成独立随机密码;不要照抄占位文本用于生产。

sudo env MYSQL_HISTFILE=/dev/null mariadb
CREATE DATABASE wp_site CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_site'@'localhost' IDENTIFIED BY 'REPLACE_WITH_UNIQUE_RANDOM_PASSWORD';
GRANT ALL PRIVILEGES ON wp_site.* TO 'wp_site'@'localhost';
EXIT;

账号权限限定在站点数据库,不授予全局管理权限。使用密码管理器保存新密码,稍后填入 wp-config.php。数据库和文件两部分都不可缺少。[2]

四、下载 WordPress,并设置 PHP-FPM 独立池

在空的站点目录部署,不覆盖已有网站:

WORK=$(mktemp -d)
curl -fL https://wordpress.org/latest.tar.gz -o "$WORK/wordpress.tar.gz"
sudo tar --no-same-owner -xzf "$WORK/wordpress.tar.gz" \
  --strip-components=1 -C /var/www/bwh-site/public
sudo chown -R bwhwp:www-data /var/www/bwh-site/public
sudo find /var/www/bwh-site/public -type d -exec chmod 0750 {} +
sudo find /var/www/bwh-site/public -type f -exec chmod 0640 {} +
sudo -u bwhwp cp /var/www/bwh-site/public/wp-config-sample.php \
  /var/www/bwh-site/public/wp-config.php
sudo -u bwhwp nano /var/www/bwh-site/public/wp-config.php

把数据库名、用户名、密码和主机名分别设置为 wp_site、wp_site、你的随机密码、localhost。给安全密钥常量填写独立随机值,删除示例占位内容;不要在公开聊天或截图中展示整份文件。保存后执行:

sudo chmod 0600 /var/www/bwh-site/public/wp-config.php

添加 /etc/php/8.3/fpm/pool.d/bwh-site.conf,不要覆盖其他池:

[bwh-site]
user = bwhwp
group = www-data
listen = /run/php/bwh-site.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = ondemand
pm.max_children = 4
pm.process_idle_timeout = 10s
pm.max_requests = 500

这里的 4 个子进程只是低并发起点,不代表固定访问容量。根据实际 PHP 进程内存、数据库占用和峰值再调,不要简单把值开到几十。独立池的用户、Socket 和访问权限应互相对应。[3] 校验后重载:

sudo php-fpm8.3 -t
sudo systemctl reload php8.3-fpm
权限不是全设成 777
文件权限只是防线之一,仍需更新和独立备份。

五、先申请 HTTPS 证书

先建立只提供 ACME 验证的 /etc/nginx/sites-available/bwh-site。此时不开放 WordPress 安装器:

server {
    listen 80;
    server_name site.example.com;
    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
        try_files $uri =404;
    }
    location / { return 404; }
}

在 sites-enabled 建立该文件的链接。仅当确认 default 是新系统不使用的默认站点时,才移除它的启用链接;不要删除其他站点。之后执行:

sudo ln -s /etc/nginx/sites-available/bwh-site /etc/nginx/sites-enabled/bwh-site
sudo nginx -t
sudo systemctl reload nginx
sudo certbot certonly --webroot -w /var/www/letsencrypt -d site.example.com

HTTP-01 验证需要域名正确解析,并能从公网访问 80 端口的验证文件。确认成功签发后再进行下一步。申请失败时先查 DNS、AAAA、80 端口和 Nginx 的实际站点,不要连续重复申请。[4]

六、启用完整 HTTPS 站点

将该站点配置换成包内 configs/bwh-site-https.conf 的内容,并替换域名。关键配置如下:

server {
    listen 80;
    server_name site.example.com;
    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
        try_files $uri =404;
    }
    location / { return 301 https://$host$request_uri; }
}
server {
    listen 443 ssl;
    server_name site.example.com;
    root /var/www/bwh-site/public;
    index index.php index.html;
    ssl_certificate /etc/letsencrypt/live/site.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/site.example.com/privkey.pem;
    client_max_body_size 32m;
    location / { try_files $uri $uri/ /index.php?$args; }
    location = /wp-config.php { deny all; }
    location ~ /\. { deny all; }
    location ~* ^/wp-content/uploads/.*\.php(?:$|/) { deny all; }
    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/bwh-site.sock;
    }
}

FastCGI 把 PHP 请求交给实际 Socket;路径填错通常会出现 502。上传目录的 PHP 拦截需要写在通用 PHP 规则之前。备份、SQL 文件和凭据始终放在站点根目录以外。[5][6]

运行 sudo nginx -t,通过后再 reload。测试 https://真实域名/,完成 WordPress 安装,设置独立管理员用户名和强密码。安装期间可临时仅允许管理出口访问 443,结束后再开放网站访问;不要让空白安装页面长期公开。

七、上线验收与日常维护

完成安装,不等于完成验收
缓存要避开登录、后台和用户私有页面。

测试首页、文章固定链接、后台登录、图片上传和数据库写入,检查证书域名是否正确。若上传仍受限,同时核对 Nginx 与 PHP 的上传大小;只改其中一项不一定有效。

建立证书续期后的 reload hook:将包内 configs/reload-nginx.sh 放到 /etc/letsencrypt/renewal-hooks/deploy/,设为 root 拥有且仅管理员可修改,并赋予执行权限。确认 Certbot 定时任务存在,再运行一次 certbot renew --dry-run。证书签发、磁盘文件更新和 Nginx 正在提供的新证书是三个检查点,不要只看续期日志。[7]

首次上线先使用少量必要插件。启用页面缓存前排除后台、登录用户、购物车和结账等私有内容;后台异常时先检查 PHP-FPM 日志与错误日志,而不是立即增加所有超时。

备份至少包含数据库、wp-content、wp-config.php 和站点配置。数据库导出与文件备份应协调时间,并在独立环境验证恢复。不要只备份 WordPress 核心文件,也不要把唯一备份留在同一块 VPS 磁盘上。

常见问题

1GB 内存可以建站吗?

能否承载取决于插件、数据库和并发,不以“成功安装”推断生产容量。先采用轻量配置并观察实际内存。

可以把目录全部改成 777 解决上传失败吗?

不建议。核对 PHP-FPM 的运行账号、目录属主和具体路径,只给必要目录写权限。

502 先检查什么?

PHP-FPM 是否运行、Socket 是否存在且允许 Nginx 连接,再看 PHP 错误与内存状态。不要先重装整套环境。

相关阅读

参考资料

  1. WordPress:运行环境要求
  2. WordPress:安装流程
  3. PHP-FPM:进程池与监听权限
  4. Let’s Encrypt:HTTP-01 与 DNS-01
  5. Nginx:FastCGI 配置
  6. WordPress:权限、更新与安全
  7. Certbot:证书、续期与 deploy hook

微信订阅号

VPS收割者微信公众号

QQ群(全员禁言)

VPS收割者QQ群(全员禁言)