# 从一台空服务器到 WordPress 上线：全程敲命令，不用任何面板

**URL:** <https://forum.rainyun.com/t/topic/13327>\
**Category:** 云服务器 RCS\
**Created:** [2026 年7 月 27 日 04:09 UTC](https://forum.rainyun.com/t/topic/13327 "2026-07-27T04:09:06Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

作者： ![gzy](https://forum.rainyun.com/user_avatar/forum.rainyun.com/gzy/32/12796_2.png) [@gzy](https://forum.rainyun.com/u/gzy)\
发布日期： [2026 年7 月 27 日 04:09 UTC](https://forum.rainyun.com/t/topic/13327/1 "2026-07-27T04:09:07Z")

</div>

​本文来自我的个人博客：[从一台空服务器到 WordPress 上线：全程敲命令，不用任何面板 - 叹惋博客](https://twbk.cn/280.html "从一台空服务器到 WordPress 上线：全程敲命令，不用任何面板 - 叹惋博客")

**全程命令行操作，不靠任何面板，使性能利用最大化**

## **写在前面**

前两天写了一个搭建typecho的文章，有朋友看了问我你自己博客都是用wordpress的，咋先写了个搭建typecho的教程，哈哈哈哈哈哈，那我现在来写一下搭建wordpress教程。

我自己的博客是在一个有宝塔面板的服务器上的，不过我肯定不能把这个服务器拿来写教程，所以我要拿我在[雨云](https://www.rainyun.com/xls_)买的另外一个配置较差服务器，鉴于宝塔面板有额外占用，我就选择了抛弃面板，转用纯命令行。

这篇文章会带你一步步完成全部操作。全程用命令行，但每一条命令的意思我都会说清楚，照着敲就行。

**你需要准备：**

1.一台 Linux 服务器（我这里用Ubuntu 24.04），我是用的[雨云](https://www.rainyun.com/xls_)服务器

2.一个已经注册好的域名

3.能 SSH 连接服务器的终端工具

4.大概 30-60 分钟的时间（比搞typecho长多了嗯。）

## **第一步：连接服务器**

拿到服务器之后，你会有一个 **IP 地址** 、一个 **用户名** （通常是 `root`）和一个 **密码** 。

打开终端（Mac）或 PowerShell（Windows），输入：

```auto
ssh root@你的服务器IP

```

如果你是第一次从这台电脑连接这个服务器，会看到一个提示：

```auto
The authenticity of host '你的服务器IP' can't be established.
Are you sure you want to continue connecting (yes/no)?

```

输入 `yes` 并回车就行。这是 SSH 在确认服务器的身份，只有第一次连接会出现。

然后输入密码（输入的时候屏幕不会显示任何字符，这是正常的），回车。如果看到类似 `root@你的主机名:~#` 这样的提示符，说明连接成功了。

## **第二步：更新系统软件包**

刚拿到的服务器，软件包列表可能是旧的。先更新一下，保证后面装的都是最新版本。

```auto
apt update

```

这个命令会从软件源拉取最新的软件包列表。执行完之后再跑一个升级命令：

```auto
apt upgrade -y

```

`-y` 的意思是“所有询问都回答 yes”，省得你一个个确认。这个过程可能需要好多分钟，耐心等它跑完。

## **第三步：安装 Nginx（Web 服务器）**

Nginx 是一个轻量级、高性能的 Web 服务器，它的工作就是“接待访客”——当有人在浏览器里输入你的网站地址，Nginx 负责接收这个请求，然后把对应的网页内容返回给访客。

安装命令：

```auto
apt install nginx -y

```

装完之后，Nginx 会自动启动。验证一下：

```auto
systemctl status nginx

```

如果看到 `active (running)` 的字样，说明 Nginx 已经在跑了。

 ![](https://forum.rainyun.com/uploads/default/original/2X/8/8a08a63e0045fc8c97515ac988da320ba487ecb2.png)

现在打开浏览器，输入你的服务器 IP 地址，应该能看到一个“Welcome to nginx”的页面。这说明 Nginx 工作正常。

 ![](https://forum.rainyun.com/uploads/default/original/2X/8/8d45b23f264b4784cccf9e93d85a84692f5e1fc2.png)

**设置 Nginx 开机自启** （这样服务器重启后网站还能自动恢复）：

```auto
systemctl enable nginx

```

## **第四步：安装 MySQL（数据库）**

MySQL 是用来存数据的——你的文章、页面、用户评论、网站设置，全都放在数据库里。

```auto
apt install mysql-server -y

```

装完之后，MySQL 也会自动启动。验证一下：

```auto
systemctl status mysql

```

看到 `active (running)` 就对了。

 ![](https://forum.rainyun.com/uploads/default/original/2X/5/57527f465144ca76cb6b5106ca9c3c7d88f1613c.png)

设置 MySQL 开机自启：

```auto
systemctl enable mysql

```

设置 root 密码：

Ubuntu 新版本的 MySQL 默认使用 `auth_socket` 认证方式，也就是说系统 root 用户可以直接免密码登录 MySQL，不需要密码。这本身是安全的，但会导致 `mysql_secure_installation` 这个安全配置工具跳过设置密码的步骤，让你没办法正常用密码登录。

所以我们要 **先手动设置 root 密码** ，再执行安全配置。

用系统 root 权限直接登录 MySQL（不需要输密码）：

```auto
sudo mysql

```

进去之后提示符会变成 `mysql>`，执行下面的命令设置密码（ **把 `你的密码` 换成你自己要设的密码** ）：

（`mysql_native_password` 是 MySQL 传统的密码认证方式，设完之后你就可以用密码登录了。）

```auto
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';

```

> **注意：要是提示`Your password does not satisfy the current policy requirements` ，那就生成一个有大小写字母，数字，特殊字符的16位密码，这样肯定符合要求（偷懒了算是）。**

刷新权限让设置生效：

```auto
FLUSH PRIVILEGES;

```

退出 MySQL：

```auto
EXIT;

```

现在验证一下密码是否设置成功：

```auto
mysql -u root -p

```

输入刚才设的密码，能正常登录就说明成功了。输入 `EXIT;` 退出。

## **运行安全配置**

```auto
mysql_secure_installation

```

运行后会有一系列问答，按下面这样回答就行：

1. **是否验证密码插件？** 输入 `y` 建议启用，它可以帮你检查密码强度。如果选 `y`，后面设置密码时如果密码太简单（比如纯数字、太短），MySQL 会拒绝。建议用大小写字母 + 数字 + 特殊字符的组合密码。（你要是不想被约束，那就输入n）
2. **是否移除匿名用户？** 输入 `Y`
3. **是否禁止 root 远程登录？** 输入 `Y`
4. **是否移除测试数据库？** 输入 `Y`
5. **是否重新加载权限表？** 输入 `Y`

> **记住你设的 root 密码，后面配置 WordPress 的数据库用户时要用到。但注意，WordPress 连接数据库用的不是这个 root 账号，而是我们下一步要专门创建的 `wpuser` 账号——root 账号权限太大，直接给网站用不安全。**

## **情况说明：为什么 Ubuntu 新版 MySQL 跟以前不一样？**

老版本的 MySQL 安装完后，`mysql_secure_installation` 会直接让你设置 root 密码。但从 Ubuntu 20.04 开始，MySQL 默认改用 `auth_socket` 插件认证 root 用户——这个插件的逻辑是“只有系统用户 root 才能登录 MySQL，不需要密码”。好处是更安全（没有密码泄露的风险），坏处是如果你想像传统方式那样用 `mysql -u root -p` 加密码登录，就得像上面这样手动改认证方式。

如果你后续只想用 `sudo mysql` 免密登录，也可以不改。但还是建议按上面的步骤改成密码认证，跟绝大多数教程保持一致，后续操作也更顺畅。

## **第五步：安装 PHP（运行环境）**

PHP 是一种服务器端脚本语言，WordPress 就是用 PHP 写的。我们需要安装 PHP 以及 WordPress 需要的各种扩展。

```auto
apt install php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-zip php-intl php-exif php-fileinfo php-bcmath php-soap -y

```

这条命令装了不少东西，一起安装了WordPress 官方推荐和必需的 PHP 扩展：

| 扩展 | 作用 |
| --- | --- |
| `curl` | 发起 HTTP 请求，用于获取更新、调用外部 API |
| `fileinfo` | 检测上传文件的 MIME 类型，防止恶意上传 |
| `json` | 处理 JSON 数据，WordPress REST API 依赖它 |
| `mbstring` | 处理多字节字符（中文、日文等） |
| `mysqli` 或 `pdo_mysql` | 连接 MySQL 数据库 |
| `SimpleXML` / `xml` | 解析 XML 数据（RSS 订阅等） |
| `zip` | 处理压缩包，安装主题和插件时必须 |
| `gd` 或 `imagick` | 图片处理（缩略图、裁剪） |
| `exif` | 读取图片元数据（用于修正手机照片方向） |
| `intl` | 国际化支持（多语言网站、WooCommerce 等会用） |
| `OPcache` | 缓存 PHP 字节码，大幅提升性能 |

装完之后检查一下 PHP-FPM 是否在运行：

```auto
systemctl status php8.3-fpm

```

> ![](https://forum.rainyun.com/uploads/default/original/2X/a/a548b30ac11fc8b43b1783bf74e6d96aaccda69c.png)
> 
> **注意：具体版本号可能不同。Ubuntu 22.04 默认装的是 PHP 8.1，Ubuntu 24.04 默认装的是 PHP 8.3。（我写教程用的是Ubuntu 24.04，所以我就以8.3为例）。如果不确定自己装的是哪个版本，可以用 `systemctl status php` 然后按 Tab 键自动补全看看，或者用 `php -v` 命令查看版本号。后面的 Nginx 配置文件中需要填这个版本号，务必保持一致。**

## **第六步：为 WordPress 创建数据库**

装好了 MySQL，现在要为 WordPress 创建一个专用的数据库和一个专用的数据库用户。 **不建议用 root 账号直接跑网站** ，不安全。

先登录 MySQL：

```auto
mysql -u root -p

```

输入刚才设置的 root 密码，进入 MySQL 命令行界面（提示符会变成 `mysql>`）。

依次执行以下命令（ **把 `your_password` 换成你自己设的密码** ）：

```auto
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

```

这条命令创建了一个名叫 `wordpress` 的数据库，字符集设为 `utf8mb4`（支持 emoji 和所有生僻字）。`COLLATE utf8mb4_unicode_ci` 指定了排序规则，`ci` 表示 case-insensitive（不区分大小写）。

```auto
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'your_password';

```

创建了一个叫 `wpuser` 的数据库用户，密码由你设定。`'wpuser'@'localhost'` 表示这个用户只能从本地（也就是服务器本机）连接数据库，这是最安全的做法，因为 WordPress 和 MySQL 在同一台服务器上，根本不需要远程连接。

```auto
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';

```

给这个用户赋予 `wordpress` 数据库的全部权限。`wordpress.*` 表示数据库 `wordpress` 里的所有表。

```auto
FLUSH PRIVILEGES;

```

让权限设置立即生效。

```auto
EXIT;

```

退出 MySQL。

> **记下来：数据库名是 `wordpress`，用户名是 `wpuser`，密码是你刚才设的那个——后面配置 WordPress 的时候要用。**

## **第七步：域名解析（把域名指向服务器）**

在继续之前，需要先把你的域名指向服务器的 IP 地址。这一步是在 **域名注册商** 的后台操作的（比如你在阿里云、腾讯云、Namesilo、Cloudflare 等地方买的域名）。

登录你的域名注册商网站，找到 **DNS 解析** 或 **域名解析** 管理页面。添加两条 **A 记录** ：

| 主机记录 | 记录类型 | 记录值 | 说明 |
| --- | --- | --- | --- |
| @ | A | 你的服务器 IP | `@` 代表主域名本身，比如 `example.com` |
| www | A | 你的服务器 IP | 让 `www.example.com` 也能访问 |

> **什么是 A 记录？ A 记录的全称是 Address Record，它的作用就是告诉全世界：“访问这个域名的时候，去这个 IP 地址”。**

添加完之后，DNS 解析需要一段时间才能生效。快的话几分钟，慢的话可能要几个小时（取决于你的域名注册商和 TTL 设置，TTL 即 Time To Live，是 DNS 记录在各地 DNS 服务器上的缓存时间）。你可以用下面的命令测试域名是否已经指向了你的服务器：

```auto
ping 你的域名

```

如果返回的 IP 地址是你的服务器 IP，说明解析已经生效了。

 ![](https://forum.rainyun.com/uploads/default/original/2X/5/5ea9a02196439e01bae46b61b0361110194841ed.png)

> **新手提示：如果你急着测试，可以先在本地电脑上修改 hosts 文件临时将域名指向服务器（Windows 下是 `C:\Windows\System32\drivers\etc\hosts`，Mac/Linux 下是 `/etc/hosts`），但这个方法只对你自己的电脑有效，正式上线还是要等 DNS 解析生效。**

## **第八步：开放防火墙端口**

如果你的服务器开启了防火墙（Ubuntu 默认没有安装 UFW，但有些云服务商默认会开启），需要确保 80 端口（HTTP）和 443 端口（HTTPS）是开放的。

检查 UFW 状态：

```auto
ufw status

```

如果显示 `Status: inactive`，说明防火墙没开，可以跳过这一步。

如果显示 `Status: active`，需要开放端口：

```auto
ufw allow 80/tcp
ufw allow 443/tcp
ufw reload

```

> **为什么要开放这两个端口？ 80 端口是 HTTP 协议的默认端口，443 端口是 HTTPS 协议的默认端口。如果这两个端口被防火墙挡住了，外部用户就根本打不开你的网站。**

另外，有些云服务商，要去后台防火墙或安全组里放行 80 和 443 端口。这一点很容易被忽略——服务器内部的防火墙打开了，但云服务商外围的安全组还挡着，网站照样访问不了。

## **第九步：下载 WordPress**

准备工作都做完了，现在把 WordPress 的程序文件下载到服务器上。

先进入 Nginx 的网站根目录（`/var/www/html` 是 Nginx 默认的网站根目录）：

```auto
cd /var/www/html

```

> **补充说明：`/var/www/html` 这个路径是有历史渊源的。`/var` 目录存放的是“可变数据”（variable data），比如日志、缓存、网站文件等；`/www` 是 web 相关文件的常见存放位置；`html` 是存放 HTML 文件的目录。不过这个路径是可以自定义的，只是 Nginx 默认配置里用的是这个。**

然后用 `wget` 下载 WordPress 中文版的最新压缩包：

```auto
wget https://cn.wordpress.org/latest-zh_CN.tar.gz

```

解压：

```auto
tar -xzf latest-zh_CN.tar.gz

```

`tar -xzf` 的参数含义：`-x` 表示解压，`-z` 表示通过 gzip 解压，`-f` 表示指定文件名。

解压之后会看到一个 `wordpress` 文件夹，里面就是 WordPress 的全部程序文件。

把 `wordpress` 文件夹里的 **所有文件** 移动到当前目录（也就是 `/var/www/html`）：

```auto
mv wordpress/* .

```

删掉空的 `wordpress` 文件夹和下载的压缩包：

```auto
rmdir wordpress
rm latest-zh_CN.tar.gz

```

## **第十步：配置 WordPress 数据库连接**

WordPress 需要一个配置文件来告诉它数据库在哪、账号密码是什么。

先复制一份示例配置文件：

```auto
cp wp-config-sample.php wp-config.php

```

然后用 `nano` 编辑器打开配置文件（`nano` 比 `vim` 友好得多，适合新手）：

```auto
nano wp-config.php

```

在文件里找到这几行（大概在文件中间偏下的位置）：

```auto
define( 'DB_NAME', 'database_name_here' );
define( 'DB_USER', 'username_here' );
define( 'DB_PASSWORD', 'password_here' );
define( 'DB_HOST', 'localhost' );

```

把它们改成你刚才创建的数据库信息：

```auto
define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wpuser' );
define( 'DB_PASSWORD', '你的密码' );
define( 'DB_HOST', 'localhost' );

```

 ![](https://forum.rainyun.com/uploads/default/original/2X/d/d4130182c4ff6c54560ba2513efc66734d46765c.jpeg)

改完之后，按 `Ctrl + X`，然后按 `Y` 确认保存，再按回车退出。

**额外安全步骤一：添加 Salt 密钥**

WordPress 官方建议在配置文件里加一组随机密钥，用来加密用户会话、Cookie 等信息。你可以访问 [https://api.wordpress.org/secret-key/1.1/salt/](https://api.wordpress.org/secret-key/1.1/salt/) 这个地址，会生成一串随机字符，把它们完整复制到 `wp-config.php` 文件中 `Authentication Unique Keys and Salts` 那几行的位置，替换掉原来那些占位内容。

**额外安全步骤二：设置网站域名**

在 `wp-config.php` 文件中找到 `/* That's all, stop editing! Happy publishing. */` 这行注释，在它 **之前** 加上下面两行（把 `example.com` 换成你自己的域名）：

```auto
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');

```

> **为什么现在就要写成 https？ 因为我们在后续步骤会配置 HTTPS，如果这里写的是 `http://`，到时候还要回头改，容易遗漏。直接写成 `https://` 一步到位。而且 WordPress 后台的“设置 → 常规”里也有站点地址（Site URL）和首页地址（Home URL）两个选项，但在配置文件里定义优先级更高，会覆盖后台的设置。**

## **第十一步：配置 Nginx（绑定域名 + 准备 HTTPS）**

这一步比较关键，我们要配置 Nginx 让它知道：

1. 你的网站文件在哪个目录
2. 你的域名是什么
3. 如何处理 PHP 文件

**首先** ，为你的网站创建一个单独的 Nginx 配置文件，而不是直接改默认配置。这样更干净，以后也好管理。

```auto
nano /etc/nginx/sites-available/你的域名.conf

```

比如你的域名是 `example.com`，就输入：

```auto
nano /etc/nginx/sites-available/example.com.conf

```

然后把下面的内容粘贴进去（ **把所有的 `example.com` 换成你自己的域名，把 `php8.3` 换成你实际的 PHP 版本** ）：

```auto
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /var/www/html;
    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:/var/run/php/php8.3-fpm.sock;
    }

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

```

逐行解释一下：

- `listen 80` 和 `listen [::]:80`：监听 80 端口（HTTP 的默认端口），前者监听 IPv4，后者监听 IPv6
- `server_name`：告诉 Nginx，当用户访问 `example.com` 或 `www.example.com` 时，使用这个配置。Nginx 支持多个域名指向同一个站点，用空格分隔就行，如果你不需要`www.你的域名`，那只保留前面那个即可。
- `root`：网站文件存放在哪个目录
- `index`：当用户访问一个目录时，默认加载哪个文件（优先找 `index.php`，然后是 `index.html`，再是 `index.htm`）
- `location / { try_files ... }`：这是 WordPress 的“伪静态”规则。它的意思是：如果用户请求的是一个实际存在的文件或目录，就直接返回；否则把所有请求交给 `/index.php` 处理，并把原始的查询参数（`$args`）带过去。这样 WordPress 才能处理像 `/about` 这样的“友好 URL”
- `location ~ \.php$`：所有以 `.php` 结尾的请求，交给 PHP-FPM 处理。`~` 表示使用正则表达式匹配
- `fastcgi_pass`：PHP-FPM 的通信地址。这里用的是 Unix socket 方式（`unix:/var/run/php/php8.1-fpm.sock`），比 TCP socket（`127.0.0.1:9000`）性能略好，配置也更简单
- `location ~ /\.ht`：禁止访问所有以 `.ht` 开头的文件（`.htaccess` 和 `.htpasswd`），这是 Apache 用的配置文件，Nginx 不认，直接拒绝访问更安全

> **如何确认 PHP-FPM 的 socket 路径？ 可以用 `ls /var/run/php/` 看看里面有什么 `.sock` 文件，比如 `php8.1-fpm.sock` 或 `php8.3-fpm.sock`，把配置文件里的版本号改成对应的就行。**

保存退出（`Ctrl + X`，然后 `Y`，再回车）。

**然后** ，启用这个配置——在 Nginx 中，`sites-available` 是存放所有可用配置的地方，而 `sites-enabled` 是存放实际启用配置的地方。我们需要创建一个 **软链接** ：

```auto
ln -s /etc/nginx/sites-available/你的域名.conf /etc/nginx/sites-enabled/

```

比如：

```auto
ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

```

> **什么是软链接？ 软链接（symbolic link）类似于 Windows 下的快捷方式。这样做的目的是把配置文件集中放在 `sites-available` 里管理，想启用某个站点就在 `sites-enabled` 里创建一个指向它的链接，想停用就直接删除这个链接，而不用删除原始文件。**

**最后** ，删除默认的 Nginx 配置（不然可能会和你的配置冲突）：

```auto
rm /etc/nginx/sites-enabled/default

```

检查一下 Nginx 配置有没有语法错误：

```auto
nginx -t

```

如果显示 `syntax is ok` 和 `test is successful`，说明配置没问题。

![](https://forum.rainyun.com/uploads/default/original/2X/0/099c5f0a91539d17a3178bbb4b73191b677432c3.png)

然后重载 Nginx：

```auto
systemctl reload nginx

```

现在在浏览器里输入你的域名（`http://你的域名`），应该能看到 WordPress 的安装界面了。不过别急，我们先加上 HTTPS 再继续。

## **第十二步：用 Certbot 自动配置 HTTPS（Let’s Encrypt 免费证书）**

HTTP 是明文传输的，你输入的任何信息（包括密码）在网络传输过程中都是裸奔的，非常不安全。我们要给网站加上 HTTPS，用 Let’s Encrypt 提供的免费 SSL 证书。

> **什么是 Let’s Encrypt？ 它是一个非营利性的证书颁发机构（CA），由 Linux 基金会托管，为全球网站提供免费的 SSL/TLS 证书。它的证书有效期为 90 天，但可以自动续期，完全不需要手动干预。**

Let’s Encrypt 的证书申请和配置过程可以使用 Certbot 这个工具全自动完成。

**安装 Certbot 和 Nginx 插件** ：

```auto
apt install certbot python3-certbot-nginx -y

```

**申请证书并自动配置 Nginx** ：

如果不需要www.的部分去掉后面的`-d www.你的域名`即可

```auto
certbot --nginx -d 你的域名 -d www.你的域名

```

比如：

```auto
certbot --nginx -d example.com -d www.example.com

```

运行后，Certbot 会问你几个问题：

1. **输入邮箱地址** ：用于接收紧急续期通知和安全提醒（如果证书即将过期或出现问题，会发邮件通知你）
2. **同意服务条款** ：输入 `A` 同意
3. **是否愿意分享邮箱给 EFF** （电子前哨基金会，EFF 是 Let’s Encrypt 的主要发起方之一）：输入 `Y` 或 `N` 都行，看你自己

然后 Certbot 会自动完成以下步骤：

- 验证你对域名的所有权（通过在你网站目录下放一个临时验证文件，Let’s Encrypt 的服务器会通过 HTTP 访问这个文件来确认你确实拥有这个域名的控制权）
- 向 Let’s Encrypt 申请证书
- 自动修改你的 Nginx 配置文件，加上 HTTPS 相关的配置
- 重载 Nginx 让配置生效

整个过程不到一分钟。完成后，打开浏览器输入 `https://你的域名`，应该能看到浏览器地址栏旁边有个小锁头图标，说明 HTTPS 已经生效了。

 ![](https://forum.rainyun.com/uploads/default/original/2X/e/e8010018ef7dbe1715a055d80f8d267efa928426.png)

> **检查证书状态：任何时候你可以用 `certbot certificates` 命令查看当前所有已安装的证书列表及其到期时间。**

## **第十三步：配置 HTTP 自动跳转到 HTTPS**

虽然 Certbot 通常会自动帮你配置好 HTTP 到 HTTPS 的重定向，但最好确认一下。打开你的 Nginx 配置文件：

```auto
nano /etc/nginx/sites-available/你的域名.conf

```

检查一下，应该有两个 `server` 块：

**第一个** （监听 80 端口）负责把 HTTP 请求重定向到 HTTPS：

```auto
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

```

> **`return 301` 是永久重定向（Moved Permanently），告诉浏览器和搜索引擎：这个地址已经永久迁移到 HTTPS 版本了。`301` 和 `302` 的区别是：`301` 是永久性的，搜索引擎会把权重转移到新地址；`302` 是临时性的，搜索引擎不会转移权重。**

**第二个** （监听 443 端口）负责处理 HTTPS 请求，Certbot 会自动帮你填好证书路径：

```auto
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name example.com www.example.com;
    root /var/www/html;
    index index.php index.html index.htm;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
    }

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

```

> **证书文件的含义：`fullchain.pem` 是完整的证书链文件，包含了你的站点证书和中间证书；`privkey.pem` 是你的私钥文件，必须严格保密，绝对不能泄露。**

如果你的配置里没有第一个 `server` 块（80 端口那个），手动加上就行。保存后检查配置并重载：

```auto
nginx -t
systemctl reload nginx

```

现在访问 `http://你的域名` 会自动跳转到 `https://你的域名`。

## **第十四步：设置文件权限**

WordPress 需要对某些文件夹有写入权限，比如上传图片、安装主题和插件。但权限也不能给得太松，不安全。

先修改文件所有者：

```auto
chown -R www-data:www-data /var/www/html

```

这条命令把网站目录的所有者改成 `www-data`。`-R` 表示递归处理，会修改该目录下所有子目录和文件。

> **`www-data` 是什么？ 它是 Ubuntu/Debian 系统中 Nginx 和 PHP-FPM 默认的运行用户。Web 服务器以这个用户的身份读取和执行网站文件。把网站目录的所有者设为 `www-data`，Web 服务器才有权限读写这些文件。**

然后设置文件夹权限为 `755`，文件权限为 `644`：

```auto
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;

```

> **755 和 644 是什么意思？ Linux 权限用三位数字表示：第一位是所有者（owner）的权限，第二位是所属组（group）的权限，第三位是其他人（others）的权限。`7` = 读（4）+ 写（2）+ 执行（1），`5` = 读（4）+ 执行（1），`4` = 只读。所以 `755` 表示所有者有全部权限，组用户和其他用户只有读和执行权限；`644` 表示所有者有读写权限，组用户和其他用户只有读权限。**

这样 WordPress 就能正常读写文件了，同时安全性也有保障。

## **第十五步：调整 PHP 上传文件大小限制**

WordPress 默认允许上传的文件大小是 2MB，这个对于上传主题、插件或者大图片来说通常是不够的。我们需要修改 PHP 的配置文件。

找到 PHP 的配置文件：

```auto
nano /etc/php/8.3/fpm/php.ini

```

> **注意：版本号换成你实际的 PHP 版本。Ubuntu 22.04 是 `8.1`，Ubuntu 24.04 是 `8.3`。**

找到下面这三行，修改成你想要的数值（这里以 64MB 为例）：

```auto
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 128M

```

- `upload_max_filesize`：单个上传文件的最大大小
- `post_max_size`：单次 POST 请求的最大大小（必须大于等于 `upload_max_filesize`，因为上传文件是用 POST 方法提交的）
- `memory_limit`：PHP 脚本可使用的最大内存（必须大于 `post_max_size`，否则大文件上传过程中可能内存溢出）

改完之后保存退出，然后重启 PHP-FPM 让配置生效：

```auto
systemctl restart php8.3-fpm

```

> **注意版本号同样要换成你实际的版本。**

## **第十六步：浏览器中完成 WordPress 安装**

以上所有步骤都做完之后，打开浏览器，输入你的域名（`https://你的域名`）。

应该会看到 WordPress 的安装界面，让你选择语言——选简体中文，点“继续”。

然后会看到数据库连接信息（前面如果你跟着我的教程在文件里设置过了，那可以直接去设置网站基本信息了）：

1. **数据库名** ：`wordpress`

2. **用户名** ：`wpuser`

3. **密码** ：你设的密码

4. **数据库主机** ：`localhost`

5. **表前缀** ：`wp_`（默认就好，如果你有特殊需求可以改，但一般不需要动）

填好之后点“提交”，如果信息都对，就会进入下一步。

> **如果提示“无法连接数据库”：返回检查 `wp-config.php` 里的数据库信息是否完全正确，尤其是密码有没有打错字、有没有多余的空格。**

下一步是设置网站的基本信息：

1. **站点标题** ：你的网站名字（之后可以随时修改）

2. **用户名** ：管理员账号（ **不要用 `admin`** ，因为这是 WordPress 默认的管理员用户名，很容易被暴力破解攻击盯上）

3. **密码** ：设一个复杂点的（WordPress 会给你一个强密码建议，可以直接用）

4. **您的电子邮件** ：填你的邮箱

 ![](https://forum.rainyun.com/uploads/default/original/2X/f/f8121852b61e04ad745f3a5b0cfcb7d902d8e762.png)

填完之后点“安装 WordPress”，等几秒钟，看到“安装成功”的页面就大功告成了。

 ![](https://forum.rainyun.com/uploads/default/original/2X/5/5f835c72e7d3fe67bc9c93ba3a738e53fe2767a8.png)

点“登录”，用刚才设的管理员账号和密码登录后台。后台地址是 `https://你的域名/wp-admin`

 ![](https://forum.rainyun.com/uploads/default/original/2X/6/68d9a370d5d8054e29b896c88c8c902edd37dd72.png)

## **第十七步：确认 HTTPS 自动续期**

Let’s Encrypt 的证书只有 90 天有效期，但 Certbot 会自动帮你续期。验证一下自动续期是否配置好了：

```auto
certbot renew --dry-run

```

> **`--dry-run` 是“模拟运行”的意思，不会真的去续期，只是测试整个续期流程是否正常。**

如果输出类似 `The dry run was successful` 的信息，说明自动续期正常工作。

 ![](https://forum.rainyun.com/uploads/default/original/2X/3/32ebc72af8069d6f9305bb5a9bb283645e98f9cc.png)

Certbot 会在系统中创建一个定时任务（systemd timer），每天运行两次，检查所有已安装的证书，如果发现哪个证书距离过期不足 30 天，就自动续期。你什么都不用做。

## **第十八步：（可选）开启 HSTS 提升安全性**

HSTS（HTTP Strict Transport Security）是一个安全机制，它告诉浏览器： **在接下来的一年里，只能用 HTTPS 访问我的网站，绝对不要用 HTTP** 。这样即使有人点击了 HTTP 链接或输入了 HTTP 地址，浏览器也会自动把它转换成 HTTPS。

在 Nginx 配置文件的 HTTPS server 块里加上一行：

```auto
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

```

`max-age=31536000` 表示有效期一年（单位是秒，31536000 秒 = 365 天），`includeSubDomains` 表示对所有子域名也生效。

加完保存后检查并重载配置：

```auto
nginx -t
systemctl reload nginx

```

> **注意：启用 HSTS 后，如果你后续想关闭 HTTPS，会非常麻烦。因为浏览器已经记住了“只能用 HTTPS”的指令，即使你删除了服务器上的 HTTPS 配置，浏览器还是会固执地尝试用 HTTPS 访问。所以建议在网站运行稳定后再开启。**

## **常见的坑和解决办法**

**1. 打开浏览器看到的是 Nginx 欢迎页，不是 WordPress 安装界面**

说明 Nginx 的配置没有生效，或者默认配置没有被替换。检查一下：

\<1\>`/etc/nginx/sites-enabled/default` 是否已经被删除

\<2\>你的配置文件是否已经软链接到 `sites-enabled`

\<3\>运行 `nginx -t` 检查配置是否有语法错误

\<4\>运行 `systemctl reload nginx` 重载配置

**2. 提示“Error establishing a database connection”**

多半是 `wp-config.php` 里的数据库名、用户名或密码填错了。回去检查一下，尤其是密码有没有打错字。也有可能是 MySQL 服务没启动，用 `systemctl status mysql` 看一下。

**3. 安装主题或插件时提示需要 FTP 信息**

在 `wp-config.php` 文件中找到 `/* That's all, stop editing! Happy publishing. */` 这行注释，在它 **之前** 加上一行：

```auto
define('FS_METHOD', 'direct');

```

这样 WordPress 就会直接用文件系统写入，不需要 FTP。

**4. 上传图片或主题时提示“文件大小超过限制”**

这是 PHP 上传大小限制的问题。按第十五步调整 `upload_max_filesize`、`post_max_size` 和 `memory_limit` 这三个参数，然后重启 PHP-FPM。

**5. 上传图片失败，提示“无法创建目录”**

检查一下 `/var/www/html/wp-content/uploads` 文件夹是否存在，如果不存在就手动创建：

```auto
mkdir -p /var/www/html/wp-content/uploads
chown www-data:www-data /var/www/html/wp-content/uploads

```

**6. 页面打不开，显示 502 Bad Gateway**

通常是 PHP-FPM 没启动或者 Nginx 和 PHP-FPM 之间的通信出了问题。检查 PHP-FPM 的状态：

```auto
systemctl status php8.3-fpm

```

如果没启动，就启动它：

```auto
systemctl start php8.3-fpm

```

如果 PHP-FPM 是启动的但问题依然存在，检查 Nginx 配置文件中的 `fastcgi_pass` 路径是否正确（版本号是否匹配）。

**7. 浏览器提示“您的连接不是私密连接”或证书无效**

可能的原因：

\<1\>证书还没有生效（刚申请完需要等几秒）

\<2\>你访问的是 `http://` 而不是 `https://`（某些浏览器会把 HTTP 访问显示为“不安全”而不是“私密连接”）

\<3\>域名解析还没生效，Certbot 验证域名所有权时失败了

\<4\>你是用 IP 地址访问的，而 SSL 证书是绑定在域名上的，用 IP 访问必然证书报错

可以用 `certbot certificates` 命令查看证书状态，确认证书是否已成功签发。

**8. 域名解析一直不生效**

DNS 解析的生效时间取决于两个因素：一是你域名注册商那边的 TTL（Time To Live）设置，二是各地 DNS 服务器的缓存刷新速度。如果你急着测试，可以先把 TTL 设短一些（比如 300 秒，即 5 分钟），等正式上线再改回默认值（通常是 600 秒或 3600 秒）。

**9. 打开网站显示空白页（白屏）**

可能是 PHP 内存不足或某个插件/主题报错。可以先检查 PHP 错误日志：

```auto
tail -f /var/log/php8.3-fpm.log

```

> **版本号换成你实际的版本。`tail -f` 会实时显示日志的最后几行并持续更新。**

如果错误日志里没有信息，可以临时在 `wp-config.php` 中开启调试模式：

```auto
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

```

然后访问网站，错误信息会被记录到 `/var/www/html/wp-content/debug.log` 文件中，查看这个文件就能定位问题。

## **接下来可以做什么**

网站跑起来之后，你可以：

1. **换个好看的主题** ：后台“外观 → 主题”里有很多免费的，挑一个顺眼的

2. **装几个实用的插件** ：比如 Yoast SEO（搜索引擎优化）、Akismet（防垃圾评论）、UpdraftPlus（自动备份）

3. **写第一篇文章** ：点击后台左侧的“文章 → 写文章”，开始你的创作

4. **定期备份** ：建议每周备份一次数据库和网站文件，可以用 `mysqldump` 导出数据库，用 `tar` 打包网站目录

部署 WordPress 的核心就是装好 **Nginx + MySQL + PHP** 这三个东西，再把域名解析做好，用 Certbot 一键搞定 HTTPS。看着挺多，实际部署起来挺简单。

希望这篇教程对你有帮助。

---

<div class="post-metadata">

作者： ![用户\_8oTmG](https://forum.rainyun.com/user_avatar/forum.rainyun.com/%E7%94%A8%E6%88%B7_8otmg/32/12858_2.png) [@用户\_8oTmG](https://forum.rainyun.com/u/%E7%94%A8%E6%88%B7_8oTmG)\
发布日期： [2026 年7 月 27 日 06:40 UTC](https://forum.rainyun.com/t/topic/13327/2 "2026-07-27T06:40:31Z")

</div>

这不是更麻烦吗我为啥不用面板 😪

---

<div class="post-metadata">

作者： ![gzy](https://forum.rainyun.com/user_avatar/forum.rainyun.com/gzy/32/12796_2.png) [@gzy](https://forum.rainyun.com/u/gzy)\
发布日期： [2026 年7 月 27 日 08:36 UTC](https://forum.rainyun.com/t/topic/13327/4 "2026-07-27T08:36:41Z")

</div>

低配服务器再用面板占用大没必要啊。而且不是所有人都喜欢面板

---

<div class="post-metadata">

作者： ![JSLASS](https://forum.rainyun.com/letter_avatar_proxy/v4/letter/j/cc9497/32.png) [@JSLASS](https://forum.rainyun.com/u/JSLASS)\
发布日期： [2026 年7 月 30 日 11:46 UTC](https://forum.rainyun.com/t/topic/13327/5 "2026-07-30T11:46:25Z")

</div>

理论上跑得动nginx+mysql的服务器应该都应该够跑面板🤔

---

<div class="post-metadata">

作者： ![gzy](https://forum.rainyun.com/user_avatar/forum.rainyun.com/gzy/32/12796_2.png) [@gzy](https://forum.rainyun.com/u/gzy)\
发布日期： [2026 年7 月 30 日 13:47 UTC](https://forum.rainyun.com/t/topic/13327/6 "2026-07-30T13:47:24Z")

</div>

面板浪费内存，何必呢？
