本地环境:Windows 11,Node.js v26.8.1,npm 12.0.2,Git 2.55.0,Hexo 8.1.2
云服务器:26.04.1 LTS,nginx 1.31.5,Git 2.53.0

为了降低搭建个人静态网站的难度,本文介绍以Hexo 静态框架构建博客并推送到云服务器的参考实例。

在此之前,你必须大概了解windows 终端的使用知识。

在本地建立Hexo博客

安装Node.js和Git

如已安装请略过此节

  1. 在本地建立博客之前需要安装相关环境,Hexo 是基于Node.js开发的,因此首先要安装Node.js 环境,请点此下载安装。

  2. 接着安装Git,git 在之后将本地博客同步到服务器时需要用到,网址点此

安装完成后请验证,node -vnpm -v以及git --version。接着在终端配置一下git 的用户信息:

git config --global user.name "xxxxxx(自定义名字)"
git config --global user.email "xxxxxx(自定义邮件地址)"

本地构建Hexo博客

Hexo的官网配置文档点此,请仔细阅读开始使用基本操作两部分内容,这将帮助理解hexo 的框架结构。

全局安装Hexo 框架,在终端中输入npm i -g hexo-cli,为了便于插件升级还需全局安装npm-checknpm-upgrade,安装命令npm i -g npm-checknpm i -g npm-upgrade

接下来在本地硬盘任意位置新建一个目录存放博客网站,终端定位到这个目录并用Hexo初始化它:hexo init,初始化成功后运行hexo s启动本地服务器代理,在浏览器中输入http://localhost:4000/即可看到最初的博客框架。

Hexo 初始样式

初始主题比较简洁,不过官方提供用户上传和下载其他主题来进行优化点此

站点远程部署

部署到Github或者Gitlab

关于该种部署方式详见官方文档,有比较详细的介绍资料。

部署到云服务器

获取云服务器

如果需要把网站部署到云服务器,那么首先需要有一个域名和一台云服务器。域名和服务器可以到云服务商(阿里云、腾讯云等等)网站上进行购买,具体信息可以用搜索引擎搜索一下。

如果使用的是国内服务器还需要进行网站备案,不过不备案也不影响部署博客本身。

本文使用阿里云ECS服务器作为示例

获取到服务器后,首先需要安装系统(一般在购买服务器时就会要求选择系统)。本文使用Ubuntu 作为云服务器操作系统,也可以选择CentOS 或者其他的distribution,作为服务器的Linux 分发版本都比较稳定。

云服务器购买成功后,还需要放行部分端口,解除防火墙限制,防火墙设置在服务器的安全规则页面。一般最少需要放行22、80、443 三个端口,80/443 分别作为HTTP/HTTPS 访问端口,22 作为远程连接服务器的端口。

放行防火墙端口

此外还需要进行域名解析,简单理解就是将域名和服务器IP绑定,后续直接用域名就可直接访问服务器上Nginx 反向代理的静态网站。阿里云服务器进入工作台搜索"云解析DNS",添加购买的域名,然后点击右侧"解析设置"进入配置。

需要添加两项纪录,都按图示填写,马赛克区域是你的云服务器公网IP地址。

添加域名

设置云解析

日常连接云服务器需要用到远程控制软件和FTP 文件传输软件,个人用户推荐使用Xshell 和Xftp,它们是免费的,下载地址点此

远程进入云服务器系统后,进行更新:apt-get updateapt upgrade,然后重启一遍服务器。

SSL证书(可选)

HTTPS协议是由SSL+HTTP协议构建成的加密传输协议,因此安全性远超HTTP协议。为了保证信息安全我们应当尽可能使用HTTPS协议,当然如果不用也可以顺利部署,这部分是选读。SSL证书是使用HTTPS协议所必须的,各大域名供应商都会提供免费的SSL证书申请。阿里云就提供DV单域名的免费证书,一年可以领取20张证书,证书有效期限也为一年。

在阿里云官网首页搜索数字证书管理服务–>个人测试证书–>个人测试证书(免费)–>立即购买,一次可以免费买20张,然后选择创建证书,点击证书申请,根据提示填写信息,注意代理服务器是Nginx。提交审核后很快就能通过。通过后点击下载,将证书打包下载到本地,同时查看帮助,阿里云给出了具体的配置方法。其他域名供应商提供的配置方法相近,详见具体云服务商的参考文档。

Nginx代理服务器安装配置

Nginx是一个起源于2004年的高性能反向代理和Web服务器应用,由于全世界程序员的贡献这款开源软件至今生命旺盛。Nginx一直专注于低资源消耗、高稳定、高性能的并发处理能力,这与静态博客的部署需求不谋而合。其开源版本的地址在此。开源版本的Nginx有两个版本分支--mainline和stable。mailline版本算是开发版,不仅会对错误进行修复,还会添加一些最新的功能进行测试,mainline版本的第二个数字是奇数。stable版本更适用于生产,它只会修复错误而不会添加新功能,stable版本的第二个数字是偶数。

安装Nginx

