[转]大型高性能网站的十项规则

news/2024/5/10 0:20:07/文章来源:https://blog.csdn.net/bluehire/article/details/17499147

在我们公司ChinaNetCloud,见 过多种不同类型的网站和系统,有好也有差。其中有些系统拥有良好的服务器/网络架构,并且进行了合理的调整和监控 ;然而一般的系统都会有安全和性能上的 问题,不能良好运行,也无法变得更流行。

在中国, 开源的LAMP栈是最流行的网络架构,它使用PHP开发,运行在Apache服务器上,以MySQL作为数据库,所有这些都运行在Linux上。它是个可 靠的平台,运行良好,是现在全球最 流行的Internet系统架构。然而,我们很难对其规模进行正确的扩展并保持安全性,因为每个应用层都有其自身的问题、缺陷和最佳实践。我们的工作就是 帮助企业用最低的操作成本来创建并运行高性能的、可伸缩的、安全的系统,因此对于这类问题我们有很丰富的经验。

当前的实际情况是,很多网站 都是由开发人员 快速而廉价地创建,通常没有任何IT人员或者经理,只是由程序员来管理系统。造成的结果是,虽然花费很低的成本网站就可以开始运行,但是当拥有大量用户、 需要扩展规模的时候,通常就会面临真正的问题。毕竟,中国拥有三亿八千万的Internet用户,如果其中的0.01%访问这个站点,就很容易引发25 万~50万的页面访问量。这些问题在各个级别上都会产生,下面总结的规则是对最一般的问题进行概述,并且说明为什么这些规则如此重要,以及最好采用什么方 法来修正它们。遵循这些建议的站点会提高它的可伸缩性、安全性以及操作上的稳定性。


使用合适的会话管理
第 一个想到的扩展系统的方法就是添加更多硬件。例如,使用两台服务器而不是一台。这听着合理,但会产生潜在问题:会话管理。这对Java程序来说是很严重的问题,在PHP中也会产生可延展性问题, 对于数据库的负载尤其如此。

会话被定义为单独的最终用户 登录或者连接一 段时间,其中通常会包含多个TCP/IP的HTTP连接、几个Web页面,通常还包括几十个甚至上百个页面元素,如框架、菜单、Ajax更新等。所有这些 HTTP请求都需要知道用户是谁,才能满足安全的要求,并向用户传送适当的内容,因为这些都是会话的组成部分。通常每个会话都会包括相互关联的会话数据, 如用户名、用户ID、历史、购物车、统计资料等等信息。

问题在 于,在有两台Web服务器和多个 HTTP连接的情况下,用户流量会在两台服务器之间分配和移动,服务器很难知道用户是谁,并对所有数据进行跟踪,因为每个页面或者页面的组成部分都可能来 自不同的服务器。在PHP中,通常是这样解决的,在第一次连接或登录的时候就创建一个会话ID并将其放在Cookie中,然后这个Cookie会和每个 HTTP请求一起发送。

这样做带来一个问题,接下来 每段PHP脚本 都需要基于ID来查找会话数据。由于PHP无法在执行过程之间保持状态(这与Java不同),这个会话数据需要存储在某个地方,通常是在数据库中。但是, 如果复杂的页面需要在每个页面载入过程中对其进行十次查找(这是经常要做的),那就意味着每个页面都要执行10次SQL查询,这会导致数据库上很大的负 载。

在前面所举的中国 Internet用户 0.01%的例子中,可能很容易在每秒内仅仅为了管理会话就生成上百个查询。解决方法是一直使用位于Cookie中的会话ID,并且使用像 Memcached之类的服务来缓存会话数据以获得高性能。

还要注 意其中存在安全性的问题,因为黑客可 以伪造另一个用户的会话ID,这是很容易找到或看到的,特别是在公用的Wi-Fi中。解决方法是对会话ID进行恰当的加密或者签名,并将其与时间区间、 IP地址以及其他关键信息 像浏览器或者其他细节相绑定。在Internet上有很多不错的关于良好的会话管理的例子,你可以根据需要找到最适合的。

 

总是要考虑安全性
尽管编写像防止SQL注 入和登录安全之类的 代码涉及很多安全问题,但不幸的是,几乎没有人考虑过安全性,而那些考虑到的人也没有对其进行很好地理解。而本文要关注的是操作性的系统安全。对于这类安 全,我们的焦点集中在三个安全领域:防火墙、运行的用户以及文件访问权限。

