优化 LAMP 网站以提高速度的最佳实践? [关闭]
Posted
技术标签:
【中文标题】优化 LAMP 网站以提高速度的最佳实践? [关闭]【英文标题】:Best practices for optimizing LAMP sites for speed? [closed] 【发布时间】:2010-10-16 09:59:58 【问题描述】:我想知道在 LAMP 堆栈上构建典型网站时,如何优化它以实现最佳加载时间。我正在描绘一个典型的数据库驱动网站。
这是一个高级外观,可能会引起问题,让我将其分解为堆栈的每一层。
L - 在系统级别,(设置和文件系统)您可以做些什么来提高速度?我能想到的一件事是图像大小,这里的压缩可以帮助优化任何东西吗?
A - 在网络服务器中必须有大量与网站速度相关的设置。不是我的强项。可能很大程度上取决于同时运行的网站数量。
M - mysql 在数据库驱动的站点中,数据库性能是关键。是否有更好的规范化方法,即使用链接表? Web 开发人员通常只制作类似于 1NF 的简单单片表,这会影响性能。
P - 除了像缓存这样的性能提升设置,程序员可以做些什么来影响高水平的性能?我真的很想知道 MVC 设计方法是否比快速而肮脏的方法更能提高性能。其他一些简单的技巧,比如会话比 cookie 更快会很有趣。
显然,您必须深入了解细节并找出导致您速度减慢的代码。此外,我意识到许多站点具有许多不同的性能特征,但让我们假设一个典型的站点具有更多的读取然后写入。
我只是想知道我们是否可以汇编一堆最佳实践并完全期望人们将其他问题联系起来,以便我们可以有效地制定一份清单。
我的目标是看看,除了性能方面的常见问题之外,我们是否还能看到一些你可能不会想到的奇怪事物以及最佳实践摘要。
所以我的问题是,如果您从头开始,您将如何确保您的 LAMP 网站速度很快?
【问题讨论】:
【参考方案1】:我建议从http://highscalability.com/开始
至于你的建议:
图像压缩,绝对不行。文件系统调整的类型,是的,这可能会产生一些影响,但影响很小。但实际上最好是使用内存反向代理,甚至更好的 CDN。
对于 Apache,基本上只加载您需要的模块。不要加载其他任何东西。与 php 一样,您只能使用分叉 MPM,重要的是要保持苗条。至于最佳设置,您必须将它们微调到特定的应用程序、硬件等。如果您有足够的 CPU,建议您使用 mod_deflate。服务器可以更快地向客户端发送数据,它可以更快地开始处理下一个请求。
【讨论】:
【参考方案2】:我使用MysqlTuner 对我的 mysql 服务器进行性能分析,它对谷歌搜索的其他问题提供了很好的洞察力,并提出了自己的建议
【讨论】:
【参考方案3】:YDN set of performance rules 是您可能会发现有用的资源。
【讨论】:
【参考方案4】:不要忘记您的用户将远离您的服务器数千英里,并下载数十个文件以呈现单个页面这一事实。这种延迟以及在浏览器中呈现页面的开销可能大于您收集信息和生成页面所花费的时间。
查看 Yahoo Developer Network 上关于 Best Practices for Speeding Up Your Web Site 和 YSlow tool 的页面,了解网站下载的哪些部分需要时间。
【讨论】:
【参考方案5】:以下是我一直在 LAMP 应用程序中设置的一些个人必做事项。
为 apache 安装 mod_deflate,然后 不要使用 PHP 的 gzip 处理程序。 mod_deflate 将允许您 压缩静态内容,例如 javascript/css/static html,以及 作为通常的动态 PHP 输出,以及 你不必担心的一件事 关于在你的代码中。
小心 .htaccess 文件! 启用 .htaccess 文件 应用程序中的目录意味着 Apache 必须扫描文件系统 不断地寻找 .htaccess 指令。放置要好得多 main里面的指令 配置或虚拟主机 配置,加载它们的位置 一次。任何时候你都可以摆脱 通过移动目录级访问文件 将其放入主配置文件中, 节省磁盘访问时间。
准备应用程序的数据库 层利用连接管理器 某种形式(我使用单例 大多数应用程序)。不是很 难做,减少数量 数据库连接数 应用程序打开可以节省资源。
如果您认为您的应用程序将 看到显着的负载,memcached 可以 创造奇迹。记住这一点 当您编写代码时...也许 有一天,而不是创建对象 在飞行中,你会得到它们 来自内存缓存。有点远见 将使实施变得轻松。
应用启动并运行后,设置 MySQL的慢查询时间要小 编号并监控慢查询日志 努力地。这会告诉你在哪里 您的问题查询来自, 并允许您优化您的 查询和索引之前 成为一个问题。
对于认真的性能调整者,您 将要从源代码编译 PHP。 从包安装会安装一个 很多你可能永远不会的图书馆 采用。由于 PHP 环境是 加载到每个实例中 Apache线程,甚至5MB内存 额外库的开销快速 变为 250MB 的丢失内存时 有 50 个 Apache 线程 存在。我保留了我的清单 我使用的标准 ./configure 行 构建 PHP here,我找到了 适合我的大多数应用程序。这 缺点是如果你最终 需要图书馆,你必须 重新编译 PHP 得到它。分析 您的代码并在开发中对其进行测试 确保您拥有的环境 你需要的一切。
缩小 Javascript。
准备好移动静态内容, 例如图像和视频,以 非动态网络服务器。写你的 代码,以便图像的任何 URL 和 视频很容易配置为指向 将来到另一台服务器。一种 针对静态优化的 Web 服务器 内容可以轻松服务数十甚至 比一个快几百倍 动态内容服务器。
这就是我能想到的。谷歌搜索 PHP 最佳实践会发现很多关于如何编写更快/更好代码的技巧(例如:echo
比 print
更快)。
【讨论】:
+1 通常我同意,除了“软件包安装了很多你可能永远不会使用的库”。完全不正确,在任何现代 Linux 发行版中,PHP 都分为 php-common、apache2-mod_php、php-cli 和大约 30 个 php-whatever 每个库。你只安装/激活你需要的。 +1 非常有用的答案。好主意。 +1 以获得非常完整的答案。【参考方案6】:不要忘记为您的文件系统关闭 atime!
【讨论】:
【参考方案7】:首先,要认识到性能是一个迭代过程。您不会一次构建 Web 应用程序,启动它,然后再也不使用它。相反,您从小处着手,并随着网站的发展解决性能问题。
现在,具体来说:
-
个人资料。确定您的瓶颈。这是最重要的一步。您需要将精力集中在获得最佳结果的地方。您应该有某种监控解决方案(如 cacti 或 munin),让您可以了解服务器上发生的情况
缓存,缓存,缓存。您可能会发现数据库访问是您在后端的最大瓶颈——但您应该自己验证这一点。幸运的是,您可能会发现您的大量流量是针对一小部分资源的。您可以将这些资源缓存在 memcached 之类的东西中,从而为自己节省数据库访问量,并提高后端性能。
正如其他人在上面提到的,请查看 YDN 性能规则。考虑拿起accompanying book。这将帮助您提高前端性能
安装PHP APC,并确保它配置了足够的内存来保存所有已编译的PHP 字节码。我们最近发现我们的 APC 安装没有足够的内存;让它足以工作,将我们的 CPU 时间减少一半,磁盘活动减少 10%
确保您的数据库表已正确索引。这与监控慢查询日志密切相关。
以上内容将使您走得很远。也就是说,如果您完成了上述操作,即使是一个相当依赖 db 的网站也应该能够在单个规格适中的服务器上进行首页挖掘。
您最终会遇到默认 apache 配置无法始终跟上传入请求的情况。当你碰到这堵墙时,有两件事要做:
-
如上所述,配置文件。监控您的 apache 活动——您应该知道在任何给定时间有多少活动连接,以及当您突然流量激增时的最大活动连接数
请记住这一点来配置 apache。这是我见过的最好的 apache 配置指南:Practical mod_perl chapter 11
尽可能多地减轻 Apache 的负载。 Apache 过于繁重,无法有效地提供静态内容。您应该使用轻量级的反向代理(如 squid)或网络服务器(lighttpd 或 nginx)来提供静态内容,并接管向慢速客户端提供字节的工作。这让 Apache 做它最擅长的事情:执行你的代码。同样,mod_perl 的书在explaining this 方面做得很好。
一旦您走到这一步,主要是缓存更多内容并密切关注您的数据库。最终,您将超出单个服务器。首先,您可能会添加更多前端盒,所有这些都由单个数据库服务器提供支持。然后你将不得不开始分散你的数据库负载,可能是通过分片。有关此增长过程的出色概述,请参阅this livejournal presentation
要更深入地了解上述大部分内容,请查看 Building Scalable Web Sites,作者是 Flickr 名人的 Cal Henderson。谷歌有portions of the book available for preview
【讨论】:
【参考方案8】:我建议使用Jet Profiler for MySQL 查找任何错误查询。我已经在我的几个网站上成功地使用了它。真的很有帮助,而且比慢查询日志更容易消化。
【讨论】:
以上是关于优化 LAMP 网站以提高速度的最佳实践? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章