优化LAMP网站速度的最佳做法是什么?

21
我想知道在LAMP技术栈上建立一个典型网站时,如何优化以获得最佳的加载时间。我正在构想一个典型的数据库驱动网站。
这是一个高层次的看法,可能会涉及到问题,让我把它分解成每个层面。
L - 在系统层面(设置和文件系统)可以做什么来提高速度?我能想到的一件事是图像大小,压缩是否有助于优化?
A - 在Web服务器中肯定有大量与网站速度相关的设置。这不是我的强项。可能很大程度上取决于同时运行多少个站点。
M - MySQL在一个数据库驱动的站点中,DB性能是关键。有没有更好的规范化方法,比如使用链接表?Web开发人员通常只制作简单的单片式表类似于1NF,这可能会降低性能。
P - 除了像缓存这样的提高性能的设置之外,程序员可以从高层面上做些什么来影响性能?我真的很想知道MVC设计方法是否比快速而粗糙的方法对性能产生更大的影响。其他简单的提示,例如会话是否比Cookie更快,也很有趣。
显然,您必须深入细节并找出哪些代码正在减慢您的速度。我也意识到,许多站点具有许多不同的性能特征,但假设一个典型的站点具有更多的读取而不是写入。
我只是想知道是否可以编制一系列最佳实践,并完全期望人们链接其他问题,以便我们有效地组织一个清单。
我的目标是看看除了性能中通常存在的问题外,我们是否可以看到一些奇怪的东西出现,以配合最佳实践总结。
所以我的问题是,如果您从头开始,如何确保您的LAMP网站快速?
8个回答

35

以下是我在我的LAMP应用程序中常常使用的个人必备设置:

  • 安装apache的mod_deflate,不要使用PHP的gzip处理程序。mod_deflate可以压缩静态内容,如javascript/css/static html,以及通常的动态PHP输出,并且它可以减少你在代码中需要考虑的内容。

  • 小心使用.htaccess文件!为应用程序中的目录启用.htaccess文件意味着Apache必须不断扫描文件系统,寻找.htaccess指令。最好将指令放置在主配置或虚拟主机配置中,这样它们只会被加载一次。每当你通过将其移到主配置文件中来去除一个目录级别的访问文件时,都可以节省磁盘访问时间。

  • 准备应用程序的数据库层以利用某种类型的连接管理器(我对大多数应用程序使用单例)。做起来并不难,减少应用程序打开的数据库连接数量可以节省资源。

  • 如果你认为你的应用程序会承受重负载,memcached可以创造奇迹。在编写代码时记住这一点...也许有一天,你会从memcached获取对象而不是即时创建它们。稍有预见性就能让实现变得轻松。

  • 一旦你的应用程序运行起来,将MySQL的慢查询时间设置为一个小的数字,并认真监控慢查询日志。这将显示问题查询的来源,并允许你在它们成为问题之前优化查询和索引。

  • 对于严格追求性能的人来说,你会想要从源代码编译PHP。从包中安装会安装很多你可能永远不会使用的库。由于PHP环境加载到每个Apache线程的所有实例中,即使是来自额外库的5MB内存开销,在有50个Apache线程运行时也会迅速变成250MB的失去内存。

