优化LAMP站点速度的最佳实践?

时间:2009-03-30 15:56:23

标签: php mysql optimization lamp

我想知道在LAMP堆栈上构建典型站点时如何优化它以获得最佳加载时间。我正在描绘一个典型的数据库驱动的网站。

这是一个高级别的外观,可能会引起疑问,让我将其分解为堆栈的每一层。

L - 在系统级别,(设置和文件系统)可以提高速度吗?我能想到的一件事是图像尺寸,这里的压缩可以帮助优化任何东西吗?

A - Web服务器中必须有大量与站点速度相关的设置。不是我的Forte。可能很大程度上取决于同时运行的站点数量。

M - MySQL在数据库驱动的站点中,DB性能是关键。是否有更好的规范化方法,即使用链接表? Web开发人员通常只生成类似1NF的简单单片表,这可能会影响性能。

P - 除了缓存等性能提升设置之外,程序员可以做些什么来影响高级别的性能?我真的很想知道MVC设计方法是否比快速和肮脏更能达到性能。其他简单的提示比像饼干更快的会话会很有趣。

显然,您必须深入了解详细信息并找出哪些代码会降低您的速度。此外,我意识到许多站点具有许多不同的性能特征,但我们假设一个典型的站点有更多的读取然后写入。

我只是想知道我们是否可以汇编一堆最佳实践并完全希望人们将其他问题联系起来,以便我们能够有效地制定清单。

我的目标是看看即使除了表现中的常见问题外,我们还可以看到一些您可能没想到的奇怪的事情,以及最佳实践摘要。

所以我的问题是,如果你是从头开始,你会如何确定你的LAMP网站很快?

8 个答案:

答案 0 :(得分:33)

这是我在LAMP应用程序中总是设置的一些个人必备品。

  • 为apache安装mod_deflate,和 不要使用PHP的gzip处理程序。 mod_deflate将允许你 压缩静态内容,比如 javascript / css / static html,以及 作为通常的动态PHP输出,和 这是你不必担心的一件事 在你的代码中。

  • 小心.htaccess文件! 启用.htaccess文件 你的应用程序中的目录意味着 Apache必须扫描文件系统 经常,寻找.htaccess 指令。这要好得多 主要内部的指令 配置或虚拟主机 配置,它们被加载 一旦。任何时候你都可以摆脱一个 移动目录级访问文件 它进入主配置文件, 节省了磁盘访问时间。

  • 准备应用程序的数据库 图层以利用连接管理器 某种形式(我使用Singleton for 大多数应用)。它不是很好 很难做到,并减少了数量 您的数据库连接 应用程序打开可以节省资源。

  • 如果您认为您的申请会 看到重要的负载,memcached可以 创造奇迹。记住这一点 当你编写代码时......也许吧 有一天而不是创造对象 在飞行中,你会得到它们 来自memcached。有点先见之明 将使实施无痛。

  • 一旦您的应用启动并运行,请设置 MySQL的查询时间很慢 编号并监视慢查询日志 努力。这会告诉你在哪里 您的问题查询来自, 并允许您优化您的 它们之前的查询和索引 成为一个问题。

  • 对于认真表现的推特,你 将要从源代码编译PHP。 从包安装安装a 你可能永远不会有很多图书馆 使用。从PHP环境开始 加载到每个实例中 Apache线程,甚至是5MB内存 快速增加额外库的开销 当丢失内存时会丢失250MB 有50个Apache线程 存在。我保留了一份清单 我使用的标准./configure行 构建PHP here,我发现它 适合我的大部分应用。该 缺点是,如果你结束了 需要一个图书馆,你必须 重新编译PHP以获得它。分析 你的代码并在开发中测试它 环境,以确保你有 你需要的一切。

  • 缩小您的Javascript。

  • 准备移动静态内容, 如图像和视频,到 非动态Web服务器。写你的 代码,以便图像的任何URL和 视频很容易配置为指向 将来到另一台服务器。一个 针对静态优化的Web服务器 内容可以轻松服务数十甚至 比a快几百倍 动态内容服务器。

这就是我能想到的最重要的事情。谷歌搜索PHP最佳实践将找到很多关于如何编写更快/更好的代码的提示(例如:echoprint更快。)

