02月23, 2019

网站服务性能优化实践

  • 后端程序
  • SSL + DNS
  • 删除冗余代码
  • Nginx http-concat
  • 浏览器缓存
  • Response Headers
  • Gzip -> Brotli
  • PNG, JPG -> WebP
  • Nginx FastCGI Cache
  • robots.txt
  • 链接

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

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

后端程序

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

SSL + DNS

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

再配上 DNS CAA 、TLSv1.3 、OCSP、SCT 等一系列“高科技”,啦啦啦~

SSL Test 结果

删除冗余代码

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

Nginx http-concat

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

http-concat

浏览器缓存

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

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

这里有个坑,因为 Nginx 的 add_header 指令会向上继承,但如果同级作用域中有该指令,则不会向上继承,如:

server {
    add_header 'key1' 'val';

    location / {
        add_header 'key2' 'val';

        if ($uri ~* ^/admin/) {
            add_header 'key3' 'val';
        }
    }
}

以上规则在命中 ^/admin/ 时只会添加一个 key3 ,而没有命中时只会添加一个 key2 ,为此我把各个子功能拆成独立的 .conf 文件,在合适的地方直接 include ,如:

server {
    # 默认安全、性能、缓存10分钟
    include inc/sts.conf;
    include inc/security.conf;
    include vhost/xiaoshuo.io/cache-small.conf;

    # 合并+最大缓存
    location ^~ /templets/tpl/js/ {
        include inc/sts.conf;
        include inc/security.conf;
        include vhost/xiaoshuo.io/cache-max.conf;
    }

    # 支持 jpg、png -> webp
    location ~* \.(jpg|png|meibanfawojiuxiangchangdianyirangquanzhongdadian)$ {
        include inc/sts.conf;
        include inc/security.conf;
        include vhost/xiaoshuo.io/cache-max.conf;
    }
    location ~* \.webp$ {
        include inc/sts.conf;
        include inc/security.conf;
        include vhost/xiaoshuo.io/cache-max.conf;
        try_files $uri $uri/ @webp;
    }
}

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 。

Nginx Brotli

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 命令自动生成,并返回。

无缓存转换前:

jpg,png 图片大小

无缓存转换后:

webp图片

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

Nginx FastCGI Cache

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

  • 默认缓存5分钟
  • GET 参数中存在 nocache=1 则不缓存
  • POST 请求不缓存
  • PHP 500 错误时使用缓存响应
  • 对于时效性高的 PHP 文件不缓存

缓存前:

无缓存打开

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

缓存后:

缓存后

由之前的 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

本文链接: https://xuexb.com/post/xiaoshuo.html

-- EOF --

提醒: 本文最后更新于 1848 天前,文中所描述的信息可能已发生改变,请谨慎使用。

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。

玻璃钢生产厂家商丘玻璃钢装饰造型制作东营玻璃钢摆件多少钱南昌玻璃钢休闲椅多少钱深圳玻璃钢花盆厂家衢州玻璃钢树池坐凳批发汕头玻璃钢人物雕塑制作湛江玻璃钢花盆价格三亚玻璃钢卡通雕塑价格大同玻璃钢垃圾桶多少钱辽阳玻璃钢卡通雕塑加工渭南玻璃钢公仔雕塑定做开封玻璃钢休闲椅生产厂家玉林玻璃钢设备外壳公司信阳不锈钢雕塑价格三沙玻璃钢医疗外壳制作中卫商场美陈制造张掖玻璃钢休闲椅价格德州玻璃钢产品宝鸡玻璃钢医疗外壳厂咸阳玻璃钢花槽制造六安玻璃钢制品哪家好兰州玻璃钢沙发制作烟台玻璃钢公仔雕塑厂家吕梁玻璃钢垃圾桶定制天水玻璃钢座椅厂南京玻璃钢机械外壳厂中山玻璃钢坐凳生产厂家惠州玻璃钢种植池珠海玻璃钢休闲椅加工泸州玻璃钢树池厂家直销香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化