内容简介:首先这里的服务性能优化不是指代码层面,也不是规范相关,只是对于网站运行的服务、请求、响应做的一些优化。当然这里的优化是我个人理解的,很可能事倍功半。由于我多年(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 是支持自动识别浏览器支持情况,一般套路:
- 判断浏览器 Request Headers accept 是否包含
image/webp
字段,但记忆中这个字段可能不稳, @吴胖 也曾验证过。 - 前端脚本设置一个真实的 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
白帽子讲Web安全
吴翰清 / 电子工业出版社 / 2012-3 / 69.00元
《白帽子讲Web安全》内容简介:在互联网时代,数据安全与个人隐私受到了前所未有的挑战,各种新奇的攻击技术层出不穷。如何才能更好地保护我们的数据?《白帽子讲Web安全》将带你走进Web安全的世界,让你了解Web安全的方方面面。黑客不再变得神秘,攻击技术原来我也可以会,小网站主自己也能找到正确的安全道路。大公司是怎么做安全的,为什么要选择这样的方案呢?你能在《白帽子讲Web安全》中找到答案。详细的剖析......一起来看看 《白帽子讲Web安全》 这本书的介绍吧!