AI毛毛的blog

在openSUSE上搭建hexo博客并启用SSL的科学姿势

1. 前言

最近看见 ChicagoVPS在搞活动,没忍住又剁了一个,xen架构的Windows Server 2016,当然,用了一会儿之后,还是给它格掉装了个openSUSE Tumbleweed,毕竟已经习惯了。
闲着也是闲着,一台vps只跑个ss似乎有点浪费,看着硬盘里躺了许久的旧blog存档包,打算重新开始写些东西,就当日常记录用吧。

2. 搭建Hexo博客

之前的旧博客是基于wordpress搭建的,鉴于没有太多有价值的东西,还是让它躺在硬盘里安息吧。
相比起使用了世界上最好的编程语言的wp框架,基于nodejs的hexo轻量了不少,用起来也方便,下面简要记录一下搭建过程。

2.1 openSUSE下环境准备

新装的openSUSE TW Server预装的软件包不多,首先需要手动装一下nodejs和git。(注:目前2020年,最好把nodejs6换成更高版本,例如nodejs12)

1
sudo zypper in git-core nodejs6

2.2 安装hexo并发布

然后使用npm安装hexo主体程序,这里直接用sudo只是为了演示,其实并不友好,推荐先使用官方对于npm的权限说明进行配置。

1
sudo npm install -g hexo-cli

下面建立一个blog文件夹用来作为hexo的根目录,这里使用了openSUSE通用的路径,并设置相应的权限。

1
2
3
cd /srv/www/htdocs
sudo mkdir blog
sudo chown roger:users blog/

接下来将这个blog文件夹初始化。

1
2
3
hexo init blog
cd blog
npm install

生成一篇默认的文章。

1
hexo g

安装hexo server,启用一下看看是否成功。

1
2
npm install hexo-server --save
hexo server

默认端口号是4000,为了方便起见,临时关掉了SUSE的防火墙,访问 http://服务器ip:4000 ,可以看到hexo博客可以访问了。(注:2020年,openSUSE默认的防火墙已经由SuSEfirewall2变成了firewalld)

1
sudo systemctl stop SuSEfirewall2

hexo.PNG

3. 添加域名解析

下面开始给blog加个域名,这里使用的是二级域名blog.imoe.cat,直接使用阿里云的DNS,之前已经配置过A记录,只用给二级域名加个CNAME记录就行了。
dns.PNG
当然,这里也可以使用CDN之类的服务来操作,优化访问速度。

4. 添加SSL证书

这年头,不用个https都不好意思发自己的链接,奈何囊中羞涩,就选用了Let’s Encrypt的免费证书。其实一些CDN服务商也会提供免费SSL证书,例如CloudFlare,方便起见可以优先考虑使用它。

4.1 配置openSUSE环境

openSUSE新系统下,先把pip装上,不然后面会报错。

1
sudo zypper in python2-pip

4.2 使用Let’s Encrypt

然后下载Let’s Encrypt并配置,注意这里要使用root权限,后面按要求输入邮件、域名之类的就可以了,多个域名使用逗号或者空格分开。证书会生成在 /etc/letsencrypt/live/XXX域名/ 的目录里,下面步骤会用到。

1
2
3
cd ~/Downloads/
git clone https://github.com/letsencrypt/letsencrypt
sudo ./letsencrypt-auto certonly --standalone

(可选)如果域名已经配置过Let’s Encrypt证书,这里就无法通过了,先去配置过的机器上删除掉它。

1
sudo ./certbot-auto delete

5. 配置nginx服务器

接下来用nginx作为server,并配置https。

5.1 安装nginx

1
sudo zypper in nginx

将80和443端口加入防火墙例外。

1
sudo emacs /etc/sysconfig/SuSEfirewall2

修改FW_SERVICES_EXT_TCP,将80与443端口加入,即 FW_SERVICES_EXT_TCP="80 443"

5.2 修改nginx的配置

首先修改默认配置文件,主要是配置线程以及压缩方式之类的,注释掉了server内容,server块另行配置,直接上代码。

1
sudo emacs /etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
user nginx nginx;
worker_processes 4;

error_log /var/log/nginx/error.log;

events {
worker_connections 1024;
use epoll;
}

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

sendfile on;
keepalive_timeout 65;
gzip on;

include conf.d/*.conf;
include vhosts.d/*.conf;
}

出于维护的方便性考虑,为blog单独建立一个配置文件,放置server块相关内容。

1
2
3
cd /etc/nginx
mkdir vhosts.d
sudo emacs vhosts.d/blog.imoe.conf

这个配置文件内容如下,可以看出主要内容是将80端口转发到443端口,这样就可以将http访问强制跳转到https了,不过很多CDN服务商会提供这项功能,所以并不一定需要这样写,接下来就是添加了上面步骤生成的ssl证书。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
server {
listen 80;
server_name blog.imoe.cat;
return 301 https://$server_name$request_uri;
}

# HTTPS server
#
server {
listen 443 ssl;
server_name blog.imoe.cat;

ssl_certificate /etc/letsencrypt/live/imoe.cat/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/imoe.cat/privkey.pem;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_prefer_server_ciphers on;

location / {
root /srv/www/htdocs/blog/public/;
index index.html index.htm;
}

access_log /var/log/nginx/imoe.cat.access.log; # 访问日志
error_log /var/log/nginx/imoe.cat.error.log; # 错误日志
}

5.3 启用nginx

先使用nginx -t看看配置文件是否可用,没问题的话就可以启用nginx了。

1
2
sudo systemctl enable nginx                   #开机启用nginx服务
sudo systemctl start nginx #启动nginx

6. 结语

至此,博客已经可以正常访问使用了,具体的blog配置可以参考hexo的官方文档,就希望以后不会再咕咕咕了。