安装Nginx 最推荐的方式是通过软件包管理器安装和管理。具体步骤请查看官方教程,那里针对不同系统不同安装方式都有极其详细的安装教程。

这里搬运Nginx 官方关于Ubuntu 系统的包管理安装流程。

  1. 安装必备组件:
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
  1. 导入官方的nginx 签名密钥,以便apt 可以验证软件包的真实性。获取密钥:
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
  1. 验证下载的文件是否包含正确的密钥:
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
  1. 输出应包含完整的签名,如下所示:573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62。如果签名不同,请删除该文件。
pub   rsa2048 2011-08-19 [SC] [expires: 2027-05-24]
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid nginx signing key <signing-key@nginx.com>
  1. 为stable 版本的nginx 设置apt 存储库,请运行以下命令:
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
  1. 如果要使用mainline 版本的nginx,请改为运行以下命令:
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
  1. 存储库固定,以优先选择我们的包而不是分发系统商提供的包:
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
  1. 安装nginx,请运行以下命令:
sudo apt update
sudo apt install nginx
  1. 重启服务器:
reboot

为了使得Nginx 顺利运行,应当放行HTTP 和HTTPS 端口,同时还需放行FTP 端口ufw allow 80/tcp 443/tcp 22/tcp。端口放行完成后运行ufw enable开启防火墙,然后重启服务器。

关于ufw 的用法请查阅该文章(有墙)。而CentOS的端口放行方法请百度:dizzy_face:。

重启完成后请检查Nginx 运行状态systemctl status nginx,如果正常运行应该是显示running

● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Tue 2026-09-15 21:22:06 CST; 3 days ago
Invocation: 39c284baa9034dbba9aabc1e64fa5cc2
Docs: https://nginx.org/en/docs/
Main PID: 15691 (nginx)
Tasks: 3 (limit: 1069)
Memory: 30.4M (peak: 41.6M)
CPU: 10.063s
CGroup: /system.slice/nginx.service
├─15691 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
├─15694 "nginx: worker process"
└─15695 "nginx: worker process"

接着设置nginx 自启动systemctl enable nginx。此时,nginx 应该可以进行代理了,在任意浏览器中输入云服务器的公网IP以及端口http://xxx.xxx.xxx.xxx:80,就应该能见到Nginx的欢迎页面:

welcome to nginx

至此,Nginx 安装成功。

配置Nginx

使用官方提供的方法安装完Nginx 后,它的文件会被自动归类存放在不同的目录中,此时可以使用whereis nginx 命令获取Nginx 所有相关文件的地址。Nginx 的配置文件nginx.conf 地址应该为/etc/nginx/

Nginx 的功能有许多,涉及到的配置也相当复杂,但是如果只把它配置成一个静态Web 服务器,事情会变得简单很多。在该部分,我们只介绍eventshttp 两个块的基础配置,让它成功成为web 服务器,至于涉及到优化或者其他方面的配置,请查阅网络资料或者阅读深入理解Nginx:模块开发与架构解析(第2版)这本书。

配置文件的结构如下:

events{
......
}

http{
......
server{
......
}
}

events 事件管理的块配置项可以使用默认设置无需更改,最重要的修改在http 块配置项中。

Hexo 博客的资源经过构建后推送到服务器中,很显然需要一个目录来存放这些文件,那么这个目录在哪呢?实际上这是由我们自己设定的,这个目录理论上可以在任意位置,但是为了便于管理我们最好将它设置在/home/目录下,比如示例中就在/home/ 目录下新建了一个web 目录(请注意这个目录必须拥有读写权限,可以给777权限mkdir -m 777 /home/web),在下面一节使用Git钩子推送文件时需要用到这个我们自己设定的目录。

http 块中,还需要嵌套两个server 块,这两个块分别对应两个监听端口,分别代理http 和https 协议。这两个块中最重要的参数是监听端口(listen)、主机名称(server_name)和访问首页(index)。

监听端口区分了数据传输协议,默认的80 端口使用HTTP 协议,而443 端口则使用HTTPS 协议;主机名称是网站绑定的域名,在Nginx 收到HTTP 请求时会将header 中的host 提取出来和server_name 作比较,由此来决定使用哪一个server 块来处理请求,当多个server 块都符合要求时,会使用设置好的默认server 块,如没有设置就按照先后顺序选择。

因为是静态网站,所以首页地址是index.html。这三个块是server 块配置项最基本的内容,在HTTPS 端口的server 块配置项中还需要验证SSL 证书,这一点在前面SSL 证书部署部分有详细介绍。

下面给出一个参考配置,其中很多配置都是争对Nginx 做出的优化,这一部分在上面的书籍中的第二章都会有详尽的介绍,建议在配置Nginx 时参考书籍资料,尽可能做出优化:

user  nginx;

##nginx进程数
worker_processes auto;

error_log /var/log/nginx/error.log notice;
pid /run/nginx.pid;