答案 1 :(得分:11)

首先,要意识到性能是一个迭代过程。您不会一次性构建Web应用程序,启动它,也不会再次使用它。相反,您可以从小规模开始,并在网站增长时解决性能问题。

现在,详细说明:

  1. 资料。找出你的瓶颈。这是最重要的一步。您需要将精力集中在能够获得最佳效果的地方。您应该有适当的监控解决方案(如cacti或munin),让您了解服务器上发生的情况
  2. 缓存,缓存,缓存。您可能会发现数据库访问是后端最大的瓶颈 - 但您应该自行验证。幸运的是,您可能会发现很多流量都用于一小部分资源。您可以将这些资源缓存在memcached之类的内容中,从而节省数据库命中率,从而提高后端性能。
  3. 如上所述,请查看YDN性能规则。考虑拿起accompanying book。这将帮助您获得前端性能
  4. 安装PHP APC,并确保配置了足够的内存来保存所有已编译的PHP字节码。我们最近发现我们的APC装置没有足够的内存;给它足够的工作,将我们的CPU时间缩短一半,磁盘活动减少10%
  5. 确保您的数据库表已正确编入索引。这与监视慢查​​询日志密切相关。
  6. 上面的内容会让你走得很远。也就是说,如果你已经完成了上述工作,即使是一个数量相当大的网站,也应该能够在单个规范的服务器上进行首页挖掘。

    您最终会遇到默认apache配置无法始终跟上传入请求的程度。当你碰到这堵墙时,有两件事要做:

    1. 如上所述,个人资料。监控您的apache活动 - 您应该知道在任何给定时间有多少连接处于活动状态,此外还有突发流量突发时活动连接的最大数量
    2. 为此配置apache。这是我见过的apache配置的最佳指南:Practical mod_perl chapter 11
    3. 尽可能多地减轻apache的负担。 Apache非常重要,可以高效地提供静态内容。您应该使用轻量级反向代理(如squid)或Web服务器(lighttpd或nginx)来提供静态内容,并接管勺子提供字节以减缓客户端的工作。这使Apache能够做到最好:执行代码。同样,mod_perl书籍可以很好地完成explaining this
    4. 一旦你到目前为止,这主要是一个缓存更多的问题,并密切关注你的数据库。最终,你将超过一台服务器。首先,您可能会添加更多前端盒,所有前端盒都由单个数据库服务器支持。然后你将不得不开始传播你的数据库负载,可能是通过分片。有关此增长过程的精彩概述,请参阅this livejournal presentation

      要更深入地了解上述大部分内容,请查看Flickr成名的Cal Henderson的Building Scalable Web Sites。 Google有portions of the book available for preview

答案 2 :(得分:3)

我已经使用MysqlTuner对我的mysql服务器进行了性能分析,并深入了解了谷歌搜索的其他问题,并提出了自己的建议

答案 3 :(得分:2)

您可能会发现有用的资源是YDN set of performance rules

答案 4 :(得分:2)

不要忘记,您的用户将距离您的服务器数千英里,并下载数十个文件来呈现单个页面。这种延迟以及在浏览器中呈现页面的开销可能会大于您收集信息和生成页面所花费的时间。

请参阅Yahoo Developer Network上有关Best Practices for Speeding Up Your Web Site的页面,以及YSlow tool,了解网站下载的哪些部分需要时间。

答案 5 :(得分:2)

不要忘记关闭文件系统的时间!

答案 6 :(得分:2)

我建议使用Jet Profiler for MySQL查找任何错误查询。我已成功在我的几个网站上使用它。比慢查询日志更有帮助,更容易消化。

答案 7 :(得分:1)

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

开始

至于你的建议:

压缩图像,绝对没有。文件类型系统调整,是的,可能有一些影响,但很少。但实际上最好的方法是使用内存中反向代理,甚至更好的CDN。

对于Apache,基本上只加载你需要的模块。不要加载任何其他东西。与PHP一样,你只能使用分支MPM,重要的是要保持苗条。至于最佳设置,你必须将它们微调到特定的应用程序,硬件等。如果你有足够的CPU,建议你使用mod_deflate。服务器可以更快地将数据发送到客户端,它可以更快地开始处理下一个请求。