基于LNMP个人博客搭建

dongwang 发布于 10 天前 12 次阅读


前言

本文会介绍搭建个人博客网站的流程。

参考文章:
https://www.trae.cn/article/706647298

Sakurairo主题设置说明:
https://docs.fuukei.org/Sakurairo/Preliminary/

搭建准备

购买域名

因为备案需要一定时间,所以首先要购买域名。可以多平台对比价格后再做选择;尽量选择 com、cn 这类顶级域名,不过这类域名大多早已经被注册完了。
考虑到域名第一年通常有优惠,价格只需几块或十几块钱,但后续续费价格往往会大幅上涨,上百元也很正常。如果打算长期使用,可以一次性多购买几年,最多可以购买十年。

腾讯云域名注册:
https://cloud.tencent.com/product/domain
需要先实名认证,大概1h左右,认证完成即可购买域名。

但是认证只是服务商做的事情,还需要等待1~3个工作日,才能上报到工信部。这段时间是无法进行ICP备案。

购买云服务器

阿里云服务器购买(可以等到域名在工信部备案完成后再购买):
https://www.aliyun.com/product/swas?spm=5176.42028462.nav-v2-dropdown-menu-1.d_main_0_2.5421154atgZFV9&scm=20140722.M_swas.P_189.ID_swas-OR_rec-V_1-MO_3480-ST_12793-PA_se@1021752628

购买配置:

ICP备案

需要已经上报工信部的域名和云服务器。
备案平台选择服务器购买平台,比如我再阿里云购买云服务器,在腾讯云购买域名,就需要在阿里云备案。

阿里云备案:
https://beian.aliyun.com/pcContainer/myorder

搭建服务器

在进行域名工信部上报或者ICP备案期间就可以进行服务器搭建。

echo "=== OS ===" && cat /etc/os-release && \
echo "=== Nginx ===" && nginx -v 2>&1 && \
echo "=== PHP ===" && php -v && \
echo "=== MySQL/MariaDB ===" && mysql --version && \
echo "=== WordPress ===" && sudo grep "wp_version =" /var/www/blog/wp-includes/version.php
admin@iZuf681i5rahvrljl9zcivZ:~/workspace/backups$ echo "=== OS ===" && cat /etc/os-release && \
echo "=== Nginx ===" && nginx -v 2>&1 && \
echo "=== PHP ===" && php -v && \
echo "=== MySQL/MariaDB ===" && mysql --version && \
echo "=== WordPress ===" && sudo grep "wp_version =" /var/www/blog/wp-includes/version.php
=== OS ===
PRETTY_NAME="Ubuntu 24.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.4 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
=== Nginx ===
nginx version: nginx/1.24.0 (Ubuntu)
=== PHP ===
PHP 8.3.6 (cli) (built: Jul 16 2026 18:30:41) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.6, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies
=== MySQL/MariaDB ===
mysql  Ver 15.1 Distrib 10.11.14-MariaDB, for debian-linux-gnu (x86_64) using  EditLine wrapper
=== WordPress ===
$wp_version = '7.1';

初始配置

首先就要重置密码。
然后记录基础应将

admin@iZuf681i5rahvrljl9zcivZ:~$ lsb_release -r
No LSB modules are available.
Release:        24.04

admin@iZuf681i5rahvrljl9zcivZ:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           162M  1.1M  161M   1% /run
efivarfs        256K  7.4K  244K   3% /sys/firmware/efi/efivars
/dev/vda3        40G  3.1G   35G   9% /
tmpfs           807M     0  807M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/vda2       197M  6.2M  191M   4% /boot/efi
tmpfs           162M   12K  162M   1% /run/user/1000

root@iZuf681i5rahvrljl9zcivZ:/home/admin# free -h
               total        used        free      shared  buff/cache   available
Mem:           1.6Gi       448Mi       230Mi       2.5Mi       1.1Gi       1.1Gi
Swap:             0B          0B          0B

添加swap

这个配置还是很低的,建议先加上swap兜底。

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h  # 确认 swap 生效

系统更新

阿里云的服务器默认使用的就是阿里云源,不需要换源。

sudo apt update && sudo apt upgrade -y

配置安装LNMP

Linux + Nginx + MySQL + PHP
需要注意版本号尽量和Ubuntu系统版本号对应上。

安装 Nginx

