如何提高网站的访问速度 - 从30秒到3秒的改变

news/2024/4/28 10:44:06/文章来源:https://blog.csdn.net/popkiler/article/details/1775769
 如何提高网站的访问速度 - 从30秒到3秒的改变

作者:henry3 (通往牛B的路上一路狂奔)  

2006年10月份,我开始对web开发产生了兴趣,并决定自己也尝试开发一个网站。在此之前,我做过3年的java application的开发,对web开发应该算一无所知。在比较了java,php,ror,和python后,我选择了基于python的web框架 - django 。到目前为止,我还认为这是一个明智的决定。Django高效的开发效率让我仅仅用一个月的业余时间,就基本完成了网站的开发。这是一个网络书签的网站,我加上了一些有意思的特性,让网站显得有些与众不同。

我购买了域名和Dreamhost 的主机空间。Dreamhost支持django,并且第一年的费用只有180元人民币。2006年11月份,http://www.hpbookmarks.com 上线了。网友们发来了善意的评论,“很有创意”,“点意思”,“一些feature很不错”。同时,还有一个非常一致的意见就是,“访问速度太慢了”。其实,当时的情况不只是访问速度慢,而且是相当不稳定。很多时候是几个小时网站无法访问。当时,我并没有在意,因为我有两个自以为“合理”的解释。第一,我用的是国外最便宜的虚拟主机,国内访问慢是很正常的。第二,django的还处于0.95的状态,效率和稳定性方面有问题也正常。

但是,我慢慢发现上面的解释不过是自己骗自己的借口。很多用dreamhost的网站,访问起来也很快。而且django也已经被成功应用在许多大型的网站。我开始认真考虑提高网站速度的问题了。毕竟,速度慢的网站很可能在第一次就失去的用户,他们可以永远不会再来了。终于,我进行了下面一步一步的优化工作,并且取得了一个看起来还不错的结果。

第一步,用Ajax提高用户体验

由于我的网站上链接字体的大小是根据点击次数决定,所以每次点击都要提交到服务器端并记录次数,再在客户端打开网站链接。这在localhost测试的时候没有发现问题,但是部署到服务器上,会感到明显的等待。解决办法就是用Ajax。用户点击网站链接后就直接打开,再通过Ajax将点击的事件提交到服务器端记录。这样用户感觉不到任何延时。

第二步,将逻辑移到客户端的javascript中

在开始的时候,“网站标签高亮”和“手气不错”的功能都是提交到服务器端操作,然后返回结果的。后来,我发现其实很多逻辑是可以移到客户端,由 javascript来实现的。Javascript非常强大,可以完成很多复杂的逻辑。将逻辑移到客户端的javascript中,可以很有效的减少和服务器通讯的次数,获得更好的访问速度。

第三步,解决进程的<defunct>

由于采用的是fastCGI的方式,我配置了django.fcgi。可是,我发现系统进程中,有大量的django.fcgi进程被标记为< defunct>(失去功能)。这些<defunct>进程会导致服务器有时无法正常访问。我开始尝试用命令来kill掉这些进程,但是很快发现这无法从根本上解决问题。后来,我看到一个老外在blog上提到一个解决方案,将django.fcgi改名为dispatch.fcgi。原来,dispatch.fcgi是一个dreamhost的系统进程,它的健壮性是可以得到保障的。果然,我将django.fcgi改名为 dispatch.fcgi后,<defunct>的现象再没有出现。

第四步,优化SQL语句

SQL语句的执行通常也是一个很花费时间的操作。经过检查,我发现我的一条SQL语句,是一个嵌套三层的子表查询。而这条SQL还必须是一个Raw SQL,即不能采用django的OR Maping。这意味着不能被cache缓存,每次都是真刀真枪的执行。更失败的是,经过我的分析,这条SQL完全可以不执行。这是一次设计上的失误,标
准的over design(过渡设计)。当时,我是想通过数据库得到一个最精确的统计值。后来发现,这个值完全可以用一个近似的常量代替。优化SQL,尤其是避免不必要的SQL执行,带来的效果是非常明显的。

第五步,尽量减少页面大小

随着添加网站越来越多,有一天我发现django生成的首页已经达到了80k。我很清楚这是一个非常不能被接受的数字。我开始检查页面,很快发现了线索。第一,因为偷懒,页面中很多layout是用空格(&nbsp;)实现的。第二,因为为了增加代码可读行,调试方便,每行生成的页面都增加换行符 (/n)。第三,最糟糕的是,大量的用了
inline css。就是将css style直接嵌入标记块中。于是,我立即动手,用css的align解决layout,去掉/n,将inline css抽象到独立的css文件中。这样下来,在不更改任何内容的情况下,80k变成了57k。

第六步,用gzip进行页面压缩

