Zblog 自用优化与安全设置

Photo by Sid Verma

因为备案的原因,服务器从深圳迁移到了香港,入手 1C1G1M 的 “乞丐版” 配置,阿里云的海外服务器价格和国内差别不大,但带宽费用是真的贵。经过几天的爬文优化,终于把首页加载时间控制到 300ms 以下。

DOM TIME

选择服务器

写了个简单的批处理测试这些阿里云线路的响应时间,将以下内容另存为 ping.bat 后双击运行。脚本会在 D 盘根目录下生成 result.txt,从测试结果来看香港线路速度很不错,与华南线的速度差不多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ping oss-cn-qingdao.aliyuncs.com >> D://result.txt
ping oss-cn-beijing.aliyuncs.com >> D://result.txt
ping oss-cn-zhangjiakou.aliyuncs.com >> D://result.txt
ping oss-cn-huhehaote.aliyuncs.com >> D://result.txt
ping oss-cn-hangzhou.aliyuncs.com >> D://result.txt
ping oss-cn-shanghai.aliyuncs.com >> D://result.txt
ping oss-cn-shenzhen.aliyuncs.com >> D://result.txt
ping oss-cn-hongkong.aliyuncs.com >> D://result.txt
ping oss-ap-southeast-1.aliyuncs.com >> D://result.txt
ping oss-ap-southeast-2.aliyuncs.com >> D://result.txt
ping oss-ap-southeast-3.aliyuncs.com >> D://result.txt
ping oss-ap-southeast-5.aliyuncs.com >> D://result.txt
ping oss-ap-south-1.aliyuncs.com >> D://result.txt
ping oss-ap-northeast-1.aliyuncs.com >> D://result.txt
ping oss-us-west-1.aliyuncs.com >> D://result.txt
ping oss-us-east-1.aliyuncs.com >> D://result.txt
ping oss-eu-central-1.aliyuncs.com >> D://result.txt
ping oss-eu-west-1.aliyuncs.com >> D://result.txt
ping oss-me-east-1.aliyuncs.com >> D://result.txt

使用 OSS 做图床

登录控制台,在 OSS 中新开一个香港区域的 bucket,选择标准储存公共读,做以下基本设置:

  1. 防盗链白名单填写 www.imczw.com,允许空 Referer
  2. 绑定 img.imczw.com 域名,托管 SSL 证书
  3. 图片处理新增 thumbnail 样式,设置固定长宽为 200:150,居中裁剪
  4. 在域名解析里将 img.imczw.com CNAME 到 OSS 的外站域名 img.imczw.com.w.kunlungr.com
  5. 使用 CDN 加速 img.imczw.com,选择图片小类型和 OSS 源站,端口 442,加速区域为中国大陆
  6. 在访问控制增加一个 RAM 账户,分配 AliyunOSSFullAccess 权限,记下 AccessKeyIDAccessKeySecret

CDN 的加速区域可以理解为访客区域,海外服务器如果想提高国内访问速度,加速区域应该选择 国内 或者 全球

完成以上步骤后回到 Zblog 搜索安装 阿里云OSS - Free ,填写上一步的 AccessKeyIDAccessKeySecret,由于 ECS 和 OSS 都在香港,区域节点填写内网地址可以免流量费用,资源访问域名填写 https://img.imczw.com/

Zblog-OSS Plugin

试一试新建文章上传图片,发布后发现图片地址被替换为 https://img.imczw.com/***.jpg 且正常显示,表示 OSS 接入成功

使用 OSS 缩略图

Zblog 站点使用 Lucky 主题,依赖缩略图插件(IMAGE)生成首页文章缩略图,由于 OSS 已经支持缩略图服务,可以取消这项功能,把缩略图服务交给 OSS+CDN 来做

  1. 在主题目录下编辑 theme.xml,找到 IMAGE,删除对应的内容和 HTML 标签,解除主题依赖项
  2. 修改 post-istop.phppost-search.phppost-mult.php 中的 IMAGE:: 代码段
  3. 插件中心关闭并卸载 IMAGE 插件

