WEB应用

小网站最简单实用的动静分离优化方案

很久没写文章了,博客已经长草了,今天挤点时间分享一些小干货,也是回应一下不少站长朋友的留言问题。 有不少站长朋友问张戈博客的静态文件为啥是另外一个域名?有啥好处?如何实现? 其实这算是一种动静分离的做法,不过我这里用了偷懒的办法实现,而非彻底的动静分离,不过最终效果的区别并不大。 先啰嗦一下动静分离的概念和好处。 一、动静分离 我们的网站简单来说分为2种数据资源,一种是动态的数据,即PHP等程序语言实时吐出来的数据,在网页内容上主要是HTML代码,另一种则是静态资源,比如图片、css、js、视频等(当然,图片等资源也可能是实时动态生成的,比如PHP缩略图,这里就不展开讨论了)。 一般网站初建,因为流量小、业务简单等原因,都默认将两种数据放到一台服务器上提供服务。访问量大到一定程度之后,就可能出现带宽不足、甚至磁盘高IO等问题。这时,作为运维工程师或者架构师就会给出动静分离优化的建议了。做法并不复杂,运维工程师会将图片等静态资源同步到另一台WEB服务器,然后新增绑定一个二级域名,比如static.domain.com,最后让开发将网页代码中的静态资源替换成这个二级域名即可。 这样一来,图片等静态资源的访问就落到了新增的服务器上,从而分担了大部分访问数据流量和IO负载,我们还可以针对性的给静态资源WEB做一些优化,比如JS/CSS/图片压缩、内存缓存、浏览器缓存等等。进一步,我们还可以将静态资源接入CDN,实现资源就近访问。 可以用一张图来表示: 二、好处分析 1、常规做法的好处 从上文的通俗解释来看,很明显的一个好处就是解决带宽问题,像博客圈子里的服务器,绝大部分主机都是国内的小管道云服务器(带宽小于2M),并发访问量上来之后,就能很明显的感觉到带宽成为了瓶颈。 不过,博客圈大部分都是“一穷二白”,一般都不愿意再买一台服务器来专门承载静态资源,而且多台服务器之间的数据同步等日常维护问题也变相提高了折腾门槛。因此,国内大部分小博客都热衷于套一层CDN来解决带宽问题,确实是一个很好的解决方案。在《分享张戈博客的WordPress优化方案,缓解国内云服务器配置低下的问题》一文中,也是特别提到了这一茬。 2、本文分享方案的好处 上文说张戈博客使用了一种偷懒的方案,做法很简单:网站只用一台服务器,但是会新增绑定一个和主站完全不一样的二级域名,比如张戈博客主站是zhang.ge,而二级域名用的是 res.zgboke.com,并且给这个二级域名套了一层CDN。 这样做又有什么好处?和直接套一层CDN(比如云加速)有什么不同? 第1个好处:显而易见比常规动静分离成本更低,分离前后服务器数量不变; 第2个好处:解决主站直接使用一级域名带来的cookies“污染”,即静态资源不会再带上主站的cookies数据,减小了体积。这个在上文提到的优化方案一文中也着重提到,详细就不再赘述; 第3个好处:这个方案对于网站内容没法备案又想体验国内CDN加速快感的网站绝对是福音!很多网站因为内容特殊(邪恶脸)没法完成备案,所以无法使用国内的CDN,那么就可以用本文分享的方法,直接花钱买一个备过案的垃圾域名,做好动静分离,然后将这个二级域名接入国内的CDN,网站速度绝对可以得到质的飞跃,是不是爽歪歪? 第4个好处:这个和第二个比较类似,主要针对在百度云加速购买了付费套餐的朋友。因为,对于一般流量的网站,你只需要在百度云加速给一个域名购买一个专业版,那么就可以分离多个二级域名给N个网站使用,那么多个人合买一个专业版完全不成问题吧?当然,现在百度云加速也学聪明了,现在流量限制50G/天(我开始用这个方案的时候无此限制),但是对于普通网站已经很够用了!!! 第5个好处:CDN配置更加比较简单,因为这种静态二级域名,接入CDN之后,完全不用考虑缓存规则的问题,因为直接设置成全部缓存就好了!简单粗暴。 三、部署教程 啰嗦了好长篇幅,下面给出具体做法! 原理贼简单,就是在服务器上利用反向代理新增了一个新网站,内容则是反向代理了我们的主站,从而实现了2个域名共享相同的网站数据。 Vhost示范规则如下: 这样就在本地新增了和主站共用一份数据的二级域名,只提供静态资源访问,其他访问都跳到主站对应页面。 完成新增后,只需要使用以前分享的七牛CDN代码或者CDN插件,将网站的静态资源替换为这个新二级域名,比如以前分享的纯代码版,加到functions.php即可完成替换: 完成部署后,我们网站的前台页面中的图片、js等静态资源链接就全部换成了新的二级域名了。 Tips:其他部署方法 如果网站未启用https,完全可以更简单,只需要在我们的主站vhost配置的server_name参数中新增一个域名即可,比如: server_name zhang.ge res.zgboke.com; 当然,强迫症患儿们,还可以根据域名判断,来进行上述Vhost类似跳转,此处就不展开了。 同样的,对于虚拟主机来说,只需要在虚拟主机控制面板中新增一个二级域名绑定即可。但是这个方法不适用于https站点,因为一般的https证书并不能用于2个完全不一样域名。 最后,我们将这个二级域名接入CDN即可,接入方法就不啰嗦了,自己折腾吧!
阅读全文
网站建设

