网站服务性能优化实践

栏目: 服务器 · Nginx · 发布时间: 5年前

内容简介:首先这里的服务性能优化不是指代码层面,也不是规范相关,只是对于网站运行的服务、请求、响应做的一些优化。当然这里的优化是我个人理解的,很可能事倍功半。由于我多年(2005)前看过了使用的 DedeCMS 扩展的小说整站程序,出自

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

由于我多年(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: /

链接


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Four

The Four

Scott Galloway / Portfolio / 2017-10-3 / USD 28.00

NEW YORK TIMES BESTSELLER USA TODAY BESTSELLER Amazon, Apple, Facebook, and Google are the four most influential companies on the planet. Just about everyone thinks they know how they got there.......一起来看看 《The Four》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具