存在。我会保存我在构建PHP时使用的标准./configure命令行这里,我发现它适用于我的大多数应用程序。缺点是,如果你最终需要一个库,则必须重新编译PHP才能获得它。分析你的代码并在开发环境中进行测试,以确保你拥有所需的一切。

  • 压缩你的Javascript。

  • 准备好将静态内容(如图像和视频)移动到非动态Web服务器上。编写你的代码,以便未来可以轻松配置任何图像和视频的URL以指向另一个服务器。专为静态内容优化的Web服务器可以比动态内容服务器快数十甚至数百倍轻松提供服务。

  • 这就是我能想到的。在谷歌上搜索PHP最佳实践也会找到很多关于如何编写更快/更好代码的技巧(例如:echo比print快)。


    3
    大致上我同意,除了“软件包安装了很多你可能永远不会使用的库”这句话。在任何现代Linux发行版中,PHP都被分成了php-common,apache2-mod_php,php-cli以及大约30个针对每个库的php-whatever。你只需要安装/激活你需要的那些。 - vartec
    +1 非常有帮助的答案。好主意。 - Peter Perháč
    +1 对于一个非常完整的答案。 - Anthony

    12

    首先,认识到性能是一个迭代的过程。你不会一次构建一个Web应用程序,然后启动它,从此不再工作。相反,你需要从小做起,并随着站点的增长解决性能问题。

    接下来,进入具体内容:

    1. 剖析。确定你的瓶颈。这是最重要的步骤。你需要将精力集中在能取得最佳结果的地方。你应该有一些监控解决方案(如cacti或munin),让你能够看到服务器上正在发生什么
    2. 缓存,缓存,缓存。您可能会发现数据库访问是后端的最大瓶颈,但您应该自行验证此问题。幸运的是,您可能会发现很多流量都是针对一小组资源的。您可以将这些资源缓存到类似于memcached的东西中,节省数据库操作,提高后端性能。
    3. 正如其他人在上面提到的,看看YDN性能规则。考虑阅读相关书籍。这将帮助您提高前端性能。
    4. 安装PHP APC,并确保它配置了足够的内存来保存所有编译的PHP字节码。我们最近发现我们的APC安装的内存远远不够;给它足够的内存可以将CPU时间减少一半,并将磁盘活动降低10%
    5. 确保您的数据库表正确索引。这与监视慢查询日志密切相关。

    以上内容将使您走得很远。也就是说,即使是相当依赖数据库的站点,如果您已经完成了上述操作,单个适度规格的服务器也应该能够在首页Digg时进行生存。

    您最终会遇到默认Apache配置无法始终跟上传入请求的情况。当您遇到此问题时,有两件事要做:

    1. 如上所述,配置文件。监控您的Apache活动-您应该知道任何时候有多少连接处于活动状态,以及在出现突发流量时活动连接的最大数量
    2. 在考虑上述因素的情况下配置Apache。这是我见过的最好的Apache配置指南:实用mod_perl第11章
    3. 尽可能减轻Apache的负载。 Apache太重,不能有效地提供静态内容。 您应该使用较轻的反向代理(例如squid)或Web服务器(lighttpd或nginx)提供静态内容,并接管向慢客户端传送字节的任务。 这样,Apache可以专注于执行您的代码。 同样,mod_perl书籍解释了这一点

    一旦您完成了这些步骤,主要问题就是更多地进行缓存,并密切关注数据库。 最终,单个服务器将无法满足您的需求。 首先,您可能会添加更多的前端盒子,所有这些盒子都由单个数据库服务器支持。 然后,您将不得不开始在数据库负载周围分配负载,可能通过分片来实现。 有关此增长过程的出色概述,请参见此livejournal演示文稿

    如需更深入地了解上述内容,请查看Flickr著名的Cal Henderson所写的《构建可扩展的Web站点》。Google已经提供该书的部分内容预览。


    3

    我曾在我的MySQL服务器上使用MysqlTuner进行性能分析,它提供了深入了解进一步问题的信息,同时也提出了自己的建议。


    2

    2
    不要忘记这个事实,即您的用户将与您的服务器相隔数千英里,并下载数十个文件以呈现单个页面。那种延迟和在他们的浏览器中呈现页面的开销可能比您收集信息和生成页面所花费的时间更长。
    请参阅Yahoo Developer Network上有关加速网站最佳实践的页面,以及YSlow工具,以查看网站下载的哪些部分需要时间。

    2
    不要忘记为您的文件系统关闭atime!

    2
    我建议使用Jet Profiler for MySQL来查找任何糟糕的查询。我已经成功地在我的几个网站上使用过它。非常有帮助,比慢查询日志容易理解得多。

    1

    我建议从 http://highscalability.com/ 开始

    至于你的建议:

    关于图片压缩,绝对不行。文件系统调优,可以有一些影响,但是很小。但实际上最好的方法是使用内存反向代理,甚至更好的是CDN。

    对于Apache,基本上只加载您需要的模块。不要加载其他任何东西。与PHP一样,你只能使用forking MPM,保持其简洁非常重要。至于最佳设置,您必须对特定应用程序、硬件等进行微调。如果您有足够的CPU,建议使用mod_deflate。服务器能够更快地向客户端发送数据,处理下一个请求的速度就越快。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接