WordPress发布/更新文章、提交/审核评论自动清理阿里云CDN缓存

使用过CDN的朋友多少都有过文章更新无法自动删除CDN缓存的困惑,针对这个痛点,张戈博客也是多次发布相关教程,为广大草根站长朋友们解惑,比如: WordPress发布/更新文章、提交/审核评论自动清理腾讯云CDN缓存 WordPress发布/更新文章、提交/审核评论自动清理VeryCloud缓存 Nginx-helper纯代码版,文章评论发布自动清理Fastcgi缓存 但是,仍然不能满足博友们的诉求,于是很多朋友留言、邮件给我,要我帮忙写一个XX云CDN的自动清理功能之类的请求,我一般都是给出了敬请期待之类答复。 由于本人日常工作非常繁忙,所以只能一再跳票,今天难得得空,正好研究下阿里云CDN的缓存清理。 实际上,这些XX云CDN基本都有一些SDK接口文档,有点基础的朋友多花点时间撸一撸都能自己写出来,再说张戈博客之前还分享了好几篇类似教程,依葫芦画瓢总会吧?总不能因为有个XX云就要写一个XX云CDN清理教程吧?写完了XX云可能很快又会有一个OO云了。。。所以,掌握套路才是解决问题的关键! 好了,废话不多说,直接上教程。 一、准备工作 ①、开启CDN缓存 这里应该无需多言,如果存在CDN缓存不刷新困惑,肯定已经在CDN配置了文章、首页或目录缓存机制,否则也就不需要清理页面缓存了。 ②、申请认证密钥 阿里云密钥管理地址:https://ak-console.aliyun.com/#/accesskey 申请成功后,得到如图的AccessKey和AccessSecret,保存备用。 二、使用方法 ①、下载代码 为方便维护,代码已提交到github,请前往github下载或使用git clone命令克隆服务器本地: 然后,将refresh-aliyun-cdn-for-wordpress文件夹,上传到WordPress主题目录: ②、部署代码 编辑refresh-aliyun-cdn-for-wordpress文件夹下的api.php文件,按照实际情况修改如下代码:   保存后,修改WordPress主题函数模板文件functions.php,在<?php 之后加入如下代码并保存: 最后,如果PHP开启了opcache功能,还需要重启下php确保代码正常生效。 Ps:本文代码基于阿里云官方PHP-SDK代码修改,官方SDK包含了阿里云所有接口功能代码,单由于我们只用到CDN清理功能,所以其他功能代码已被我精简删除。 三、验证效果 完成上述部署操作后,我们可以进行效果验证了。验证方法很直观,我们先确保api.php文件中已将日志打开: 然后,我们在服务器上使用tail -f查看日志: 最后,我们试着更新文章、发表评论或审核评论,就会看到如下效果了: 当然这只是日志,你还可以实际修改下文章内容,然后在浏览器对比下修改前后的内容是否发生改变。 好了,关于阿里云CDN缓存的刷新就介绍这么多,后面有空再补充下百度云CDN的刷新教程,敬请期待!
阅读全文
WEB应用

Nginx网站使用CDN之后禁止用户真实IP访问的方法

