PikaPods+Cloudflare托管Ghost

PikaPods+Cloudflare托管Ghost

其实Pikapods真的是非常好的应用托管服务,真的是太方便了,而且价格非常便宜,且不说Ghost博客的部署难度,仅仅不到2美金一个月的价格,能用上丰富的开源网络应用,实在是良心产品。

PikaPods - Instant Open Source App Hosting
Run the finest Open Source web apps from $1/month, fully managed, no tracking, no ads, full privacy. Self-hosting was never this convenient.

当然一分钱一分货,PikaPods并没有多少数据中心可选,目前就欧洲和美国两个地区,直接连接到国内那速度真的很慢。最近在翻阅Noted大神的博客的时候,读到下面内容,原来他老人家也将博客迁移至PikaPods了:

That being said, what I wouldn't consider so much as self hosting, is stuff like Dropbox, or completely online setup things, like the ghost blog from Ghost, or a Wordpress site from Wordpress. Technically, even my ghost blog that is hosted on Pika Pods. I don't have to go in and manage it, it is a completely managed service and therefore am I really managing it myself?

Self Hosting 101 - Oops we have to learn what we break!
From homelab to cloud hosted VPS. Self-hosting has many meanings! Which one is for you?

我很好奇于是去测试了一下他的博客速度,居然还不错,而且是Cloudflare托管的。于是我又去查了一下官方文档,PikaPods也是可以被Cloudflare代理的,这完全是被我之前一直使用的Gcore CDN带偏了嘛,Gcore就不能代理cname

Connect, Protect and Build Everywhere
Make employees, applications and networks faster and more secure everywhere, while reducing complexity and cost.

于是很快就把代理挂上,总体来说,代理后的网站连接速度确实是更稳定。

相关配置

其实如果只是Cloudflare默认的代理配置,对整体的优化还是不够好,也就是说,你会得到一个很奇怪的网络连接速度,时快时慢不稳定,且服务器端也会受到连接情况的影响,也就是说并没有完全的静态化。那么就要参考下面这篇文章的办法了:

Speed Up A Ghost Blog Massively By Proper Cloudflare Caching
Boost the performance of a Ghost Blog massively with proper caching in Cloudflare CDN. Use Full Page caching without Compromising any Features

Full-Cache: Blog: with full cache (what we deployed here)
No-Cache: Blog: bypassing all off Cloudflare ( No CDN at all )
Dynamic Cache: Blog with dynamic cache (what can be done from the dashboard, i.e. caching all static content no dynamic content)

文章提到Cloudflare的两种Cache方式,默认的时动态缓存,其实这对于提升网站的速度还是不够理想的,然后提出部署一个worker来强制未登录用户缓存页面所有内容,登录用户只缓存静态文件。

Caching everything for logged-out users
Caching only static assets for logged-in users

配置Worker

Workr的部署有两个步骤,代码本身也是文章作者的,我就记录在下面,以备不时之需:

全站缓存worker代码

addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request, event));
});

async function handleRequest(request, event) {
const url = new URL(request.url);
const cookies = request.headers.get('Cookie') || '';
const hasMembersCookie = cookies.includes('ghost-members-ssr=');
const hasAdminCookie = cookies.includes('ghost-admin-api=');

const isAdminPath = url.pathname.startsWith('/ghost/');
const isPreviewPath = url.pathname.startsWith('/p/');
const isSitemapXml = url.pathname === '/sitemap.xml';

const isCacheable = url.pathname.endsWith('.css') ||
url.pathname.endsWith('.js') ||
url.pathname.match(/\.(png|jpg|jpeg|gif|svg|webp)$/i);

if (hasMembersCookie || hasAdminCookie) {
if (isAdminPath || isPreviewPath || isSitemapXml || !isCacheable) {
return fetch(request);
}

const cache = caches.default;
let response = await cache.match(request);

if (!response) {
response = await fetch(request, { cf: { cacheTtl: 1209600, cacheEverything: false } });
event.waitUntil(cache.put(request, response.clone()));
}

return response;
}

if (isAdminPath || isPreviewPath || isSitemapXml) {
return fetch(request);
}

if (request.method === 'POST') {
return fetch(request);
}

const cache = caches.default;
let response = await cache.match(request);

if (!response) {
response = await fetch(request, { cf: { cacheTtl: 1209600, cacheEverything: true } });
event.waitUntil(cache.put(request, response.clone()));
}

return response;
}

配置路由

在Worker的设置页面,找到触发器,将默认的路由禁用,然后将你的网站的域名跟上面部署的worker关联起来就可以了。

自动清除缓存