post-istop.phppost-search.phppost-mult.php,相关代码段,根据以下代码修改:

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
{php}
$temp=mt_rand(1,5);
$temp=$zbp->host."zb_users/theme/$theme/style/img/$temp.jpg";

//通过正则获取文章图片,替换相关IMAGE函数
$pattern="/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png]))[\'|\"].*?[\/]?>/";
$content = $article->Content;
preg_match_all($pattern,$content,$matchContent);
{/php}
<div class="post-box tra">
<div class="post-thumb">
<div class="post-cate tra">
<ul class="post-categories"><li><a href="{$article.Category.Url}" title="{$article.Category.Name}" rel="category tag">{$article.Category.Name}</a></li></ul>
</div>
{if isset($matchContent[1][0])} // 替换相关IMAGE函数
<a href="{$article.Url}" rel="bookmark" title="{$article.Title}">

//将{$atical.IMAGE[0]}替换为{$matchContent[1][0]}-thumbnail
<img class="scrollLoading" src="{$host}zb_users/theme/Lucky/style/image/grey.gif" data-original="{$matchContent[1][0]}-thumbnail" title="{$article.Title}" alt="{$article.Title}" />
</a>
{else}
<a href="{$article.Url}" rel="bookmark" title="{$article.Title}">
<img class="scrollLoading" src="{$host}zb_users/theme/Lucky/style/image/grey.gif" data-original="{$temp}" title="{$article.Title}" alt="{$article.Title}" />
</a>
{/if}
<div class="clear"></div>
</div>

伪静态处理

ZBlog 自带静态管理中心,选择伪静态之后,在底部选择各个页面的 URL 配置,然后切换到 rewrite 规则,将内容复制到 nginx.conflocation / { } 节点。oneinstack 默认的配置文件在 usr/local/nginx/conf/rewrite/other.conf

1
2
3
4
5
6
7
8
9
10
11
location / { 
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}

静态加速缓存

在应用中心搜索 SuperCache全站缓存,开启 mod-rewrite 方式的文件缓存,并更新 other.conf 的重定向规则,可以在一次访问后自动生成静态缓存文件,将 SQL 调用降低到 0,但同时增加了磁盘 IO,可以根据业务需要自行处理。

Zblog-SuperCache Plugin

后台地址加密

Zblog 的默认后台地址是域名/zb_system/login.php,将 login.php 重命名,比如修改为 abc12345.php,然后打开 zb_system 下的 cmd.php 文件,查找 login.php 替换成 abc12345.php

但是这样有个隐患,通过域名/zb_system/admin/ 会跳转到 Zblog 错误页,错误页面上的登录按钮会指向 /zb_system/abc12345.php,所以修改 login.php 只是个自欺欺人的方法。

网上有教程说连同 admin 文件夹一起改名,实践证明不可行 —— 改名的涉及文件太多,大部分插件会报错,而且每次新增或更新插件都要重新修改一次文件,不是一个长久之计。

Zblog-Admin error

最终选择方案为 URL 带参,后端检验参数正确才能进入登录页,比如 {域名}/zb_system/login.php?aaaa=bbbb,在主题目录下的找到 include.php,然后依次操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 在顶部<?php 后添加代码
function zblog_login_encrypt(){
global $zbp;
$wen="wenti"; //问题,请在引号内输入问题,注意不要使用中文
$da="daan"; //答案,请在引号内输入答案,不要使用中文
if($_GET[''.$wen.''] !== ''.$da.'') {
Redirect($zbp->host);
die();
//如输入错误,返回首页,终止一切代码
}
}

# 在function ActivePlugin_主题ID()函数内添加代码
//挂载登录页接口
Add_Filter_Plugin('Filter_Plugin_Login_Header','zblog_login_encrypt');

使用后台地址加密的注意事项:

  1. 去掉主题或侧栏包含的登录链接,因为开启本功能后这些链接已失效。
  2. 代码挂载 login.php,用户中心或主题自带登录地址无效,请直接访问加密后地址
  3. 如忘记问题答案,使用 ftp 或者服务器工具进入主题 include.php 内去掉此段代码即可

完成以上步骤后,后台地址变更为 {域名}/zb_system/abc12345.php?wenti=daan,未传参或传参错误都会直接返回首页