做过面向公网WEB运维的苦逼们肯定见识过各种恶意扫描、拉取、注入等图谋不轨行为吧?对于直接对外的WEB服务器,我们可以直接通过 iptables 、 Nginx 的deny指令或者是程序来ban掉这些恶意请求。 而对于套了一层 CDN 或代理的网站,这些方法可能就失效了。尤其是个人网站,可能就一台VPS,然后套一个免费的CDN就行走在互联网了。并不是每个CDN都能精准的拦截各种恶意请求的,更闹心的是很多CDN还不支持用户在CDN上添加BAN规则,比如腾讯云CDN。。。 因此,就有了本文的折腾分享。 一、真假难辨 如何禁止访问,我们先了解下常见的3种网站访问模式: ①、用户直接访问对外服务的普通网站 浏览器 --> DNS解析 --> WEB数据处理 --> 数据吐到浏览器渲染展示   ②、用户访问使用了CDN的网站 浏览器 --> DNS解析 --> CDN节点 --> WEB数据处理 --> 数据吐到浏览器渲染展示   ③、用户通过代理上网访问了我们的网站 浏览器 --> 代理上网 --> DNS解析 --> 上述2种模式均可能 对于第一种模式,我要禁止这个用户的访问很简单,可以直接通过 iptables 或者 Nginx的deny指令来禁止均可: iptabels: iptables -I INPUT -s 用户ip -j DROP   Nginx的deny指令: 语    法:     deny address | CIDR | unix: | all; 默认值:     — 配置段:     http, server, location, limit_except 顺   序:从上往下 Demo: location / { deny 用户IP或IP段; } 但对于后面2种模式就无能为力了,因为iptables 和 deny 都只能针对直连IP,而后面2种模式中,WEB服务器直连IP是CDN节点或者代理服务器,此时使用 iptable 或 deny 就只能把 CDN节点 或代理IP给封了,可能误杀一大片正常用户了,而真正的罪魁祸首轻轻松松换一个代理IP又能继续请求了。 那该怎么办? 二、火眼金睛 如果长期关注张戈博客的朋友,应该还记得之前转载过一篇分享Nginx在CDN加速之后,获取用户真实IP做并发访问限制的方法。说明Nginx还是可以实实在在的拿到用户真实IP地址的,那么事情就好办了。 要拿到用户真实IP,只要在Nginx的http模块内加入如下配置: 那么,$clientRealIP 就是用户真实IP了,其实就是匹配了...
阅读全文
网站建设

WordPress发布/更新文章、提交/审核评论自动清理VeryCloud缓存

上一篇文章分享了WordPress发布文章评论自动刷新腾讯云CDN的教程,而博客现在还用到了VeryCloud的CDN,正好有朋友在文章后面留言说VC也有刷新缓存的API,于是就利用中午的时间折腾了下,成功搞定! 下面分享一下部署方法。 将以上代码粘贴到WordPress主题functions.php中,然后将 19,20行对应的中文改成VeryCloud的用户名和密码,保存即可。 Ps:貌似VC的缓存刷新API暂时还没完全公开,如果需要部署这个功能,需要联系客服,然后告知需要使用这个刷新CDN缓存的API,然后提供以下用户名给他就好了。而且代码中的lockstream的值可能需要VC客服提供,如果发现上述代码无法成功,请自行咨询VC客服。 部署好了之后,可以去更新文章或提交评论,然后登陆VeryCloud云分发后台,即可看到提交记录: 至此,说明你已部署成功。
阅读全文
网站建设

WordPress发布/更新文章、提交/审核评论自动清理腾讯云CDN缓存

