Ghost 博客部署,我的最爱

Ghost 博客部署,我的最爱

♥️ 强烈推荐 Ghost 博客,我的最爱,之前断断续续瞎折腾过几个博客,始终没有找到合适的,中间还一度自己做了个博客的版本,直到我用上了 Ghost blog,我就停止了折腾。

1️⃣ 主题市场很精美且丰富,超过绝大部分竞品

2️⃣ 开源: 可以在自己的 VPS 上直接部署,完全可控

3️⃣ 性能强大,博客编辑,后台设置,功能非常丰富

4️⃣ SEO 友好,支持 Code 嵌入,三方插件集成,如 Stripe, Zapier 等

5️⃣ 邮件订阅支持,Stripe 支付接入,可以对订阅收费

优点

Ghost 是非常完善的博客系统,也是基于 Nodejs 开发的,不仅提供了 Cloud 版本,也提供了开源版本,当前我这个站点用的就是 Docker 部署的 Ghost,非常方便,弄个 VPS,直接一年省去大几百的费用。

部署过程

我是在 VPS 上使用 Docker + Nginx 进行部署的,SSL 证书是从 Cloudflare 上申请的,可以参考我的文章[Cloudflare 的免费 SSL 证书,可用 15 年 🤩],域名是在 NameSilo 注册的,VPS 是购买的 Hostinger , 推荐注册入口

自部署 Ghost 安装文档入口

Tips: 注意这里对于 Ubuntu 文档,只支持到 22.04 LTS,现在我的服务器在 24 版本了,我按照 Ubuntu 的这个文档安装,一直在坑里。

这里选择 Docker 安装即可,Ghost 官方镜像地址,对应的配置,如端口、mysql、volume,按需配置即可,Ghost 使用 Mysql 进行数据存储。

version: '3.1'

services:

  ghost:
    image: ghost:5-alpine
    restart: always
    ports:
      - 8080:2368
    environment:
      # see https://ghost.org/docs/config/#configuration-options
      database__client: mysql
      database__connection__host: db
      database__connection__user: root
      database__connection__password: example
      database__connection__database: ghost
      # 这里记得替换为自己的网站地址
      url: https://meepo.me
      # contrary to the default mentioned in the linked documentation, this image defaults to NODE_ENV=production (so development mode needs to be explicitly specified if desired)
      #NODE_ENV: development
    volumes:
      # 如果后续迁移服务器的 image,media 等文件,这里最好挂载一个地址专门存放
      - ghost:/var/lib/ghost/content

  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db:/var/lib/mysql

volumes:
  ghost:
  db:

配置Nginx,配置文件如下,这样可以做到

  • 支持 https 的访问
  • http 自动跳转 https
  • https://www.meepo.me 自动跳转到 https://meepo.me,这一步需要结合 Cloudflare 的 www 自动跳转到根域名,参考
  • http 到 https 的自动跳转,然后再结合 Cloudflare 的 www 自动跳转到根域名,这一步需要进行策略配置

首先这里需要 SSL 证书文件,可以参考我的 [Cloudflare 的免费 SSL 证书,可用 15 年 🤩] 去申请一个免费的 SSL 证书,然后存放在服务器,稍后配置在 Nginx 中即可。

然后在 sites-available 文件夹新建 meepo.me.conf 文件

server {
    listen 80;
    listen [::]:80;
    server_name meepo.me www.meepo.me;
    return 301 https://$server_name$request_uri;
}
​
# HTTPS 配置
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name meepo.me www.meepo.me;
​
    # SSL 证书配置
    ssl_certificate /root/ghost/certs/meepo.me.pem;
    ssl_certificate_key /root/ghost/certs/meepo.me.key;
​
    # SSL 优化配置
    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;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
​
    # ... 其他配置保持不变 ...
    location / {
        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 Host $http_host;
        proxy_pass http://localhost:8080;
        
        # WebSocket 支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
​
    location /assets/ {
        proxy_pass http://localhost:8080;
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }
​
    client_max_body_size 50m;
}

然后执行