除了配置专门的硬件防火墙 (像Cisco的 ASA)之外,所有服务器都还应该运行像Iptables之类的防火墙,它会保护服务器免受其他威胁和攻击。这些威胁和攻击可能来自公共的 Internet、其他服务器或本地服务器,也包括使用VPN或者SSH通道的开发和操作人员。我们仅对指定的IP开放确实需要的端口。Iptables 可能会很复杂,但是有很多不错的模板,我们通常可以使用它们来帮助客户创建Iptables。例如,默认的RedHat或者CentOS防火墙的配置说明 只有10行,显然并不实用。我们最佳实践的Iptables配置大概有5页,这其中包含了Linux所能提供的最高级的安全防范。

所有公用的服务,都应该运行 在专门的用户 下,如Apache。切记永远都不要使用Root用户运行,因为这会让任何闯入到Apache的用户接管整个服务器。如果Apache只是运行在 Apache用户下或者运行在Nobody下,那么闯入Apache就不是一件容易的事情了。

Web服务器运行或者服务的文件 (像.php和.html文件)对于Web服务器的用户应该是不可写的。这意味着Apache或者Nginx用户不应该拥有Web目录的写权限。有很多方 法都可以做到这一点,而最简单的就是将这些文件为其他用户所有,然后让Apache/Nginx等用户归属于能够使用640权限读取文件的组中。这会防范 几乎所有的黑客和针对页面的攻击。

此 外,永远不要使用Ftp来上传文件,特别 是在公用的Wi-Fi环境中,因为在其中黑客很容易盗取用户名和密码。取而代之的是使用Sftp会更加安全。另外,每个雇员都应该拥有自己的用户ID和随 机密码。

 

使用标准的路径和安装配置

一个令人讨厌的部署问题是, 开发者很少考虑 他们的软件会被部署到生产Web服务器的什么位置,以及如何部署。我们看到过许多大型的系统将它们的PHP代码部署在/home/xiaofeng或者 /web/code路径下。事实上,这两个路径都是非常不标准的,并且会带来操作和安全性的问题。当这些系统从开发环境转移到测试环境再到生产环境中时, 因为每个安装配置都是非标准的,所以经常会出现问题,这时就需要开发者调整才能够正常工作。

你应该总是使用标准的安装包和二进制文件来 安装像Apache之类的服务器。不要从源代码编译或者安装Tarball,因为这会导致长期稳定性和管理上的问题,另外在服务器上安装多个不同的版本也 会造成混淆。

Web 站点应该总是在指定的平台和 Linux发布的标准路径下进行测试和部署 ,像 RedHat 或者CentOS下的/var/www/html路径。这有助于对系统进行有效的权限管 理、备份、配置、监控以及其他操作。

Web 服务器的日志应该存放在/var /logs或者/var/logs/app_name下,而不应该位于主代码区域。这样做的原因不仅仅是因为这些标准的路径很重要,更应该关注的是,恰当 地配置服务器会将/var配置为分离的文件系统。如果应用程序突然写入了大量日志并占用所有磁盘空间,由于我们做了以上的配置就不会导致系统崩溃,或者其 他严重的问题。如果日志位于其他位置,就可能会产生问题。

总是使用日志

在Web系统中做多少日志都不为过。所有系 统都应该将重要的数据写入到日志中,不管是它们自己的日志还是系统的Syslog。Cron的Job以及其他Shell脚本或者C语言的程序,对日志都有 相应标准以及简单的函数。在Shell脚本中,只需要使用 Logger命令就可以实现日志的写入。在脚本启动/停止、重要的脚本执行以及实时数据产生的 情况下都要执行写入日志操作。这样出现问题的时候,查看主要的系统日志就可以很容易地看到发生了什么。

大型系统经常会使用专门的工 具如 Local5来记录日志,并配置Syslog或者Syslog-ng来将其存放在单独的文件中,这样会更容易使用。需要注意的是,Syslog工具和 Logger(以及任何Syslog调用)默认优先使用user.notice,如有必要,你可以对其进行调整。

一个好的系统会对程序进行配置,用来打开或 者关闭日志,并可以选择在每模块或者功能的级别上应用不同级别的日志。这使得我们可以记录非常详细和强大的日志,用来分析和调试在生产操作中所发生的问 题。


大型网站的十项规则

大型高性能网站的十项规则

 

使用良好的数据库设计和SQL

在任何系统中,数据库通常是 最大的性能瓶 颈。而影响数据库性能的最大两个问题是数据库设计和SQL代码质量。很多系统都拥有良好的或者至少是可用的数据库设计,但由于没有经过适当的性能测 试,SQL代码质量通常都会很差。这样的SQL代码在开发环境中可能运行很快,因为其中只有小数据集和最小的负载。但是当成千上万的用户同时读取数据库中 上百万条记录的时候,它就很可能会崩溃。