目前张戈博客同时使用了腾讯云、VeryCloud以及七牛CDN,其中腾讯云负责电信线路流量,VeryCloud负责默认线路流量,而七牛主要是用于缩略图展示,你觉得这样做有什么好处? 一、兵分三路 本来博客自身就有PHP缩略图功能,不过腾讯云缓存后,这个带参数的缩略图经常出50x等问题,所以只好弃用。腾讯云负责电信线路的原因只有一个:其实没鸟用的安全认证(也就是QQ聊天的绿色钩钩),这里简单分享下吧: 不使用腾讯云的主机也能获得安全认证的方法: 很简单,使用腾讯云CDN即可,道理也挺简单,安全认证它检测的就是你的网站是否解析到了腾讯服务器,而且只检测电信线路!如果是腾讯的服务器,那么就可以通过安全认证申请,而且是不定期检查,如果发现解析到了别家的IP,呵呵,认证就取消了。 申请认证地址:http://console.qcloud.com/security 所以,为了这个没啥鸟用的认证,我还是将电信线路解析到了腾讯云CDN。当然,好处还是很明显的:3家CDN都有50G免费流量(其中七牛邀请朋友注册还送了40G),加起来就是150G流量,相信绝大部分博客是够用了吧? 好了,扯得有点远了,回归正题。 二、部署代码 同时使用3个CDN,其中VC和腾讯云的CDN主要是负责主站缓存,也就是html页面。相当于套了一次百度云加速一样。再设定下CDN缓存时间,比如1天,那么文章或评论有更新就得1天后才能刷新了。 偶然了下腾讯云CDN的WIKI,发现其实腾讯云提供了非常丰富的API接口,其中就包含了清理CDN缓存,感觉这个不错,于是就花时间折腾了下。 在腾讯云CDN开发大牛廖大师的指点下,成功搞定了WP发布文章或评论刷新腾讯云CDN缓存,下面开始分享。 完整的php代码如下: 先访问 https://console.qcloud.com/capi 创建或获取你在腾讯云的API密钥:然后正确替换上述代码中的8,9行的secretKey和secretId值,比如: 最后,将修改后的PHP代码添加到WordPress主题的 functions.php 函数模板文件当中即可! 三、其他啰嗦 部署后,博客发布或更新文章、评论的提交或审核都会调用API去清理CDN缓存,其中文章和评论的提交可能会比没有部署略微卡一点,评论的审核是异步提交,所以感知不到什么。 最终,我百度了一把php异步,将以上代码中的curl_init请求改造了伪异步,将时间缩短到1秒(因为CUROPT_TIMEOUT的值最小是1秒【相关文章】),所以挂上这个函数也就是略卡1秒而已,完全可以接受! 好了,本文分享到此告一段落,正在使用腾讯云CDN或打算做腾讯云安全认证将要使用腾讯云CDN的朋友可以尝试下,非常方便!
阅读全文
网站建设

分享一个支持https的CDN及启用SSL后续问题汇总

