网站服务性能优化实践

文中有些外链如需点击,请到文章底部查看原文。

首先这里的服务性能优化不是指代码层面,也不是规范相关,只是对于网站运行的服务、请求、响应做的一些优化。当然这里的优化是我个人理解的,很可能事倍功半。

由于我多年(2005)前看过了 @心梦无痕 的【七界传说】,至今也在追他的【神武天帝】小说,更新频率是每天下午更新两章,而在看小说时的体验可为是极差,很多小说站都会有一个透明蒙层的广告,并且还把一章分成了多页以来提高 PV 量,但想看时还不得不点。于是很早我就想搞个小说站,正好手里有一个 xiaoshuo.io 域名,再结合我的服务已经使用 Docker 部署 了,正好拿这个小说站练习下优化。

后端程序

使用的 DedeCMS 扩展的小说整站程序,出自 http://669977.net/ ,不过介于一些隐私就不多说了。总之就是一整套完整的代码,但也正因为很完整,要照顾到很多情况,而我显然得改一些代码。

HTTPS

这不用说,必须得 HTTPS + STS + HTTP2 ,使用 ACME Docker 自动生成证书。这里提醒下,大家在购买域名时,尽量在知名的IDC 购买,因为知名的 IDC 服务稳定、接口全(你懂的)。

删除冗余代码

广告肯定得没有的,删除广告请求代码、用户中心,还有很重要的一点:静态化功能删除,即使已经有 PHP 隔x分钟自动生成,但我可以用别的缓存代替静态化。

Nginx http-concat

本身网站会加载好几个样式文件、脚本文件,二话不说安装上 nginx-http-concat 模块,直接合并上。

浏览器缓存

缓存肯定是少不了的,做出以下规则:

  • 默认页面(主要是后端输出文件) - 缓存10分钟
  • 静态文件( /uploads/templets )- 缓存最大,但没有文件名指纹,修改后需要手动加小戳戳
  • 后台页面 - 不缓存

Response Headers

cache-control: public, max-age=315360000, no-transform, no-siteapp
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
x-dns-prefetch-control: on
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block

注意:添加了不转码的响应头。

Gzip -> Brotli

对网站添加了 Nginx Brotli 压缩 ,在不支持的情况时会自动降级成 Gzip 。

PNG, JPG -> WebP

之前在bd时研究过下,但没有很深入,而很多 CDN 是支持自动识别浏览器支持情况,一般套路:

  1. 判断浏览器 Request Headers accept 是否包含 image/webp 字段,但记忆中这个字段可能不稳, @吴胖 也曾验证过。
  2. 前端脚本设置一个真实的 Base64 WebP 图片,成功时写入 Cookie ,服务器根据 Cookie 标识返回不同的图片。

而图片转换又有在线不存在时生成、离线转存,而使用了 Cookie + 在线生成,Nginx 配置大概如:

location ~* \.(jpg|png|meibanfawojiuxiangchangdianyirangquanzhongdadian)$ {
    if ($cookie_webp = '1') {
        rewrite ^/(.*)$ /$1.webp last;
    }
}
location ~* \.webp$ {
    try_files $uri $uri/ @webp;
}
location @webp {
    content_by_lua_file 'lua/webp.lua';
}

浏览器端检查 WebP 支持脚本:

;(function (Cookies) {
    if (Cookies.get('webp') === undefined) {
        var check = new Image();
        var opts = {
            secure: location.protocol === 'https',
            expires: 365,
        };
        check.onload = function () {
            Cookies.set('webp', 1, opts);
        };
        check.onerror = function () {
            Cookies.set('webp', 0, opts);
        };
        check.src = 'data:image/webp;base64,UklGRjIAAABXRUJQVlA4ICYAAACyAgCdASoCAAEALmk0mk0iIiIiIgBoSygABc6zbAAA/v56QAAAAA==';
    }
})(window.Cookies);

以上配置后,当浏览器打开后检测到支持 WebP ,Nginx 会优先读取对应 $uri.webp 文件,如果不存在,则交给 Lua 处理,Lua 会调用 cwebp 命令自动生成,并返回。

无缓存转换前:

无缓存转换后:

可以看出由之前的 2.3m 降到了 600kb ,还是很不错的。

Nginx FastCGI Cache