nginx version: nginx/1.24.0 (Ubuntu)
sudo apt install nginx -y
sudo systemctl enable --now nginx
sudo systemctl status nginx

安装 PHP 8.3

sudo apt install php8.3-fpm php8.3-common php8.3-mysql php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip -y
sudo systemctl enable --now php8.3-fpm
sudo systemctl status php8.3-fpm
php -v
PHP 8.3.6 (cli) (built: Jul 16 2026 18:30:41) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.6, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies

安装 MariaDB

sudo apt install mariadb-server -y
sudo systemctl enable --now mariadb
sudo mysql_secure_installation
Switch to unix_socket authentication [Y/n] Y
Change the root password? [Y/n] n
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
mysql --version
mysql  Ver 15.1 Distrib 10.11.14-MariaDB, for debian-linux-gnu (x86_64) using  EditLine wrapper

登录数据库

sudo mysql -u root

创建数据库

CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY '你的密码';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

每条 SQL 语句结尾的分号 ; 不能漏
'你的密码' 要保留单引号,把中间文字换成实际密码

更换密码

ALTER USER 'wp_user'@'localhost' IDENTIFIED BY '换成一个强密码';
FLUSH PRIVILEGES;
EXIT;

安装WordPress

sudo grep "wp_version =" /var/www/blog/wp-includes/version.php
$wp_version = '7.1';

下载

cd /tmp
wget https://wordpress.org/latest.tar.gz
tar -xzvf latest.tar.gz
sudo mv wordpress /var/www/blog
sudo chown -R www-data:www-data /var/www/blog
sudo find /var/www/blog -type d -exec chmod 755 {} \;
sudo find /var/www/blog -type f -exec chmod 644 {} \;

配置Nginx站点

sudo vim /etc/nginx/sites-available/blog

填实际的公网ip

