专栏首页陈少文使用镜像部署 Hexo 静态页面
原创

使用镜像部署 Hexo 静态页面

1. 为什么采用镜像独立部署

  • 更好的 SEO

使用 Github Pages ,部署静态网站非常方便。一次配置,每次提交都可以自动部署更新。再加上 jsDelivr、Cloudflare 加速,在免费方案中,已经生产可用。

无奈的是,百度搜索引擎对 Github Pages 网站,收录极慢,甚至不收录。即使利用 Cloudflare 缓存,而 Cloudflare 与百度有合作;主动提交 sitemap ;每个页面添加 push 脚本,依然没有效果。Google、Bing 的收录量好很多,是百度的 4-5 倍。另一种方案是,采用 DNS 多线路解析,给百度爬虫一个专用的 IP 进行 SEO 优化,但是这样又得多部署一套服务。

采用独立主机部署对 SEO 更友好。

  • 更贴近云原生

物理机上,搭建环境的脚本兼容性差,服务也不易维护。云原生时代,当然首选容器,只需要将服务打包成镜像即可。

打包镜像的过程可以直接配置在 CI 中自动完成,而部署过程只是管理一个容器。

好用、易维护,这就是云原生。

2. 打包静态文件服务

Hexo、Jekyll、Hugo 这些静态页面框架,都是通过将 Markdown 渲染生成 Html 对外提供内容服务。在部署时,只需要一个 Nginx 转发静态文件。

2.2 添加 Dockerfile 文件

在项目的根目录添加文件 Dockerfile ,内容如下:

FROM node:10 as builder
RUN npm install -g cnpm --registry=https://registry.npm.taobao.org && \
    cnpm i -g hexo-cli
ADD ./ /home
WORKDIR /home
RUN cnpm i && hexo g

FROM nginx:1.19
ADD ./conf/nginx/default.conf /etc/nginx/conf.d/
ADD ./conf/cert/* /etc/nginx/certs/
COPY --from=0 /home/public /var/www/

通过分阶段构建,可以有效减小镜像的大小。其中 ADD 指令的文件内容,下面会具体说明。

2.2 添加 Nginx 配置文件

在项目下添加如下三个文件:

tree -L 2 conf
conf
├── cert
│   ├── 1_www.chenshaowen.com_bundle.crt
│   └── 2_www.chenshaowen.com.key
└── nginx
    └── default.conf

2 directories, 3 files

其中 conf/nginx/default.conf 文件内容如下:

server {
    listen 80;
    server_name chenshaowen.com www.chenshaowen.com;
    server_tokens off;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name chenshaowen.com www.chenshaowen.com;
    server_tokens off;

    ssl_certificate /etc/nginx/certs/1_www.chenshaowen.com_bundle.crt;
    ssl_certificate_key /etc/nginx/certs/2_www.chenshaowen.com.key;

    location / {
        root   /var/www;
        index  index.html;
    }

    error_page  404              /404.html;
}

这里将 Http 服务转发到 Https,将裸域名的访问转发到 www。

.crt.key 文件是域名的证书文件,很多云厂商都提供了免费的 Https 证书。这里推荐腾讯云的免费 Https 证书,验证简单、签发速度快,还提供下载。

3. Github Actions 自动编译镜像

3.1 新增 Makefile 文件

内容如下:

build:
    docker build -f Dockerfile -t ghcr.io/shaowenchen/documents:latest .

install:
    yum install -y yum-utils
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum install  -y docker-ce-19.03.8-3.el7
    systemctl start docker
    systemctl enable docker
    yum install -y python3-pip
    pip3 install docker-compose

Makeffile 中定义了两个指令,build 用于构建镜像,而 install 用于在物理机上安装 Docker 运行环境。

3.2 定义 CI 编译推送流程

在项目的根目录增加文件 .github/workflows/build.yaml ,内容如下:

name: build

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Build image
        run: make build

      - name: Login Registry
        uses: docker/login-action@v1
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GHCR_TOKEN }}

      - name: Push image
        run:
          docker push ghcr.io/shaowenchen/documents:latest

这里的 secrets.GHCR_TOKEN 需要在 https://github.com/settings/tokens/new 页面创建。

然后添加到项目的 Settings 中,设置为 GHCR_TOKEN 变量值。

4. 部署服务

在示例中,我使用的是 ghcr.io 镜像仓库,如果在国内的服务器上访问不够快,可以更换为阿里云镜像仓库。

将上面的配置提交之后,GitHub Actions 就会自动进行镜像构建和推送,如下图。

在个人主页的 Packages 中,可以看到镜像,如下图。

将镜像改为 Public 之后,就可以免登陆拉取了。下面使用 docker-compose 对服务进行部署。

docker-compose.yml

version: "3"

services: 
  documents:
    restart: always
    container_name: documents
    image: ghcr.io/shaowenchen/documents:latest
    ports:
    - 80:80
    - 443:443

执行命令,启动服务:

docker-compose up -d

更新服务时,先拉取镜像,然后停掉服务,再次拉起即可:

docker-compose pull
docker-compose down
docker-compose up -d

由于只是一个 Nginx 提供静态文件服务,服务的启停都非常地快。

作者: Shaowen Chen

原文链接: https://www.chenshaowen.com/blog/deploy-static-server-by-docker-image.html

更多精彩内容,请关注公众号:问其

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • GitHub Actions 在线调试工具:debugger-action

    GitHub Actions 是 GitHub 在 2018 年 10 月推出的持续集成服务。对于开源项目,免费提供无限时长的构建时间,同时支持 Linux、M...

    陈少文
  • 如何在 Docker 中使用 Docker

    在 CI 中,通常会有一个 CI Engine 负责解析流程,控制整个构建过程,而将真正的构建交给 Agent 去完成。例如,Jenkins 、GitLab 均...

    陈少文
  • 如何给 GitHub Actions 添加自己的 Runner 主机

    在前面的文档中,我对 GitLab 提供的 CI 功能进行了实践,点击查看 。使用 GitLab 的好处是可以私有化部署、无限的私有仓库数量、CI 配置简单、能...

    陈少文
  • CODING 敏捷实战系列课第三讲:可视化业务分析

    今天我为大家介绍可视化业务分析。提到业务分析,是指以文字为主的业务描述文档 SRS,即软件需求规格说明书。在线下培训时,我会让学员做个小互动来直观感受详细的业务...

    CODING
  • ​CODING 敏捷实战系列课第三讲:可视化业务分析

    今天我为大家介绍可视化业务分析。提到业务分析,是指以文字为主的业务描述文档 SRS,即软件需求规格说明书。在线下培训时,我会让学员做个小互动来直观感受详细的业务...

    CODING
  • 笔记记录 | Ubuntu16.04 设置默认root用户登陆

    TeamsSix
  • 让 K8S 在 GFW 内愉快的航行

    K8S(kubernetes) 日渐火爆,但由于出自Google,对GFW内的用户及其的不友好。 而之前的 *.azk8s.cn 全能镜像站,也于 2020年4...

    落跑架构师M
  • Django容器(上): 自定义基础镜像

    某个 Python 项目,基于 Python:3.6 与 Django:1.11 框架开发,希望项目能够容器化,然后可以通过 docker-compose 等工...

    用户1560186
  • K8S 分布式构建 Docker 镜像的一些小技巧

    崔秀龙
  • 国内的Composer全量镜像汇总

    镜像地址:https://mirrors.aliyun.com/composer/

    沈唁

扫码关注云+社区

领取腾讯云代金券