不幸的 是,这些问题一开始并不明显,直到系 统增大、突然开始崩溃的时候才会显现出来。在增大的过程中,数据库系统看起来运行得很快(因为数据都位于内存中,而且很少有并发的查询),并且对用户的响 应也很快,但实际上它的内部运行效率很低。这并不重要,我们关注的是在系统增大并遇到性能问题之前找到这些问题并加以解决。

关于这个问题有很多不错的书 和站点进行了解 析,其中的关键工具包括慢查询日志、INNODB状态系统,以及描述当前性能的MySQL统计信息。我们见到过很多系统每秒会读取500,000条数据, 这是出现SQL问题的明显预兆,但公司往往对其一无所知直到服务器开始崩溃。

MySQL系统应该对所有数 据使用 INNODB存储引擎,因为INNODB与之前的MyISAM相比,运行得更快、更稳定,并且管理性能和备份工作也更加容易和快捷。在主配置文件 中,INNODB应该被设置为默认的数据库引擎,并且系统应该不时地进行检查,看是否意外创建了MyISAM的表。

总要拥有良好的DB配置和备份

很多公司都没有良好的备份机制,也不知道如 何恰当地完成这项工作。MySQL的Dump是不够的,因为最好的备份方法是使用LVM快照和INNODB对系统进行热备份,从而得到超快的速度和超高的 可靠性。

另外,在将所有备份文件从服 务器上转移出来 之前要进行压缩和加密。另外还要确保拥有设计合理的MySQL配置。MySQL默认安装使用说明中只有5~10行关于配置的说明,这根本不适合开发使用。 而我们提供给客户的最佳实践文档足足有10页那么长。文档中大约有100种有用的关于安全、性能和稳定性问题的设定,包括防止数据败坏,其中很多设定都是 非常重要的。

使用读/写数据库分离

随着系统变得越来越庞大,特 别是当它们拥有 很差的SQL时,一台数据库服务器通常不足以处理负载。但是多个数据库意味着重复,除非你对数据进行了分离。更一般地,这意味着建立主/从副本系统,其中 程序会对主库编写所有的Update、Insert和Delete变更语句,而所有Select的数据都读取自从数据库(或者多个从数据库)。

尽管概念上很简单,但是想要 合理、精确地实 现并不容易,这可能需要大量的代码工作。因此,即便在开始时使用同一台数据库服务器,也要尽早计划在PHP中使用分离的DB连接来进行读写操作。如果正确 地完成该项工作,那么系统就可以扩展到2台、3台甚至12台服务器,并具备高可用性和稳定性。

使用类似Memcached之类的数据库缓存

即便有了好的数据库设计、 SQL和读写分 离,大型的系统仍然需要更快的性能,特别是对会话状态、好友列表以及BBS文字之类的东西。为了达到这个目的,我们可以使用像MemCached之类的数 据缓存,它是一个高性能的简单数据缓存,已经被所有最大型的站点使用。但是要小心的是,不要100%依赖于一台Memcache服务器来提高性能,因为如 果那台服务器崩溃了,就会破坏整个系统的性能。在这种情况下,应该使用2~3台Memcache服务器形成簇集架构,并且有选择地包含一个缓存准备过程, 如果缓存服务器重启,需要重新载入数据,它能够快速地载入缓存。


构建测试和开发环境

很多公司只有开发者的桌面系 统和他们的生产 服务器。当系统变得越来越大、越来越复杂时,测试和管理代码就会导致严重的问题。最佳的实践是拥有两个测试系统,一个用于开发者的代码和功能的整合测试, 另一个要与生产环境完全一致,从而更容易向生产环境平滑地过渡。幸运的是,现在使用云计算(或者私有云)可以轻松达到这一点。一个5~10台服务器的生产 环境,可以很容易地在办公室或者IDC中使用一台服务器来复制,从而用于测试,而这台服务器我们可以用于多个客户的项目。


使 用版本控制

最后,要对一切使用版本控制,包括测试和生 产环境的部署。很多开发者都使用SVN或者类似的方法。在理想状态下,这些方法可以被用于所有代码、脚本、HTML、图片、配置、文档和测试。版本控制应 该是代码转移到测试环境的必经之路,而不是简单地复制或者使用tar文件,因为这二者都是不可靠的。开发者应该将所有一切都签入,打上标签,然后将它们签 出到测试系统。如果所有都没问题,那么它们会将该版本签出到生产环境。

