Saber 酱的抱枕

Fly me to the moon

07/6
2025
软件

在 VPS 上搭建 WordPress 博客的简单教程

最近我想把网站服务器换成更便宜的 VPS,今天折腾了一下,写篇文章分享一下。

购买服务器

如果你对云服务器、VPS 没什么了解,可以看看我之前发的文章:
我的博客服务器

我现在的博客服务器厂商是 Vultr,1 CPU 1 GB 内存,每月 5 美元,一年 60 美元。今天我买了 RackNerd 的 VPS,配置翻倍了,每年 18 美元,一年可以省 300 块钱(本文非推广)。我想用这个 VPS 测试一番,可以的话就换到这个 VPS 上。

云服务器可以在购买时选择预装了 WordPress 的系统,但是 VPS 就得自己手动安装了。借着换服务器的机会,我也写篇文章讲下搭建一个 WordPress 博客的步骤吧。

在购买服务器时,默认的操作系统都是 Linux 系统(因为 Windows 要加钱),我选择的是 Debian 12。购买成功后,主机商会通过邮件把 root 密码发给你,你可以使用 SSH 客户端(如 MobaXterm)登录到服务器。

Linux 服务器的操作需要使用命令行,如果有不懂的地方就问 AI 吧,很方便。下面的内容我也都是问 AI 的。

配置新系统

查看系统版本

lsb_release -a

输出如下:

Distributor ID: Debian
Description:    Debian GNU/Linux 12 (bookworm)
Release:        12
Codename:       bookworm

更新软件包

apt update
apt upgrade

执行完毕后,再执行 reboot 重启系统。

修改主机名

默认的主机名是随机的,我要修改成自定义的主机名。

sudo hostnamectl set-hostname saber

该设置立即生效,不过 shell 里的提示没有立即变化,在重新登入后才会变成新的。

修改 SSH 端口

编辑配置文件:nano /etc/ssh/sshd_config

把原本的 #Port 22 取消注释,改为 Port 2222,保存退出。

重启 SSH 服务:systemctl restart ssh

之后退出当前会话,修改端口号,重新登入。

使用私钥登录

我已经在本机创建了一对密钥。

在远程主机上编辑配置文件:

cd ~/.ssh
nano ~/.ssh/authorized_keys

复制公钥的内容,粘贴进来保存。

然后设置权限:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

编辑配置文件:nano /etc/ssh/sshd_config

在文件的中部,有一行已启用的 PasswordAuthentication yes,把 yes 改为 no

然后新增一行:PubkeyAuthentication yes

这样会禁止使用密码登录,并要求公钥认证。

重启 SSH 服务:systemctl restart ssh

在 SSH 客户端里(我的是 MobaXterm)里勾选私钥登录,选择对应的私钥文件,并重新登录。

使用 ufw 配置防火墙

apt install ufw
# 允许端口:
# 2222 是修改后的 SSH 登录端口,请根据实际情况自行修改
ufw allow 2222/tcp
ufw allow 80/tcp
ufw allow 443/tcp
# 拒绝其他入站连接:
ufw default deny incoming
ufw default allow outgoing
#启用防火墙:
ufw enable

配置网站运行环境

如果你打算使用域名来访问网站,可以先注册一个域名,并将其解析到服务器的 IP。

安装 PHP

安装 PHP 和 PHP-FPM:
apt install php php-fpm

安装常用的 PHP 扩展模块:
apt install php-cli php-mbstring php-mysql php-gd php-curl php-xml php-zip

验证安装是否成功:
php -v

我看到的版本是:PHP 8.2.28 (cli) (built: Mar 13 2025 18:21:38) (NTS)

删除 Apache

列出运行中的服务:
systemctl list-units --type=service --state=running

我看到有两个 Apache 的服务,它们是正在运行的,占用了 80 端口。由于我打算使用 Nginx,所以需要禁止这两个服务,否则 Nginx 无法启动。后来我干脆删了 Apache。

systemctl stop apache2.service
systemctl stop apache-htcacheclean.service
apt remove --purge apache2 apache2-utils apache2-bin
apt autoremove

安装 Nginx

apt install nginx
systemctl start nginx
systemctl status nginx

之后在浏览器里访问入服务器的 ip 地址,即可看到 Nginx 的欢迎页面。

安装 MariaDB 数据库

MariaDB 是一个兼容 MySQL 的数据库,现在我需要安装它供 WordPress 使用。

apt install mariadb-server
systemctl status mariadb