server {
    listen 80;
    server_name <你的公网IP>;
    root /var/www/blog;
    index index.php index.html;

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

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

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

启用配置:

sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

这样就是没有问题的:

admin@iZuf681i5rahvrljl9zcivZ:/tmp$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

浏览器访问

http://8.133.210.105


登录
取决于之前怎么设置数据库。

安装程序信息可以自己填写,后续可以更改。

插件启用

WP Super Cache

开启防火墙

sudo ufw allow OpenSSH
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

防火墙状态:

admin@iZuf681i5rahvrljl9zcivZ:/tmp$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

域名解析

在腾讯云中添加域名解析
记录值就是服务器的公开ip地址。

如果成功,直接ping域名就会返回云服务器的ip地址。

配置https

需要icp备案完成

评论

大陆的服务器不要做评论功能,如果做也要加上严格的审核。

关闭评论功能

主题配置

主题网站:
https://wordpress.org/themes/

添加第三方主题

需要注意的是,Sakurairo主题,每次有变更都需要控制台删除缓存,否则修改不会同步更新到显示上。

cd /var/www/blog/wp-content/themes
git clone https://github.com/mirai-mamori/Sakurairo.git

安装成功就能在控制台的主题列表看到这个主题。

配置权限:

sudo chown -R www-data:www-data /var/www/blog/wp-content/themes/Sakurairo
sudo chown -R www-data:www-data /var/www/blog/wp-content

备份和恢复

除了iro备份是在游览器中完成,其他的备份都是在服务器上完成,使用了环境变量,请按照文档顺序备份,并且不要更换命令执行的终端。
备份的结果不要存放到服务器上。

iro备份

导出iro配置备份:

数据库备份

创建备份目录

backup_dir="/home/admin/workspace/backups/wordpress-$(date +%Y%m%d-%H%M%S)"

mkdir -p "$backup_dir"
chmod 700 "$backup_dir"

echo "$backup_dir"

会生成类似:

/home/admin/workspace/backups/wordpress-20260825-110846

查看数据库名称和用户

sudo grep -E "define\( *'DB_(NAME|USER|HOST)'" /var/www/blog/wp-config.php

输出类似:

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

导出数据库

把下面三个占位符换成实际内容:

set -o pipefail

mysqldump \
  --single-transaction \
  --quick \
  --skip-lock-tables \
  --no-tablespaces \
  -h 数据库地址 \
  -u 数据库用户 \
  -p \
  数据库名称 \
  | gzip -9 > "$backup_dir/database.sql.gz"
define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wp_user' );
define( 'DB_HOST', 'localhost' );
set -o pipefail

mysqldump \
  --single-transaction \
  --quick \
  --skip-lock-tables \
  --no-tablespaces \
  -h localhost \
  -u wp_user \
  -p \
  wordpress \
  | gzip -9 > "$backup_dir/database.sql.gz"

检查输出是否成功为0

echo $?

校验压缩包:

gzip -t "$backup_dir/database.sql.gz" \
  && echo "数据库备份校验成功" \
  || echo "数据库备份损坏"

同时要注意check此压缩包大小,太小就有问题。

uploads备份

sudo tar \
  -C /var/www/blog/wp-content \
  -czf "$backup_dir/uploads.tar.gz" \
  uploads

修改文件权限:

sudo chown admin:admin "$backup_dir/uploads.tar.gz"
tar -tzf "$backup_dir/uploads.tar.gz" >/dev/null \
  && echo "uploads 备份校验成功" \
  || echo "uploads 备份损坏"

wp-config.php

需要注意,这个用到的备份目录在数据库备份中设置,请保持终端不变。

sudo cp -a /var/www/blog/wp-config.php "$backup_dir/wp-config.php"
sudo chown admin:admin "$backup_dir/wp-config.php"
chmod 600 "$backup_dir/wp-config.php"
cd "$backup_dir"

sha256sum database.sql.gz uploads.tar.gz wp-config.php > SHA256SUMS
sha256sum -c SHA256SUMS

最终校验

admin@iZuf681i5rahvrljl9zcivZ:~/workspace/backups/wordpress-20260825-110846$ cd "$backup_dir"

sha256sum database.sql.gz uploads.tar.gz wp-config.php > SHA256SUMS
sha256sum -c SHA256SUMS
database.sql.gz: OK
uploads.tar.gz: OK
wp-config.php: OK

测试环境

我使用的主题是

https://github.com/mirai-mamori/Sakurairo.git

但是这款主题不支持侧栏功能,因此我决定fork这个主题项目进行开发。就需要同时开发一个测试环境开发。

正式站
├── 目录:/var/www/blog
├── 数据库:wordpress
└── 主题:正式版 Sakurairo

测试站
├── 目录:/var/www/blog-staging
├── 数据库:wordpress_staging
└── 主题:feature/home-sidebar

开发仓库
└── /home/admin/workspace/Sakurairo

为了避免污染和方便ai开发,测试环境使用windows。

测试站

需要安装软件LocalWP

创建好之后,需要点击Site folder

app\public\wp-content\themes

配置主题源码环境:

git clone git@github.com:shadow-wd/Sakurairo.git
cd Sakurairo

git switch blog-custom
git pull --ff-only

git switch -c blog-dev
git push -u origin blog-dev

配置好主题之后,就需要进入后台启用主题,同时将iro的配置导入进去。
同时要创建几个文章,方便后续开发。

数据库操作

wpcli安装

cd /tmp

wget -O wp-cli.phar \
  https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

测试下载的文件

php /tmp/wp-cli.phar --info

安装为系统命令

sudo install \
  -o root \
  -g root \
  -m 0755 \
  /tmp/wp-cli.phar \
  /usr/local/bin/wp

验证安装情况

command -v wp

数据库查询

cd /var/www/blog

查询数据库版本
查询插件

sudo -u www-data wp core version
sudo -u www-data wp plugin list

查询文章

sudo -u www-data wp post list \
  --post_type=post \
  --fields=ID,post_title,post_status,post_date \
  --format=table

查询图片

sudo -u www-data wp post list \
  --post_type=attachment \
  --fields=ID,post_parent,post_title,post_mime_type,guid \
  --format=table

以文章id号215为例,查看该文章所有图片的hash

sudo -u www-data wp db query "
SELECT
    image.ID AS image_id,
    image.post_title AS image_title,
    file.meta_value AS file_path,
    hash.meta_value AS sha256
FROM wp_posts AS image
LEFT JOIN wp_postmeta AS file
    ON file.post_id = image.ID
    AND file.meta_key = '_wp_attached_file'
LEFT JOIN wp_postmeta AS hash
    ON hash.post_id = image.ID
    AND hash.meta_key = '_source_sha256'
WHERE image.post_type = 'attachment'
  AND image.post_parent = 215
ORDER BY image.ID;
"
此作者没有提供个人介绍。
最后更新于 2026-08-31