日常折腾时,受初之音大佬的博客的启发,想着自己也可以搭建一个用来整合知识,这样就不用每过一段时间想更新或重新建立一遍曾经搭建好的东西的时候,再从头开始查找资料,甚至书签里保存的网页资料再也打不开。
想到就做,查阅各种资料和视频后,综合来看比较推崇的有Wordpress、Typecho、Halo、Hexo、Hugo,这五款博客框架。前三款是动态博客,后两款是静态博客,区别可以参考ʕ•ᴥ•ʔ Bear Blog。由于大佬用的是Typecho,我想玩点不一样的,所以最先的使用目标是用户数最多,教程最丰富的Worpress。
写在前面,体验过Wordpress、Halo、Hugo后:
- 如果你只想写文,前期想尽可能少的折腾,推荐选择动态博客。听说动态博客容易被攻击(例如进你博客就跳转到小黄网之类的),尤其是基于php的,所以说是前期。
- 在不打算魔改主题的情况下,根据喜欢的主题选择博客框架,不加过多的插件,2核2g的云服务器(通常会选择更小的,我这有点超标了)对于三款来说都是非常流畅,刚需Markdown在Typecho、Halo里选。
- 如果容易对主题中的小细节抓心挠腮,主题给的自定义设置里又没有可以更改的,会php的大佬推荐选择Wordpress,可以后台直接更改css,php文件并预览效果。
- 不怕折腾的选择hexo、hugo,有对于非程序员来说,较为易懂的文件格式,并且能修改代码的同时预览效果。
- 实时预览功能真的非常重要,不然就是修改主题包内的文件,然后频繁的打包上传服务器查看效果再修改,也许有更好的方法,但是我不会,哈哈。
个人推荐就是 优先选主题!优先选主题!优先选主题! 有个喜欢的主题,什么难处都能克服!
前期准备
由于动态网站依托于数据库,所以必须先准备好服务器,根据需求选择是否需要域名。
云服务器
云服务器商可以是,阿里云、腾讯云的轻量应用服务器,比较经济实惠稳定。海外的服务商话,搬瓦工稳定好用,就是贵。双11,黑色星期五之类的节日可能有优惠,可以等这些时间再入手。非活动时间的话按月买更好,因为按年买价格是一样的。
一般大陆服务器可使用的带宽和流量远远小于其他地区的服务器。但是,延迟的话,我所在的区域是大陆<香港<新加坡<东京、首尔<硅谷。
镜像可以按需求选已经搭建好一套应用镜像,也可以单独选一个系统镜像,之后可以重置系统更改,这里我选的Ubuntu24.04
也可以是自家的Nas作为服务器,如果只当笔记本地内网自己看(有公网ip可以绑定域名),那使用Nas最为方便,只需要Docker一键就行。
域名
购买服务器的商家基本也都有域名,购买也非常简单,不多缀述。国内域名必须实名。推荐使用.COM或者其他顶级域名。
如果仅自己使用,可以不需要域名,直接通过ip访问云服务器。
解析域名
如果进入公网,可进入各家的域名控制台,找到对应域名,点击解析
- 记录类型
A,表示将域名指向一个具体的IPV4地址,也就是云服务器的公网地址 - 记录类型
CNAME,表示将其他域名指向另一个类型,比如想输入blog.xxx.com跳转到xxx.com,就需要用到CNAME - 主机记录,填
@,表示没有前缀,比如xxx.com;填任意,如blog,表示blog.xxx.com - 记录值,
A记录填具体的IP地址,也就是云服务器的公网地址,CNAME填指向的域名 - TTL,默认就好,越小对变化反应越快,但会影响解析速度
例如,分别添加@和WWW主机记录,分别设置为A和CNAME,值分别填xxx.xxx.xxx.xx和xxx.com,效果就是进入www.xxx.com自动跳转到xxx.com
配置好后,等待一会便可以通过域名访问你的服务器了。
备案
网站服务器位于中国大陆的需要实名备案,具体方法云服务商都有,非常简单,只是需要等待一段时间。服务器位于其他地区的则不需要备案,可以直接使用。
SSH工具
虽然网页控制台也有网页版的SSH工具可以直接进入服务器,但还是更推荐使用本地SSH工具,更加方便。
我纯外行比较小白,所以看重外观,使用的是Tabby
创建密钥对
为了更方便也更安全的使用云服务器,可以先在服务器控制台创建密钥对,并妥善保存好自动下载到本地的私钥。
然后点进服务器,绑定刚刚的密钥。
新建配置
进入Tabby的配置和连接,点击新建新配置,选择SSH连接
名称分组自定,主机填云服务器的ip,私钥选择刚刚保存的私钥,点击保存
这样以后每次进入服务器操作,都不用输入密码,还更加安全。
服务器配置
服务器系统我选的Ubuntu24.04,也可以选择debain12,更加纯净,能输入的命令是一样的。
配置环境
进入后先更新系统目录,更新系统,安装一些需要的组件
apt update -y && apt upgrade -y && apt install -y curl wget sudo socat
安装docker和docker-compose,并赋予权限,可以非常简单的运行各种打包好的容器,小白友好
curl -fsSL https://get.docker.com | sh
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
创建好存放数据的目录,之后备份只需要备份整个web文件夹就行
cd /home
mkdir web
cd web
mkdir certs
申请证书
为域名申请证书,域名需要有证书才能使用https访问,先安装acme.sh
curl https://get.acme.sh | sh
可以为多个域名申请同一个证书并存在同一个路径下,这里是存在/home/web/cert里,acme.sh会自动创建定时任务每60天重新申请一次证书,非常方便,更多用法可以去acme.sh
~/.acme.sh/acme.sh --register-account -m 你的邮箱 --issue -d 你的域名1号 -d 你的域名2号 -d 你的域名3号 --standalone --key-file /home/web/certs/key.pem --cert-file /home/web/certs/cert.pem --force
Wordpress搭建
Wordpress的主题非常多,而且后台使用起来很简单,想要什么功能,插件里一搜基本都有。因为还没有发过大量的文章,用的也是2核2g的云服务器,所以说的占内存、不流畅、卡顿之类的,还没有遇到过。
但是如果刚需使用Markdown编辑文章,试用了几款插件转换总是会出现各种问题,并不好用,因此才会有下面Halo搭建这一部分。
创建目录
首先给Wordpress创建目录、给数据库创建目录、创建nginx配置文件、编辑docker-compose,注意要在/home/web路径下操作
cd /home/web
mkdir html
mkdir mysql
touch nginx.conf
nano docker-compose.yml
docker-compose配置
将下面的配置信息复制(复制好内容,对着编辑器按鼠标右键就行)进去,按 Ctrl + O 然后按 Enter保存,按 Ctrl + X退出编辑器。也可以在外面编辑好内容通过SFTP替换文件。
配置来源于kejilion/docker,我结合其他几个配置文件添加了redis,详细说明可以看下方 参考资料 里的原视频,讲解的非常详细,利于小白理解原理,感谢大佬!
docker-compose的好处是可以自由组合,整合了Wordpress所需要的所有环境,一键部署。
为了便于理解,我添加了一些注释,可能会有些不对的地方
version: '3.8'
services:
# 用与反向代理,让网站内容可以通过域名显示
nginx:
image: nginx
container_name: nginx
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf # 映射nginx配置文件
- ./certs:/etc/nginx/certs # 映射证书目录
- ./html:/var/www/html # 映射Wordpress目录
# Wordpress基于php运行
php:
image: php:fpm
container_name: php
restart: always
volumes:
- ./html:/var/www/html #映射Wordpress目录
# 数据库,动态框架的内容都是在数据库里
mysql:
image: mysql
container_name: mysql
restart: always
volumes:
- ./mysql:/var/lib/mysql # 映射数据库目录
environment:
- MYSQL_ROOT_PASSWORD=xxxxxx # root用户密码,自行填写
- MYSQL_DATABASE=web
- MYSQL_USER=xxxx # 数据库用户名,自行填写
- MYSQL_PASSWORD=xxxxxxxx # 数据库密码,自行填写,越复杂越安心
# 内存缓存机制,配合Wordpress内的redis插件,提速网站
redis:
image: redis
container_name: redis
restart: always
volumes:
- ./redis:/data
安装Wordpress
从官方源下载Wordpress压缩包,安装解压到/home/web/html文件夹内,并删除下载的安装包(可以根据更新情况替换版本号)
cd /home/web && wget https://cn.wordpress.org/wordpress-6.6.2-zh_CN.zip && sudo apt-get install -y unzip && unzip wordpress-6.6.2-zh_CN.zip -d html && rm wordpress-6.6.2-zh_CN.zip && mv /home/web/html/wordpress/* /home/web/html/
确保进入/home/web目录,安装并启动docker-compose配置的容器
cd /home/web && docker-compose up -d
配置运行环境
进入docker容器,给nginx和php容器赋予使用/var/www/html的最高权限
docker exec -it nginx chmod -R 777 /var/www/html
docker exec -it php chmod -R 777 /var/www/html
进入docker容器,为php安装一些Wordpress需要的扩展
docker exec php apt update && docker exec php apt install -y libmariadb-dev-compat libmariadb-dev libzip-dev
docker exec php docker-php-ext-install mysqli
重启php使新配置生效
docker restart php
配置nginx
因为之前已经映射了配置文件路径,可以使用Tabby,点击右上角的SFTP,进入/home/web目录下,把nginx.conf下载下来
配置内容也是基于大佬的kejilion/nginx,根据自己的情况做了一些修改,添加了针对Wordpress的伪静态
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
client_max_body_size 50m;
#限制50m以内文件可上传
# HTTP server
server {
listen 80; # 监听80端口
server_name xxxxx.com; # 填自己的域名
# HTTP自动跳转到HTTPS,后续根据自己需求,只需要修改HTTPS内的就行
return 301 https://$host$request_uri;
}
# HTTPS server
server {
listen 443 ssl; # 监听443端口
server_name xxxxx.com; # 填自己的域名
http2 on; # 启用HTTP2
ssl_certificate /etc/nginx/certs/cert.pem; # 证书的地址
ssl_certificate_key /etc/nginx/certs/key.pem; # 证书的地址
root /var/www/html; # 网页文件的目录
index index.php;
#rewrite ^/vip.php(.*)$ /vip.php?s=$1 last;
location / {
try_files $uri $uri/ /index.php?$args; # 伪静态功能
}
# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
try_files $uri $uri/ =404;
# PHP-FPM configuration
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
配置完后保存文件上传覆盖,再重启一下nginx容器使新配置生效
docker restart nginx
登录Wordpress
以上部分完成后,输入自己的域名就可以进入Wordpress后台啦
数据库名 web
用户名 填在docker-compose中配置的用户名
密码 填在docker-compose中配置的密码
数据库主机 mysql
表前缀 wp_
之后可以自行探索Wordpress,功能都比较直观,遇到问题可以看我 下一篇文章 ,会分享一些初安装会遇到的常见问题的解决方法。
Halo搭建
由于不原生支持Markdown,插件也不好用,所以试着转了Halo。总体用下来感觉没啥不好,也挺流畅的。
我最后没用单纯是因为,喜欢的主题虽然自定义功能很多,但是不能换字体,一些小细节也没法改。需要去压缩包里修改代码然后上传到主题,然后再预览效果,过程过于繁琐。一点微小的改动需要的操作步骤太多了,所以最后放弃了。
创建目录
首先给Halo创建目录、创建nginx配置文件、编辑docker-compose,注意要在/home/web路径下操作
由于官方给的配置文件数据库和halo是集成在一起的,就不用单独创建数据库文件夹了
cd /home/web
mkdir halo
touch nginx.conf
nano docker-compose.yml
docker-compose配置
复制下面的内容,按 Ctrl + O 然后按 Enter保存,按 Ctrl + X退出编辑器。也可以在外面编辑好内容通过SFTP替换文件。
基于官方推荐的配置,这次使用的是postgres数据库,添加了nginx容器,并根据halo的映射目录更改了对应root的目录
version: "3"
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.20
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./halo/halo2:/root/.halo2
ports:
- "8090:8090"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
environment:
# JVM 参数,默认为 -Xmx256m -Xms256m,可以根据实际情况做调整,置空表示不添加 JVM 参数
- JVM_OPTS=-Xmx256m -Xms256m
command:
- --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
- --spring.r2dbc.username=halo
# PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
- --spring.r2dbc.password=填自己设定的密码
- --spring.sql.init.platform=postgresql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/
halodb:
image: postgres:15.4
restart: on-failure:3
networks:
halo_network:
volumes:
- ./halo/db:/var/lib/postgresql/data
healthcheck:
test: [ "CMD", "pg_isready" ]
interval: 10s
timeout: 5s
retries: 5
environment:
- POSTGRES_PASSWORD=填上面自己设定的密码
- POSTGRES_USER=halo
- POSTGRES_DB=halo
- PGUSER=halo
nginx:
image: nginx
container_name: nginx
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./certs:/etc/nginx/certs
- ./halo:/var/www/halo
networks:
halo_network:
确保进入/home/web目录,安装并启动docker-compose配置的容器
cd /home/web && docker-compose up -d
nginx配置
先查询一下容器的内部ip地址,记录下来
ip addr show docker0
因为之前已经映射了配置文件路径,可以使用Tabby,点击右上角的SFTP,进入/home/web目录下,把nginx.conf下载下来
配置内容基于上面Wordpress的配置修改,用以适配Halo
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
client_max_body_size 50m;
# 上传限制参数50m以内文件可上传
# 将之前查询到的halo容器ip地址替换下面,官方文档里的
upstream halo {
server 172.xx.x.x:8090;
}
# HTTP server
server {
listen 80; # 监听80端口
server_name 填自己域名;
# HTTP自动跳转到HTTPS,后续根据自己需求,只需要修改HTTPS内的就行
return 301 https://$host$request_uri;
}
# HTTPS server
server {
listen 443 ssl; # 监听443端口
server_name 填自己域名;
http2 on; # 启用http2
ssl_certificate /etc/nginx/certs/cert.pem; # 证书的地址
ssl_certificate_key /etc/nginx/certs/key.pem; # 证书的地址
root /var/www/halo; # 网页文件的目录
# 用来获取Halo内部容器地址,官方文档里的
location / {
proxy_pass http://halo;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
try_files $uri $uri/ =404;
}
}
配置完后保存文件上传覆盖,再重启一下nginx容器使新配置生效
docker restart nginx
登录Halo
以上部分完成后,输入自己的域名就可以进入Halo后台啦,可以看到Halo甚至比Wordpress简单了很多。
没有什么需要特别注意的,内容都可以自己设定,先自己探索吧!
一些总结
备份的话直接备份整个web文件夹就好。
看着内容不多,实际自己折腾了好几天,主要是不想使用一键包或者面板之类的,想要理解每段代码的原理,花费了比较多的时间。但是弄懂了之后,后期自己修改起来就方便了很多,就比如Halo的nginx配置就是我自己修改的,搭建也更为顺利,中途也没有太多的卡住出现问题。
体会到了Linux使用代码的方便,操作过一次后,记录下使用的代码,组合成一长串命令,以后再使用就可以复制然后一键执行,非常畅快。
在这之前只会用群晖的Docker下载使用容器算是比较熟练,感觉自己又变强了一点,开心!