关于技术也折腾了挺久的,有的时候就会觉得的确需要一个很简单使用,后期维护起来又比较方便的博客系统.
考虑了许久,相比较于之前的hexo + github-pages 搭建Blog 系统我还是太懒了, 谁知道以后还有没有兴趣折腾? 技术型太强的东西维护不易啊~
最终选择了 WordPress(Cloud) + Obsidian(Local) 的方案.
需要的工具:
- Cloud Solution:
- Cloud Server (腾讯云方案) + ssl 证书
- Docker 部署 WordPress + Nginx (SSL)
- Local Solution
- Obsidian
- Obsidian Advanced Slides Plugin
- Obsidian WordPress Plugin
Cloud Solution
首先由于我们用的是Wordpress 方案这意味着我们需要我们的一个Cloud server, 这里选择的是腾讯云(主要是便宜) + 域名. 同时要能够https 访问需要搭建Nginx 服务. 这样我们的方案主要是腾讯云下的Wordpress + Nginx 方案. 为了能够方便后期的维护,选择了Docker部署的方案.
Cloud Server + SSL 证书的获取
阿里云、腾讯云、华为云、亚马逊云、谷歌云...大家可以自行挑选合适的套餐购买。
- 腾讯云 轻量应用服务器(主要是便宜), 安装系统直接选Centos(Ubuntu) + Docker 镜像
- 域名注册
- SSL证书申请
Docker 部署Wordpress + Nginx (SSL)
为什么要用Docker 部署Wordpress + Nginx 呢,主要还是希望能够让轻量的应用服务器能够做更多的任务.(如果性能不够再升级下)
如果已经有了Docker , Docker-compose 不用下面这一步(选择+Docker 的镜像就好了...) ,如果没有也不用担心,在cloud server 终端下执行:
# 安装docker
sudo curl -sSL https://get.daocloud.io/docker | sh
# 安装docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
创建持久化目录
# 以 website mingzailao.live 为例
mkdir ~/mingzailao.live
cd ~/mingzailao.live
# 创建mysql 配置目录,mysql 数据目录, wordpress文件目录 ,nginx文件目录
mkdir db db_data wordpress_data nginx
# 创建mysql配置文件
cat > ./db/mysql.cnf << EOF
[mysqld]
explicit_defaults_for_timestamp=true
wait_timeout=86400
interactive_timeout=7200
EOF
# 先启动一个ngninx的镜像
docker run -it -d --name nginx nginx:latest
# 将容器内的/etc/nginx目录拷贝到本地
docker cp nginx:/etc/nginx ./nginx/conf
# 将容器内的/usr/share/nginx/html目录拷贝到本地
docker cp nginx:/usr/share/nginx/html ./nginx/html
# 创建ngnix的日志目录
mkdir ./nginx/log
# 文件拷贝完毕移除ngnix镜像
docker stop nginx
docker rm nginx
然后编辑docker-compose 配置文件
vim docker-compose.yml
version: '3'
services:
nginx:
image: nginx:latest
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf:/etc/nginx:ro
- ./nginx/html:/usr/share/nginx/html:rw
- ./nginx/log:/var/log/nginx:rw
- ./nginx/ssl:/etc/ssl:ro
wpdatabase:
image: mysql:latest
volumes:
- ./db_data:/var/lib/mysql
- ./db/mysql.cnf:/etc/my.cnf
restart: always
environment:
MYSQL_ROOT_PASSWORD: root # 数据库管理员密码,推荐改为强密码
MYSQL_DATABASE: wordpress # wordpress数据库
MYSQL_USER: wordpress # wordpress用户
MYSQL_PASSWORD: wordpress # wordpress用户的密码,推荐改为强密码
wordpress:
depends_on:
- wpdatabase
image: wordpress:latest
volumes:
- ./wordpress_data:/var/www/html
restart: always
environment:
WORDPRESS_DB_HOST: wpdatabase:3306
WORDPRESS_DB_USER: wordpress # 上面配置的mysql用户
WORDPRESS_DB_PASSWORD: wordpress # 上面配置的mysql用户的密码
启动容器
sudo docker-compose up -d
但是现在 Nginx 还没有配置好代理,需要创建一个配置文件
vim ./nginx/conf/conf.d/wordpress.conf
写入以下配置
server {
listen 80;
server_name x.x.x.x; # 此处修改为你的主机IP
location / {
proxy_pass http://wordpress;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 转发host信息
proxy_set_header Host $host;
}
}
重启nginx 容器并访问网站
sudo docker-compose restart nginx
注意此时需要访问的是服务器ip 地址而不是域名,下面才是域名绑定
SSL 证书配置
在腾讯云获取SSL 证书之后上传到服务器,
cp /path/to/xxx.crt ./nginx/conf
cp /path/to/xxx.key ./nginx/conf
curl https://ssl-config.mozilla.org/ffdhe2048.txt > ./nginx/conf/dhparam.pem
对 ./nginx/conf/conf.d/wordpress.conf 修改
server {
listen 80;
listen [::]:80;
server_name _;
server_name mingzailao.live www.mingzailao.live; # 这里改为自己的域名
location / {
return 301 https://mingzailao.live$request_uri; # 这里改为自己的域名
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name mingzailao.live www.mingzailao.live; # 这里改为自己的域名
location / {
proxy_pass http://wordpress;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
ssl_certificate 1_mingzailao.live_bundle.crt; # 这里改为自己的ssl证书
ssl_certificate_key 2_mingzailao.live.key; # 这里改为自己的ssl证书密钥
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
ssl_dhparam dhparam.pem;
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
# verify chain of trust of OCSP response using Root CA and Intermediate certs
ssl_trusted_certificate 1_mingzailao.live_bundle.crt; # 这里改为自己的ssl证书
# replace with the IP address of your resolver
resolver 8.8.8.8;
location ~* /xmlrpc.php {
deny all;
}
if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}
if ($request_method !~ ^(GET|PUT|HEAD|POST|OPTIONS)$ ) {
return 444;
}
}
重启Nginx 即可通过https 访问
sudo docker-compose restart nginx
Local Solution
在本地主要的需求有两个
- 快速的Presentation制作
- Blog 的发布
这两个功能通过 Obsidian 都可以完成的比较好, 其中通过Obsidian + Advanced Slides Plugin 制作 Presentation可以参见 Obsidian制作presentation. 可以通过同样的方式配置Wordpress 插件实现Blog 的快速发布. 或者用MWeb 编辑器做blog 的发布亦可.