当我兴高采烈的把页面优化结果贴到了smth bbs上,却被直接泼了盆凉水。原来百分之二十几的优化结果,实在太一般了。ylsdd给我了一个很重要的线索,deflate。原来apache的 deflate模块可以把文件进行gzip压缩,压缩后的文件传到浏览器后再被解压。主流的浏览器都支持这种gzip的解压操作。于是,我在apache 的配置文
件中加入了Add OutputFilter DEFAULT html css js的语句。经过测试,css,js这些文本文件的压缩后都只有原来尺寸的25%。这里,和大家分享一个网站http://www.port80software.com/products/httpzip/compresscheck 它的作用是检测你的网站是否被压缩,以及压缩比率等。

第七步,回归静态页面

新的问题又来了。原来deflate只支持静态文件的压缩。而我的首页是django动态生成的,deflate模块没有进行压缩。我突然想到,网站的首页为什么不能是静态页面呢?于是,我增加了一个runtime的api,这个api提供的是和原来一样由django动态生成的页面。我又写了一个 python的程序,通过urllib2模块下载这个动态生成的页面,并保存为index.html。我将网站的root映射到index.html这个静态页面。最后,通过linux crontab定义一个行为,每五分钟执行一下这个python程序,生成新的index.html。值得一提的是,由于网络原因,python程序不一定每次都能准确完整的下载动态生成的页面。所以我们必须再进行一个校验算法。当页面大小要超过一定数字,页面中出现某个校验字符串的情况下,才保存 index.html。这样,每次用户提交的访问,不是由服务器端动态生成页面,极大的节省了服务器端的开销。而静态页面又可以有效的被deflate压缩。最后结果,首页被压缩为13k,为原来的22%。唯一的区别就是,新提交和推荐的网站不能立即出现在首页。但是我认为,这应该是可以被接受的。

至此,网站的优化工作基本完成。网站的访问速度从原来30秒以上,缩短到3秒左右,应该说算是一个飞跃。虽然,3秒的速度也不是非常快,但是,考虑到虚拟主机等客观原因,这个结果我还是满意的。原来感觉我的网站很慢的朋友们,也可以再试试。

以上的优化方案出自我的个人经验,并不一定适合所有网站。但是,它告诉我们一个事实。影响网站访问速度的不仅仅是服务器配置,网络带宽。也许,你糟糕的设计,低效率的方案也是致命的因素。应当注意的是,优化工作也不能匆匆上手。一定要仔细研究,具体情况具体分析,得到统计数据,找到真正的问题所在,再开始优化。相信自己,提高网站的访问速度并不是不可能。毕竟,Nothing is Impossible。祝大家成功。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_860188.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高并发高流量网站架构

Web2.0的兴起&#xff0c;掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念&#xff0c;细分了网站功能和用户群&#xff0c;不仅成功的造就了一大批新生的网站&#xff0c;也极大的方便了上网的人们。但Web2.0以用户为导向的理念&#xff0c;使得新生的网站有…

架构之路 ---大型网站架构演变和知识体系

之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感觉有不少同学都很难明白为什么…

GitHub网站注册与登陆

注册 GitHub 网址&#xff1a;https://github.com/ 主页面就是注册输入框 Pick a username处输入用户名&#xff0c;英文&#xff0c;不区分大小写&#xff0c;登陆后页面显示时区分大小写&#xff0c;原则形象生动好记个性化 Your email address处输入你的邮箱地址&…

GitHub网站的基本操作

基本规则 仓库/repository&#xff0c;分支/branch 仓库是网页、代码、资料等在GitHub网站存放位置 repository下有branch&#xff0c;branch默认为master&#xff0c;用户需根据自身需要自建新的branch 登陆页面后&#xff0c;跳转到“Learn Git and GitHub without any code…

通过GitHub网站发布网页

通过GitHub网站建网页存储仓库 仓库名有要求&#xff0c;必须是 用户名.github.io&#xff0c;这样通过浏览器访问的时候才能访问到 点击“New repository”&#xff0c;新建仓库 克隆到本地 打开GitHub客户端&#xff0c;Clone仓库neet007.github.io 在本地GitHub文…

branch网站与客户端同步

未同步之前&#xff0c;网站与客户端均无branch&#xff0c;只有默认branch&#xff1a;master 网站新建**branch&#xff1a;**sync-branch 客户端无需任何操作&#xff0c;≤5分钟之后&#xff0c;客户端自动检测到branch&#xff1a;sync-branch 网站删除**branch&am…

GitHub网站文件删除

删除本地仓库/分支下的相应文件 将本地变化push到远程网站 GitHub网站相应文件删除成功

Node.js、Sublime text3、HTML5模板搭建基本简单静态web网站

1.Node.js基本环境搭建 略/参考前文 2.express/Node.js经典官方推荐web服务器框架 3.安装 express *cmd默认提示符为C:\Users\sarsers&#xff0c;Node.js、Sublime text3及相关项目文件夹均在D:盘&#xff0c;相关命令操作&#xff0c;最好切换到相应目录下&#xff0c;以免…