运行安全脚本以提高 MariaDB 的安全性,这会引导你设置数据库的 root 密码和其他安全配置:
mysql_secure_installation

接下来创建给 WordPress 使用的数据库。你需要先想好数据库的字,比如我起名为 testsaberlove

然后运行 mysql -u root -p 并输入密码,进入数据库的命令行(在 Debian 12 上,如果你是 root 用户,不需要输入密码,直接按回车即可)。

然后输入这条命令并回车:
CREATE DATABASE testsaberlove;

这样就创建了 testsaberlove 数据库。然后输入 exit; 退出命令行即可。

获取 WordPress 安装包

假设我把网站文件保存到 /var/www 目录里(在安装 Nginx 时会自动创建这个目录,Nginx 的默认欢迎页面也在这里面)。

cd /var/www
wget https://wordpress.org/latest.tar.gz
tar -xzvf latest.tar.gz

这会下载 WordPress 并解压到 wordpress 文件夹里。可以把文件夹名字改为网站的域名,例如:

mv wordpress test.saber.love

你需要把 test.saber.love 换成你自己的域名。

然后授予 Nginx 用户的访问权限:

chown -R www-data:www-data /var/www/test.saber.love
chmod -R 755 /var/www/test.saber.love

创建 Nginx 配置文件

接下来创建该网站的 Nginx 配置文件。Nginx 的配置目录是 /etc/nginx/,它里面有两种方式可以存放网站的配置文件。

第一种是把配置文件放到 conf.d 目录里,并且文件的后缀名需要是 conf,例如 test.saber.love.conf

第二种是把配置文件放到 sites-available 目录里,然后使用 ln -s 在 sites-enabled 目录里创建一个软链接(快捷方式)。这样便于管理,原理是在 sites-available 目录里存储所有网站的配置文件,并把需要启用的文件在 sites-enabled 目录里创建软链接。如果不想启用某个网站了,只需要在 sites-available 目录里删除对应的软链接即可。

目前使用第二种方式似乎更为规范。

创建配置文件:
nano /etc/nginx/sites-available/test.saber.love

内容如下,这样当访问 test.saber.love 时,就会指向 /var/www/test.saber.love 目录:

server {
    listen 80;
    server_name test.saber.love;
    root /var/www/test.saber.love;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

启用该配置:
ln -s /etc/nginx/sites-available/test.saber.love /etc/nginx/sites-enabled/

移除默认配置(执行一次就可以了):
rm /etc/nginx/sites-enabled/default

测试 Nginx 的配置文件是否存在问题,如果没问题的话就重启 Nginx 服务:

nginx -t
systemctl reload nginx

之后在浏览器里访问你的域名(别忘了把域名解析到服务器),应该就可以看到 WordPress 的引导页面了:

配置 SSL 证书

如果你想尽快访问网站,可以先跳过此步骤,以后再处理。

目前我们还没有支持 https,所以只能通过 http 访问。有多种方法支持 https,比如我套了 Cloudflare 作为 CDN,可以使用它提供的 SSL 证书。如果不打算套 CDN,可以在服务器上安装 Let's Encrypt 为自己的网站创建 SSL 证书。

我现在使用的是 Cloudflare 的源服务器证书。为一个域名创建源服务器证书后,所有子域名都可以使用这个证书,这样就不必为每个子域名单独配置证书了。而且就算子域名分布于多个不同的服务器上,也只需要使用这一个证书,不需要为不同服务器生成单独的证书。而且源服务器证书的有效期是 15 年,不用担心过期和续期的问题,比 Let's Encrypt 爽多了。

创建源服务器证书的过程可以查看此文章:
也是用上 Cloudflare 了

当你有了 SSL 证书之后,可以编辑该网站的 Nginx 配置文件,添加 SSL 部分,格式如下:

# SSL configuration
listen 443 ssl;
ssl_certificate /etc/nginx/cert/saber.love.pem;
ssl_certificate_key /etc/nginx/cert/saber.love.key;

保存后重启 Nginx 服务:systemctl reload nginx,之后在浏览器里访问域名时,就会自动跳转到 https 网址。

禁止通过 IP 访问网站

默认情况下,在浏览器里输入服务器 IP 可以访问网站。在我们没有配置网站时,会显示 Nginx 默认的欢迎页面。当我配置了一个网站时,我发现它会直接显示这个网站。

我不希望可以通过 IP 访问网站,所以我禁止了此行为。你可以根据自己的需要选择是否执行。

创建 default 配置:
nano /etc/nginx/sites-available/default

内容如下:(你需要把 SSL 证书的路径修改为自己的实际路径,其他的不用改)

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    # 使用 Cloudflare Origin CA 证书(即使是默认服务器,也需要 SSL)
    ssl_certificate /etc/nginx/cert/saber.love.pem;
    ssl_certificate_key /etc/nginx/cert/saber.love.key;

    server_name _; # 捕获所有未匹配的 Host(包括 IP 访问)

    return 403; # 禁止访问
    # 或者重定向到你的域名:
    # return 301 https://your_domain.com$request_uri;
}