由于除了静态文件外其他页面大多数是由 Nginx FastCGI 转发到 php-fpm ,由于 PHP 处理需要时间,而对于静态文件可以直接返回,那么在 FastCGI 添加一层缓存:

nocache=1

缓存前:

可以看大量的时间浪费在了服务端处理,而文件下载时间很短。

缓存后:

由之前的 390ms 降低到了 112ms ,完美。

当然,你可能会说直接上 PageSpeed ,但重在过程嘛~

robots.txt

由于有之前发现很多国外的爬虫会抓页面的经验,为了减小压力直接修改 robots.txt :

# xiaowu
User-agent: Baiduspider
Allow: /
Disallow: /admin/
Disallow: /*.php$

User-agent: Sosospider
Allow: /
Disallow: /admin/
Disallow: /*.php$

User-agent: sogou spider
Allow: /
Disallow: /admin/
Disallow: /*.php$

User-agent: Googlebot
Allow: /
Disallow: /admin/
Disallow: /*.php$

User-agent: Bingbot
Allow: /
Disallow: /admin/
Disallow: /*.php$

User-agent: MSNBot
Allow: /
Disallow: /admin/
Disallow: /*.php$

User-agent: googlebot-mobile
Allow: /
Disallow: /admin/
Disallow: /*.php$

User-agent: 360Spider
Allow: /
Disallow: /admin/
Disallow: /*.php$

User-agent: HaosouSpider
Allow: /
Disallow: /admin/
Disallow: /*.php$

User-agent: *
Disallow: /

链接

  • 小说站 所有配置在 - https://github.com/shangxianapp/docker-xiaoshuo.io
  • Docker Nginx 反向代理 - https://github.com/shangxianapp/docker-sg02-nginx-proxy
  • Nginx Alpine 镜像,支持 Lua 、nginx-echo 、nginx-brotli 、nginx-http-concat 、WebP - https://github.com/shangxianapp/docker-nginx-alpine

本文分享自微信公众号 - PHP技术大全(phpgod)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏盟主来了

备忘一下,github撤销操作

点击具体要revert的点,记下hash,然后通过github的open in git shell,然后输入git reset --hard f4d4e2d10...

22740
来自专栏csxiaoyao

GIT学习笔记

  这篇博文记录了Git的学习过程中基本的Git操作,留下笔记供日后参考。   博主是一个很有条理、注重开发效率的好男人(此处应有掌声),多年的软件工程...

12720
来自专栏网络安全防护

墨者安全是如何通过流量清洗来防御DDoS攻击?

DDoS攻击是互联网企业面临的最复杂的网络安全威胁之一。攻击者通过大量僵尸网络模拟真实用户对服务器发起访问,企业必须确定这些流量哪些是合法流量哪些是恶意攻击流量...

18020
来自专栏逍遥剑客的游戏开发

Unity中使用GPU Instancing优化SkinnedMesh渲染

有这么个需求: 一堆不会动的SkinnedMesh, 通过物理模拟出死亡姿势后, 需要优化性能, 不然才10FPS

39250
来自专栏盟主来了

2017.10.28日报

1,修复wkeGetViewDC在透明窗口下像素都是0 的bug。原因是我用了updataxxx那个api

12430
来自专栏iOSDevLog

深度学习应用:iOS 上的图像风格迁移

图像风格迁移,用 python 就可以实现,如果想要在手机上面(不联网)查看效果怎么办呢?

21230
来自专栏盟主来了

chromium源码相关资源汇总

http://blog.csdn.net/Kuerjinjin/article/details/23563059 老版本chromium,还带sln的

54130
来自专栏盟主来了

大家久等了,miniblink终于开源了!!

关于miniblink的介绍见上篇文章:屌炸天的内核来袭,史上最小chromium内核miniblink! - 盟主来了 - 知乎专栏

2.3K40
来自专栏桥路_大数据

JS (intermediate value).Format is not a function问题解决

最近项目遇到一个问题,就是在javascript中使用new Date().Format("YYYY-mm-dd")的时候,会出现报错现象,直接导致界面无法正常...

1.1K30
来自专栏逍遥剑客的游戏开发

推荐一个SDK(引擎): HeliumProject

代码在GitHub上: https://github.com/HeliumProject

15550

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励