github 无法访问此网站 raw.githubusercontent.com

github 下载文件失败 无法访问此网站 使用Google Chrome可以访问https://github.com&#xff0c; 但是下载文件时提示报错&#xff0c; 如下&#xff1a; 使用ping检查地址 raw.githubusercontent.com, ping失败&#xff0c;显示域名解析失败。 上网使用域名查询工具 https…

怎么找到网站的出站链接及删除修改?

出站链接是向外的链接(outbound link)&#xff0c;从你的网页链出去的超链接&#xff0c;链到互联网上的不同页面&#xff0c;也叫导出链接。 网站上往往都会有一些其他网站的链接,有的是友情链接,有的是因为网站功能需求的链接,这些都是在你的控制范围之内的.而另外一些链接则…

前端小白建站一步到位

对于前端工程师&#xff0c;Linux小白的我来说&#xff0c;买云服务器自己建站简直难如登天&#xff1b; 后来在网上搜寻了各种参考资料&#xff0c;居然把买服务器&#xff0c;申请域名和备案&#xff0c;都跑通了&#xff0c;今天主要说说建站&#xff1a;目标&#xff1a;跑…

突然打开网站提示 Service Unavailabele

哈哈&#xff0c;今天客户给我说网站打不开&#xff0c;提示如下图的界面 当时的我顿时手无阻错&#xff0c;脑袋一片茫然&#xff0c;不知道如何才能处理这个问题。就在这时我看到了一片关于处理服务器windows server 2007 IIS的Service Unavailable 。其实就是对应应用程序池…

web前端性能SEO优化

转至&#xff1a; https://www.2cto.com/kf/201604/498725.html && https://www.cnblogs.com/EnSnail/p/5671345.html 浏览器访问优化 浏览器请求处理流程如下图&#xff1a; 1、减少http请求&#xff0c;合理设置 HTTP缓存 http协议是无状态的应用层协议&#x…

如何访问仅限IPv6的网站

网络作业&#xff1a; Use any means you know to access an IPv6-only website How to determine if a site is IPv4 only or IPv6 only How to configure your own host 翻译中文&#xff1a; 使用您知道的任何方法访问仅限IPv6的网站 如何确定站点是仅IPv4还是仅IPv6 如何配…

Apache禁止ip访问网站,禁止ip访问规则下载

本文转自IT摆渡网欢迎转载&#xff0c;请标明出处。 更多文章请阅读 SEO优化网络推广方法 最近经常有遇到网站被恶意的镜像&#xff0c;对方利用作弊手动复制自己的网站&#xff0c;相信也有不少的站长有遇到这些困扰&#xff0c;这篇文章教大家来禁止IP访问自己网站的方法…

网站内容标签元描述的优化细节

本文转自IT摆渡网欢迎转载&#xff0c;请标明出处。 更多文章请阅读 SEO推广方法 要想了创建良好的高质量的内容&#xff0c;一定少不了网页中的描述性标记。 一&#xff0c;创造独一无二、描述准确的标题 标题会影响到网页在搜索结果中的显示方式以及用户是否想在搜索结果…

discuzx不同网站孪生共用应用中心,或者应用中心密码忘记找不回的问题

首先 首先进入后台-应用-应用中心中安装插件时候会输入安全密码&#xff0c;如果密码忘记一般可以通过认证文件认证方式的找回。 如图 但是一旦更换域名或者其他问题造成找不回密码&#xff0c;我们想重新设置应用中心。或者遇到discuzX两个 网站 孪生共用一个应用中心时候 如…

从零带你从阿里云ESC服务器部署网站(学生机)

阿里云ESC服务器部署网站 文章目录 阿里云ESC服务器部署网站前言一.环境搭建1.购买学生机(ESC服务器)2.远程主机配置3.进入远程桌面4.更改window镜像5.配置安全组 二.使用本地电脑远程连接服务器1.连接远程服务器2.远程连接成功 三.配置IIS服务器1.安装IIS服务器2.index.html3.…

计算机网络——一次与网站的通讯

当我们在浏览器中访问百度&#xff0c;网络上会发生什么&#xff1f; 一、域名转服务器地址 我们都知道&#xff0c;网络中表明地址的是ip地址&#xff0c;但在浏览器中输入的都是域名&#xff0c;而在网络中&#xff0c;路由器交换机是不认域名的。这时就需要一个域名系统&a…

第二课 DedeCMS仿站-分析并保存目标网站

一、分析网站 网址&#xff1a;http://2082phpweb.weimeigu.tao891.cn/index.php 分析网页可以知道&#xff0c;网页由四个模板组成&#xff1a; 1、网站首页 2、公司简介、新闻中心、成功案例、销售网络、联系我们 3、产品展示、厂房设备 4、详情页&#xff08;新闻中心等列表…