上面的配置当然就可以让你的网站以静态的方式展现给广大的网友了,只是,如果你的博客有更新,这就很麻烦,需要你在Cloudfare控制面板的缓存页面手动清除缓存,解决办法:

1.按照下面的方法配置worker来实现

Purge Cloudflare Cache Without Visiting Dashboard -URL
let’s create a streamline procedure to purge the cache so that when we will visit one specific URL the Full Cloudflare cache will be purged

如果按照这篇文章来配置,就可以实现自动化清除缓存。

.1 首先是新建一个worker,配置好代码并部署:注意,需要替换YOUR_ZONE_ID,YOUR_EMAIL和YOUR_API_KEY(此处为Global API Key

自动清除缓存worker代码

addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
const { pathname } = new URL(request.url);

// Check if the request is to trigger full cache purge
if (pathname === '/purge-full-cache') {
// Purge the entire Cloudflare cache
const purgeResponse = await fetch(`https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/purge_cache/`, {
method: 'POST',
headers: {
'X-Auth-Email': 'YOUR_EMAIL',
'X-Auth-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({ purge_everything: true }),
});

if (purgeResponse.ok) {
return new Response('Full cache purge initiated successfully.');
} else {
return new Response('Failed to initiate full cache purge.', { status: 500 });
}
}

// Handle other requests here if needed
return new Response('Not Found', { status: 404 });
}

.2 部署好wordker后,cloudflare会给一个worker的网址,在网址后面加上/purge-full-cache,因为上面的代码里面就是这么写的。然后在浏览器里面打开这个连接,如果提示Full cache purge initiated successfully.那么恭喜,你的这个自动清除连接的worker就部署成功了,以后网站有了更新,就可以直接点击这个连接清除缓存了。注意,这里是清除全部缓存

.3 Ghost配置自动更新缓存。这个是集成在Ghost控制面板里面,通过合理的配hi可以实现文章更新、修改等多种任务触发条件下自动清除缓存,其逻辑也很简单,就是配置好一个触发器(例如新发布文章),这个触发器就会调用上面那个网址,而这个网址的就能实现自动清除缓存。

在Ghost后台的Integrations新建一个项目,取个名字,然后点击Add webhook。

这里就可以配置你想要的触发条件,然后把上面的清除缓存的连接粘贴过去。

我的建议,这里主要涉及的是对外展示的静态版面,不需要太多的触发条件,重点就是:新发布文章、撤回发布的文章、已发布文章更新这三种情况,把这三个触发条件均配置好清除缓存的链接,那么就可以比较稳妥地使用这个服务了。

2.配合chrome插件来实现,也就是Cloudflare Purge Plugin。

The home page of the Cloudflare® purge browser extension
The home of the Cloudflare® purge browser extension.
CloudFlare Purge Plugin
This extension can purge the CloudFlare cache for the current page of your CloudFlare enabled website

配置也比较简单,需要按照官方的指南,去Cloudflare后台增加一个用户 API 令牌。

然后把token复制粘贴至插件选项里面,就成功了。打开一个有更新的页面,点击插件的Purge current page后,刷新页面就可以了。这个相对而言,就非常实用,属于是非常直观的操作。 

性能测试

这是我最喜欢的内容了,因为这个是用数据说话,但是,毕竟网络环境是有差异的,要搞点小动作也是很轻松的,不过我可是本着实用主义来的,保证测试结果的真实。

其实未挂Cloudflare代理前,我用的是Gcore的Dns解析的,然后虽然网站能打开,但是某些场景确实很慢,尤其是加载图片。当然我也做了一些测试,结果确实是很糟糕,当然跟我的配置有关系,我是用的最低配置来运行ghost的,也就是0.5cpu,0.5G内容的性能配置。当然,把配置调整未1cpu、1G内容,那么就会稳定很多。不过在Cloudflare全站缓存的情况下,也没有区别了,因为网速真的就取决于你的电脑跟Cloudflare的连接情况了。

ITDog

代理前:

代理之后(默认缓存静态文件)

全站缓存

SpeedVitals

Login to SpeedVitals Account
Login to SpeedVitals Account to get access to your account and manage your websites.

HTTPHeader

这个也是我很关心的一个配置,在Cloudflare上面也可以很方便地进行配置。参考文章:

CloudFlare Content-Security-Policy Example
How to add a content security policy headers to a CloudFlare site

配置

在Cloudflare控制面板,定位:规则→转换规则→修改响应头,然后按照实际需求添加即可。

测试

Analyse your HTTP response headers
Quickly and easily assess the security of your HTTP response headers

还是在这个网站进行测试,如果你不知道怎么选择响应头,可以去看一下其他网站是怎么配置的,这里你可以测试所有能打开的网站。

相关内容

PikaPods - Instant Open Source App Hosting
PikaPods is an all in one solution to use open source applications with a push of a button. From the same company that brought you Borgbase.

Read more

如何在PC上优雅地使用微信读书

如何在PC上优雅地使用微信读书

关注公众号 Typenode数字生活笔记,发现更多文章。 这个题目是突然想到的,不过里面的内核确实经过我长期实践的,我觉得是完全 值得推荐给诸位看官的。 微信读书,一款国民级的读书app,目前已经是我唯一一款在用的读书app,事实上我的京东plus赠送了一个京东读书app会员,但是当我打开后,真的是非常劝退的。还是老老实实用微信读书吧。 微信读书的手机端体验非常好,好到无以复加,但是总还是有一些场景需要在 电脑端看看书什么的,那么就可以尝试以下几种方案。 1.电脑端微信读书小程序 这个是微信电脑端直接打开的小程序,这个小程序在手机微信也可以直接打开,主打快速阅读,零负担(很多人对于安装app是非常反感的),那么就可以尝试在小程序里面使用微信读书。 当然,电脑版的也是 手机端的样子,就是那种竖屏的,很小,电脑上看将就吧。电脑端是双屏的,但是这个双屏并不好, 或许以后能双屏阅读书籍就好了。 2.网页版微信读书 微信读书微信读书提供海量正版书籍、小说、漫画、公众号、听书,多设备同步实现跨屏阅读。与微信好友一起发现更多精品好书,随时交流感想,让阅读不

自建观影库?试试Capacities吧

自建观影库?试试Capacities吧

关注公众号 :Typenode数字生活笔记,发现更多文章。 自建观影库,其实有很多很多方案,且不讨论其他软件如何好,这里推荐一百种方法中的一种,凡事开心就好,建库那也是要越简单越好。 笔记工具:Capacities Capacities – A studio for your mindA powerful note-taking tool. All your ideas – typed and connected. 影视库来源:豆瓣 豆瓣电影豆瓣电影提供最新的电影介绍及评论包括上映影片的影讯查询及购票服务。你可以记录想看、在看和看过的电影电视剧,顺便打分、写影评。根据你的口味,豆瓣电影会推荐好电影给你。 第一步就是要创建一个Weblink(网络链接)的类型 1. 注册Capacities并登录 2.新建一个空间,或者直接用默认空间 3.新建一个type 4.选择Weblink 5.创建Weblink类型 第二步,

还在用ToDesk?试试远程桌面软件GameViewer,网易出品、高清画高刷、免费,都是你想要的

还在用ToDesk?试试远程桌面软件GameViewer,网易出品、高清画高刷、免费,都是你想要的

远程桌面工具挺多的,比较好用的确实是ToDesk,但是免费版限制太多,也就是应急用用罢了。当然还有其它工具,包括RayLink、Parsec、QuicDesk等,还有直接在浏览器上使用的URDP,都是不错的远程工具。这里推荐网易出品的远程桌面工具GameViewer。具备高清画质、超低延迟等特性。 启动应用 界面那可是相当大气,如果被控电脑在线,那么就会出现上图的这个样子,你不仅可以直接进入被控电脑桌面,还可以直接通过这个界面打开应用程序。 切换设备 点击右边的切换设备,就会得到下面这个界面,这里你可以切换登录过的设备。 远程画质 把传输画质调到原画20M,同时分辨率调制控制端一致,基本上,静态的画面和画质真的是非常厉害,稍不注意你真的很难发现这是远程桌面的画面。当然,毕竟是远程,动态操作一下,就会发现还是有一些延迟,不过真的还是相当好了。远程桌面除了协议本身,两台电脑之间的网络连接情况其实是非常非常重要的因素,尤其是被控端的上传一定是要达到相应的速度才能得到理想的效果。 动态帧率 虽然可以设置30、60、90、144这几个挡位的帧率

还在等Notion离线版?试试Capacities

还在等Notion离线版?试试Capacities

Notion在国内使用最大的问题,就是动不动就转圈圈,这个网络连接真的很让人崩溃。离线版的Notion最近被提上日程,不过还在开发阶段,上线得2025年了。不过,Capacities已经上线离线版,极大地提升了易用程度,可以说,我是被Capacities的网络劝退的,也是因离线版回归的。 2024年5月,Capacities发布了一篇简短的博客,内容是《Why Capacities will become offline-first(为什么Capacities将变为离线优先)》,这篇文章对离线模式的说明非常简单,就是用户需要离线使用Capacities,就这么简单,当然,离线模式的功能还在逐渐完善中。 Why Capacities will become offline-firstWe recently committed to transforming Capacities into an offline-first application. This was a big step, and here’s why. 官方文档也对离线模式进行了详细说明,