之前张戈博客全站启用了https,并分享了相关经验心得。用了一段时间,问题还是不少,所以继续整上一篇文章,汇总一下网站启用https之后出现的问题以及解决办法。 在分享这些问题之前,我先分享一个国内支持https的CDN,让个人博客也能无忧启用https,而不暴露真实IP。 我现在用的是腾讯云内测的支持https的CDN,其他人也就暂时用不了。本以为国内基本就没有其他支持https的CDN了,结果晓庄等几个博主留言分享了一个支持https的CDN——VeryCloud。 周末抽空了解并试用了下,发现真不错!而且还有每月免费50G的额度,一般个人博客基本够用了。 一、云端CDN ①、注册开通 首先,我们在VeryCloud注册帐号并开通云分发:https://www.verycloud.cn/ ②、添加证书 我们是冲着https去的,所以第一件事我们先要申请一个免费的SSL证书!当然,张戈博客之前也分享过沃通的免费证书申请地址,所以有需要的朋友先前往申请下: 分享一个免费SSL证书申请网站,给网站开启https协议 Ps:沃通免费证书最近又开放了2年多域名版本,申请时建议把主域名二级域名啥的一并申请到一个证书里(一次最多6个,含www主域)。 现在沃通申请证书基本可以站立得,所以我们可以立马下载到证书包。 解压,取得其中for Nginx的证书,然后在云分发控制台的【证书管理】中新建证书: 如图,输入一个自定义能识别的名称,然后依次上传crt和key文件,并确定即可!CA机构证书的话,免费证书是没有了,至少沃通免费证书绝没有。。。所以忽略吧! ③、添加网站 注册并登陆VeryCloud云端网络之后,启用云分发,并前往云分发控制台的频道管理界面添加新域名 因为我们的目的是要在开启https之后保护IP不泄露,所以我们必须把所有要展示的域名都加进去,比如博客主域名: 如图,基本只要按中文提示填写即可,其中如果源站没有开启强制https那么可以填写80,而源站要是开启了http强制跳转https的话,那就必须填写443端口,否则CDN会经常异常! 我博客主域名开启了强制https,所以我填写了443端口,二级静态域名没有开启,所以我填写80,区别是填写80能略微降低CDN抓取源站造成的压力。毕竟http还是比https略微费服务器一点! 下面的探测URL就随便填写一个网站存在的地址吧,比如我填写的是ico图标地址。 继续下一步,是设置缓存: 这个可以参考一下张戈博客之前的文章: 如何正确配置CDN高速缓存,避免越用越慢的尴尬 特别注意的是,其中有个静态页面,指的是html、htm和shtml这类页面,一般博客都做了伪静态,所以如果不需要缓存html伪静态页面,请使用自定义或遵循源站,自定义则需要去掉html等后缀。 再下一步则是最关键的https设置了! 备份源站一般博客应该没有,直接忽略,勾选启用SSL加速,开启https: 接下来的回源方式就和前文提到的80和443的选择异曲同工了,还是一样的道理,如果源站有强制https,那么就必须选择HTTPS协议回源才行! 强制https访问,这是腾讯云CDN都没有的功能,云端提供了!本来我还更高兴的!结果发现这个强制https跳转居然是返回302状态,感觉不是很符合百度推荐的301永久跳转,我个人最后是在源站设置了301跳转。 SSL证书这一项就是选择我们前面新建的那个SSL证书了,无需赘述。 再往后,基本就不用多说了,自己折腾吧! 二、经验分享 国内免费CDN一般都限制在每月50GB流量,一般博客是够用了。但是发展到一定阶段,50G流量肯定是不够的,比如张戈博客一个月至少上100G的CDN流量,几十块的预算还是要的。 那有没有办法节省一点呢? 这里分享的方法,只适合有多个CDN服务的朋友。比如,张戈博客同时在用腾讯云CDN和云端CDN,我将电信线路解析到了腾讯云CDN,而将默认线路给了云端CDN。 因为腾讯云CDN目前我还有个100G的流量包,先用完再说。 简单来说,就是使用线路分摊的办法来解决这50G不够用的尴尬。当然,如果你只是看到了这篇文章介绍的云端CDN,那就只能等以后慢慢发掘了。。。 三、问题汇总 博客开启https这段时间,着实遇到不少问题,所以下面简单分享一些经验技巧。 ①、支持https的视频 我博客之前是有一些在线MV的,开启https之后全部都废了,原因大家也都清楚,https里面的http资源会被浏览器拦截,所以必须要使用https的视频地址才行! 本来我也就懒得维护那些在线MV了,不过偶然在腾讯内部博客平台看到有人问到了腾讯视频是否支持https,正好有相关产品经理回答了这个问题,也给出了解决方法。 很简单,先找到腾讯视频的ID: 然后使用如下地址即可实现https访问视频了: https://v.qq.com/iframe/player.html?vid=f0019nr9cdd ②、百度提交https 百度在提倡https之后,站长平台已经支持提交https站点了! 进入百度站长平台,然后删除之前的域名,再添加该域名的https站点即可: Ps:不过坑的是,站长平台貌似对https支持不太友好,改成 https之后各种数据都停滞不动了。。 ③、微信公众号 微信公众号暂时不支持https,而源站又全站强制开启了https,所以导致公众号也无法提供自动回复功能了!解决办法也很简单: 方法 I:新增一个域名,使用http即可,root路径和主域名一致即可; 方法II:针对POST方法,取消强制https规则即可 Nginx可以这样配置: 将之前强制https跳转规则改成如下即可: ④、CDN公共库 支持https的CDN都有免费额度限制,所以能托管到第三方的尽量托管,能省则省。 比如,我博客用的是1.8.2版本的JQery,以下则是我搜集的一些支持https的JQ公共库地址: 新浪云:https://lib.sinaapp.com/js/jquery/1.8.2/jquery.min.js  (速度不错,博客在用) 百度扒来的:https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/js/lib/jquery-1.10.2_d88366fd.js 貌似是ASP官方的:https://ajax.aspnetcdn.com/ajax/jquery/jquery-1.8.2.min.js JQ官方的:https://code.jquery.com/jquery-1.8.2.min.js 下面的同样支持https,非常不错: Bootstrap官方CDN公共库:http://www.bootcdn.cn/ 又拍云CDN公共库:http://jscdn.upai.com/ ⑤、http被缓存 这个问题是我在用腾讯CDN的时候出现的,原因是因为腾讯云CDN不支持设置强制https跳转,而且还会缓存http站点,导致访问博客http地址也不会遵循源站的强制https跳转了! 要彻底解决这个问题只能等更新CDN机制了。当然, 如果设置CDN不缓存应该也是可以的。 我们暂时可以利用JS来解决这个问题,将如下js代码加入到header即可: 好了,以上就是本文分享的所有内容,希望对各位有所帮助!
阅读全文