sudo ln -s /etc/nginx/sites-available/meepo.me.conf /etc/nginx/sites-enabled/

执行 nginx -t 检查配置文件是否正确,如果 ok 的话,执行 systemctl reload nginx 重新加载 nginx 配置。

Bingo,按照如上配置,你就可以拥有一个和我一样的博客系统了。

Read more

从事 SEO 12 年的大佬总结的要点

从事 SEO 12 年的大佬总结的要点

从事 SEO 12 年后,以下是我能想到的所有 SEO 技巧: 1. 在 H1、H2 和 URL 部分中使用主要关键词。 2. 停止追逐虚荣指标。流量固然重要,但转化率才是最重要的。 3. 内部链接可以将“几乎完成”的页面转变为表现最佳的页面。 4. 定期检查你的网站是否有坏链接,这是一个简单的 SEO 胜利。 5. Google Search Console 是您最好的朋友,使用它来重新优化排名在第 3-7 位的页面。 6. 90% 的反向链接应来自相关的高权威网站。 7. 速度决定一切——或许应该说,速度不足会扼杀一切。确保加载时间在 2 秒以内。 8. 持续更新内容将帮助你的页面保持更高的排名。 9. 使用 NLP

Pnpm 构建 Monorepo

Pnpm 构建 Monorepo

最近开始搭建 monorepo 的项目,了解到以下方案: * lerna 有强大完善的依赖管理和构建、打包发布流程,而且 v5 版本将 nx 与 lerna 整合了,提升了性能和速度 * 业界大多使用 lerna + yarn workspace 的方式来管理,yarn 用来管理依赖,lerna 用于管理发布 之前简单使用过 lerna ,不过再加上 yarn workspace , 学习容多、配置多又得折腾,太费劲🤪,暂时搁置。 最终尝试使用单一的 pnpm workspace + changesets 的方式来构建 monorepo,本身我就使用 pnpm 作为包管理工具,目前我的场景简单,pnpm 就已足够。 本文记录自己使用 pnpm workspace 搭建 monorepo

HTTP Web 缓存总结

HTTP Web 缓存总结

友情提示:缓存什么的,是完全依赖相关http header头信息来标记和判断的 缓存读取顺序: 首先读取本地缓存,如果条件满足就取本地缓存,否则往后走代理缓存,同理,条件满足就是从代理缓存取资源(可能存在多级代理缓存) 如果一条链路上的资源都不符合,那么就去源服务器获取 缓存优先级:Cache-Control > Expires > Etag > Last-Modified 缓存的分类和优先级 * 强缓存 状态码 200 (比如 200 (from cache)) * Expires 服务器下发的绝对时间,而判断的时候以浏览器时间为准,客户端和服务器有可能会不一样 * Cache-Control 相对时间,以客户端相对时间为准 * 协商缓存 状态码 304 * Last-Modified If-Modified-Since * Etag If-None-Match 强缓存优先级高于协商缓存,强缓存不会询问服务器,直接使用缓存。协商缓存会询问服务器关于文件的可用性 对于传输过程中的中间节点,本文都称为代理服务器,包括proxy、

关于 Webpack 使用 Babel 与 Vite 使用 ESBuild 的一些思考

关于 Webpack 使用 Babel 与 Vite 使用 ESBuild 的一些思考

虽然 Vite 是基于 esbuild 构建的,并且 esbuild 在构建速度上有显著优势,但 Webpack 目前并没有直接使用 esbuild 构建的原因涉及多个方面,主要是 架构设计差异、功能需求 和 兼容性 等问题。下面是一些关键的原因: 1. Webpack 的复杂性与扩展性 • Webpack 的高度可扩展性:Webpack 的设计目标是一个 高度可配置和可扩展的打包工具。它提供了丰富的插件和 loader 机制,支持各种复杂的构建需求(如代码分割、热更新、各种资源处理等)。这些功能要求 Webpack 必须具备更细粒度的控制能力,而 esbuild 的设计理念相对简化,主要关注高速构建和基本的模块转换功能。 • Loader 和 Plugin 系统:Webpack 的强大之处在于其 loader 和