这样只允许使用配置过的域名访问网站。

启用该配置:
ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

重启 Nginx:
systemctl reload nginx

这样,通过 IP 访问时会返回 403 页面:

安装 WordPress

经过前面的步骤,现在已经可以通过域名访问 WordPress 了。默认会显示安装向导,其中有个重要的步骤就是连接数据库:

前面我们已经创建了数据库 testsaberlove,数据库用户名是 root,密码就是数据库的密码。下面的不用改,然后点击“提交”按钮即可。

提示:数据库必须提前手动创建,因为 WordPress 自己是不会创建数据库的。

然后跟着提示走就行,很快就可以登入 WordPress 后台了。此时访问域名就可以看到 WordPress 的默认页面了:

迁移网站

因为我要把网站换到新的服务器上,所以需要迁移网站。如果你没有这个需要的话不必看这部分。

复制网站文件

把文件复制到新服务器上有多种方式,一种简单的方法是先把文件打包,放到网站下面,这样可以通过网址访问。然后在新服务器上使用 wget 下载即可。

# 打包网站目录
tar -zcvf www.tar.gz /var/www
# 移动到某个网站里
mv www.tar.gz /var/www/saber.love
# 在新服务器上下载。-continue 表示断点续传,--limit-rate=1m 限制下载速度为 1 MB/s,避免占满原服务器的带宽
wget --continue --limit-rate=1m https://saber.love/www.tar.gz

之后解压出来,并赋予 Nginx 用户权限:

# 把文件提取到 /var/www 目录,并移除 tar 文件里原本的目录,以免生成嵌套的文件夹
# 也可以把 tar 文件移动到 / 目录,然后直接解压,这样也不会产生嵌套的文件夹
tar -zxvf www.tar.gz -C /var/www --strip-components=2
chown -R www-data:www-data /var/www
chmod -R 755 /var/www

另一种复制方式是使用 scp 或 rsync,原理是通过 SSH 登录到原服务器上然后传输文件,这样可以直接复制指定目录,不需要在原服务器上创建压缩包。而且 rsync 还支持增量备份,即多次执行时,可以只复制新增的文件。但是我的原服务器使用了私钥登录,而这些方式要使用私钥登录会比较麻烦,需要安装别的软件包,我懒得搞,就选择了简单的 wget 方式。

迁移数据库

执行下面的命令导出指定数据库:
mysqldump -u root -p wordpress > wordpress_db_backup.sql

root 是数据库用户名,wordpress 是数据库名称,可以根据实际情况修改。

将其复制到新服务器上之后就可以进行恢复了。

由于导出的 sql 文件里不包含创建数据库的语句,所以我们需要先创建对应的数据库:

# 进入数据库命令行
mysqldump -u root -p
# 创建数据库,名字可以根据需要修改
CREATE DATABASE wordpress;
# 如果这个数据库的用户不是 root,还需要创建同名的用户,并把密码设置为旧密码。此处省略
# 退出命令行
EXIT;

导入数据库:
mysql -u root -p wordpress < /home/user/wordpress_db_backup.sql

root 是数据库的用户,wordpress 是数据库名,最后是 sql 文件的路径。

如果要验证是否导入成功,可以进入数据库命令行,查看表结构是否正确:

mysql -u wordpress_user -p
USE wordpress;
SHOW TABLES;

WordPress 网站的 wp-config.php 里保存着该站点的数据库配置:

define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress_user');
define('DB_PASSWORD', 'your_secure_password');
define('DB_HOST', 'localhost');

在上面的恢复过程里,创建同名数据库、用户名、密码就是为了符合这里的原配置,这样网站可以直接运行。当然,如果新的配置和原来不同,我们也可以修改这里的配置。

复制 Nginx 配置文件

把原服务器上的 Nginx 配置文件复制过来,视情况进行修改。之后重启 Nginx 服务:

nginx -t
systemctl reload nginx

在 VPS 上搭建 WordPress 博客的简单教程