#单个进程最大连接数(最大连接数=连接数*进程数).根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。
events {
worker_connections 1024;
multi_accept on;
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
sendfile on;
#tcp_nopush on;

#长连接超时时间,单位是秒
keepalive_timeout 65;

gzip on;

include /etc/nginx/conf.d/*.conf;

# HTTP server
server {

listen 80;
server_name fflush.cn www.fflush.cn;
index index.html index.htm;

location / {
root /home/web/;
}

return 301 https://$host$request_uri;

}

# HTTPS server
server {
listen 443 ssl default_server;
server_name fflush.cn www.fflush.cn;
index index.html index.htm;

location / {
root /home/web/;
}

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

ssl_certificate /etc/nginx/cert/fflush.cn.pem;
ssl_certificate_key /etc/nginx/cert/fflush.cn.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve X25519:secp256r1:secp384r1;
# TLS 1.3 套件(顺序按效率:AES-128 > AES-256 > ChaCha20)
ssl_conf_command Ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256;
# TLS 1.2 套件(效率从高到低)
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;

}
}

Nginx 配置完成后运行nginx -t命令来检查配置的正确性,如果成功会给出如下提示(如果报错请进入/var/log/nginx/error.log目录查看具体信息):

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

然后再热加载一次配置systemctl reload nginx

Git远程推送资源至服务器

首先在云服务器中安装Git,Ubuntu命令apt install git

要将本地网站资源推送到云服务器,我们需要借助Git 来实现。

为了安全起见我们应该创建一个用户来进行这个操作,同时为了免去同步时输入密码,还需要配置SSH 服务。

  1. 首先在本地生成SSH密钥,在终端中输入:ssh-keygen -t rsa,然后一直回车,系统会在个人文件夹(C:/用户/个人文件夹/)下生成一个.ssh隐藏文件夹,其中的id_rsa.pub是我们所需要的文件,

  2. 进入云服务器端,新建一个名为git的用户:adduser git,然后为它设置一个密码,也可以直接跳过,但是不建议,因为这样的话git的密码就和root一样了。修改密码:passwd git。然后需要给与git用户足够的权限。首先更改/etc/sudoers文件的权限chmod -c 600 /etc/sudoers。然后编辑它:vim /etc/sudoers,加入一个语句git ALL=(ALL)ALL。保存退出后将文件权限改回:chmod -c 400 /etc/sudoers

  3. 切换系统用户为gitsu git,进入根目录新建.ssh 目录cd /home/git/mkdir .sshcd .ssh,打开Xftp 软件,将本地系统的id_rsa.pub文件复制一份到该目录下,然后重命名为authorized_keys。最后修改.ssh目录和authorized_keys文件的权限:sudo chmod -c 644 authorized_keyssudo chmod -c 700 /home/git/.ssh/。(官方给出的教程中anthorized_keys文件的权限应该是600,但是这样设置后本地SSH连接服务器还是要输入密码,将权限改为644 得以解决。)如果设置成功,在本地终端输入ssh -v git@xxx(服务器公网IP),应该会显示连接成功。

  4. 接下来要配置Git钩子。以git用户身份进入根目录cd ~,接着初始化一个仓库,仓库名随机:git init --bare hexo(自定义).git。接着进入仓库的钩子目录:cd ~/hexo.git/hooks,创建编辑post-receive文件:vim post-receive,输入git --work-tree=/home/web/ --git-dir=/home/git/hexo.git checkout -f,这里要注意其中的/home/web/目录就是先前指定的存放网站的根目录,这个需要根据自身情况更改。然后更改post-receive文件的权限,它必须拥有executable权限:sudo chmod -c 775 post-receive

  5. 至此,服务器端配置完成,本地还需要进行一些操作实现正常的推送。进入博客根目录,安装插件hexo-deployer-gitnpm install hexo-deployer-git --save。打开根目录下的_config.yml,查找填写deploy项(如果没有在文件末尾添加):

deploy:
type: 'git'
repo: 'git@xxxxxx(服务器公网IP):/home/git/hexo.git'
branch: 'master'
  1. 最后在根目录运行构建推送命令(在每一次推送网站时都建议先clean掉public目录):
hexo clean
hexo g -d

有关Git 的详细介绍可以阅读git 官方给出的教程Pro Git,本文仅涉及到其中SSH 远程连接和Git 钩子的部分。

至此网站已经部署完成,通过在浏览器中输入域名就能够访问网站。可能在部署过程中会遇到一些问题,但是慢慢尝试就一定能解决它。

搭建网站最复杂的工作已经完成,接下来就是对网站进行美化了,这一部分因主题而异,不能一一介绍,但是每个主题的作者都会有详尽的使用文档,请耐心阅读它们。本网站使用的主题是buffterflyButterfly 官方网站

Others

封面图片由博主在2026 年5 月拍摄于新疆白哈巴

参考资料:

  1. Win10环境下基于Hexo的静态博客环境搭建,及其阿里云部署
  2. 如何在Ubuntu 20.04上使用UFW配置防火墙
  3. 深入理解Nginx:模块开发与架构解析(第2版)请力所能及支持正版