总结

不管 是在开发还是在运营过程中,创建可靠的 高性能Web系统都有很多应该注意的事项。本文试图从可操作性和可靠性的角度讨论最重要的几点。当你构建和管理站点的时候,请不要忘了这些重要的问题。遵 循这些规则会有助于确保系统长久、良好地运行。

作者简介:

Steve Mushero,ChinaNetCloud 公司联合创始人、CEO兼CTO,拥有全球20多年的技术管理经验。曾担任土豆网、Intermind和 Advanced Management Systems等多家企业CTO

译者简介:

侯伯薇,生于凤城,学在春城,做过国内和对 日项目,现在大连某保险公司工作。乐于钻研技术,同时注重业务知识,勤于思考,愿意与人交流和分享。

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(106) | 评论(0) | 转发(0) |
0

上一篇:[转]淘宝的可伸缩高性能互联网架构揭密

下一篇:Python 学习笔记

相关热门文章
  • IP Sec VPN与NAT破镜重圆
  • 网站导航
  • UT2.0正式版下载
  • tomcat6.0配置(含配置视频下载...
  • Gomez中国网站用户体验排行榜(...
  • LNMP 老是会出现502?
  • suse 运用一个shell获取本机和...
  • 虚拟机 unix 配置ip
  • hp-un 主机新系统读不到磁盘阵...
  • mysql出现问题:Starting MySQ...
给主人留下些什么吧!~~
评论热议

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

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

相关文章

[转]LAMP网站架构方案分析

LAMP&#xff08;Linux-Apache-MySQL- PHP&#xff09;网站架构是目前国际流行的Web框架&#xff0c;该框架包括&#xff1a;Linux操作系统&#xff0c;Apache网络服务器&#xff0c;MySQL数据库&#xff0c;Perl、PHP或者 Python编程语言&#xff0c;所有组成产品均是开源软件…

百万流量网站架构

最近设计一个网站,设计目标是百万访问量. 做了一些架构的设计. 同时对二期架构进行了展望<script typetext/javascript charsetutf-8 src"http://static.bshare.cn/b/buttonLite.js#style-1&uuid&pophcol3&langzh"></script> <script t…

[转]高并发高流量网站架构设计(参考)

高并发高流量网站架构设计&#xff08;参考&#xff09; 2009-11-24 16:19:58 来自: sharp(follow my heart) 目 录 1引言9 1.1互联网的发展9 1.2互联网网站建设的新趋势9 1.3新浪播客的简介11 2网络层架构12 2.1镜像网站技术12 2.2 CDN内容分发网络13 2.3应用层分布式设计1…

安全机构 abuse.ch 公布近10万个恶意网站

百度智能云 云生态狂欢季 热门云产品1折起>>> 据官方博客文章&#xff0c;2018 年 3 月底&#xff0c;非盈利安全机构 abuse.ch 运行了一个名为 URLhaus 的项目。这个致力于收集和分享散布恶意软件的网站 URL 的项目取得了巨大的成功&#xff0c;URLhaus 在 10 个月…

php特级课---2、网站大数据如何存储

php特级课---2、网站大数据如何存储 一、总结 一句话总结&#xff1a; mysql主从&#xff0c;分库分表&#xff0c;mysql分区&#xff0c;mysql集群&#xff0c;Nosql 1、mysql主从服务器各自的功能是什么&#xff1f; 增删改&#xff0c;主服务器 查询&#xff0c;备份&#x…

网站安装打包 软件环境检测与安装[二] 上

2019独角兽企业重金招聘Python工程师标准>>> 这一节主要讲检测&#xff0c;下一节讲安装! 一个C#制作完的工具一运行&#xff0c;一个可以不用检测与安装的就是framework环境了,要是没这东西&#xff0c;也运行不起来。 这里提供几个检测的范围&#xff1a; 一.检测…

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书&#xff0c;就应该有所收获&#xff0c;有所总结&#xff0c;最近把《大型网站技术架构》一书给看完了&#xff0c;给人的印象实在深刻&#xff0c;再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…

12 个免费的 Deep Learning 在线学习网站

转载自&#xff1a;https://zhuanlan.zhihu.com/p/26501934 欢迎留言交流~~~ Deep Learning 改变着世界&#xff0c;各种利用 DL 的技术已经开始服务人类&#xff1a; 发现癌症&#xff08;准确率远超人类病理学家&#xff0c;Google 用深度学习算法检测癌症 &#xff09;、 图…

网站访问量怎么刷_网站建设怎么获得访问量?

一、圈子里宣传在网站建设完成之后&#xff0c;企业可以将网站转发到一些平台上&#xff0c;尤其是聊天软件。这样通过人与人之间的转发&#xff0c;能够小范围提高网站访问量。也可以发到空间或者朋友圈&#xff0c;甚至一些社交平台上&#xff0c;利用自己的人脉迅速让一个小…

Python实战项目之博客网站搭建

参考&#xff1a;廖雪峰网站 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 http://blog.csdn.net/lm409/article/details/63687293 Day 1 - 搭建开发环境 搭建开发环境 首先&#xff0c;确认系统安装的Python版本是3.5.x&#xf…

Google 联合一些社交网站来对抗 facebook

谷歌(Google) 将与其它一些行业领先的社交网站联手&#xff0c;共同对抗互联网新贵Facebook。  谷歌将于周四推出一个通用标准集 ( OpenSocial )&#xff0c;允许软件开发者为谷歌旗下社交网站Orkut&#xff0c;以及LinkedIn、hi5、Friendster、Plaxo和Ning等其它社交网站开…

png压缩,jpg压缩不错的网站推荐

https://tinypng.com/ 这个网址对于手动批量压缩png和jpg挺不错的&#xff0c;mark一下。虽然用了多年&#xff0c;还是觉得不错。

使用开源WordPress和WebStack搭建导航网站

目录 一、前言 二、WordPress和WebStack简介 三、安装与部署 1. 服务器环境搭建LNMP 1.1 购买Linux服务器 1.2 安装Nginx 1.3 安装MariaDB 1.4 安装PHP 2. 安装WordPress 2.1 配置数据库 2.2 下载WordPress源文件 2.3 安装WordPress 3. 安装WebStack主题 四、Web…

盘点Web2.0峰会-社交网站领风骚

网易科技 讯 10月23日消息&#xff0c;美国第六届Web2.0峰会&#xff08;Web2.0 Summit 2009 &#xff09; 于当地时间10月20日-10月22日在旧金山举行。本届Web2.0峰会的主题是“Web Squared”&#xff0c;意思是说&#xff1a;Web2.0应用、技术和网站已经不仅仅是一组创新的网…

鄙视这些垃圾网站,居然篡改俺的注册表,实在气愤

不知是哪天&#xff0c;同事拿我本本上网下东西&#xff0c;可能是下什么东西吧&#xff0c;上了verycd。265。com&#xff08;为了不给它出现连接的机会故意把.改为。&#xff09;居然把我注册表都修改了&#xff0c;着实气愤&#xff0c;&#xff0c;而且在ie选项的主页设置里…

网站已死 互联网永生

从诞生到现在&#xff0c;网站已经走过了20个年头。相比当年的流行&#xff0c;如今它已经开始衰落&#xff0c;逐渐让位于更简单且时髦的智能应用。这些应用更关注的不是搜索效果&#xff0c;而是信息获取。克莱斯安德森(Chris Anderson)向我们解释了这些新应用所反映的资本聚…

网站动态背景线条跟随鼠标移动,吸附鼠标效果代码

实现如图所示的一个动态背景线条随鼠标移动而吸附聚集的一个效果&#xff0c;代码如下&#xff1a; <!--代码放置于</body>上方--><script>!function(){function n(n,e,t){return n.getAttribute(e)||t}function e(n){return document.getElementsByTagName…

10个非常棒的Ajax及Javascript实例资源网站

今天&#xff0c;暴风彬彬要向大家推荐10个相当棒的Ajax和Javascript国外资源网站或博客&#xff0c;它们提供了相当多的高质量Ajax、Javascript实例及教程&#xff0c;喜欢Ajax和Javascript的朋友绝对不能错过。彬Go曾经还介绍过300多个Javascript导航菜单,有兴趣的话&#xf…

网站全文检索设计

1、架构设计采 用OLTP交易数据库和OLAP数据仓库&#xff08;用于搜索和分析&#xff09;分离的模式&#xff0c;OLTP作为OLAP的数据源通过SQL Server Integration Services (SSIS)定期导入到OLAP数据仓库环境中&#xff0c;OLAP采用星型结构以便于更好地满足搜索和将来的数据挖…

美女SEO系列五:什么是外链?如何做高质量外链?

每天我们的工作就是做内容和发外链&#xff0c;那么对与新手SEO而言&#xff0c;什么是外链?高质量的外链怎么去做呢?那么&#xff0c;美女SEO周珍就来和大家一起来分享下吧! 一、什么是外链?外链&#xff0c;顾名思义就是指从别人的网站导入到自己网站的链接。导入链接对于…