我还有另一个相关的问题,但是我偏离了它,因为我正在将我的服务器更改为使用 nginx 而不是 Apache。
我仍然遇到问题,尽管现在更容易定位了。以下是我所能提供的最详细情况:
我妻子有一个 WordPress 网站,上面有不少插件,包括 WooCommerce。即使我们两个人不停地浏览网页(我打开两个浏览器,她打开一个),我们也能使服务器停止运行。
系统规格:Debian 7.7、512MB RAM、512MB 交换、2 核(速度未知)、nginx、PHP5-FPM、MySQL 服务器。
我的终端窗口的屏幕截图几乎讲述了这个故事:
在轻度浏览时,vmstat si/so 值(大部分情况下)为 0。当我们同时浏览网站时,这些值会方式启动后,htop 显示出现了一些严重的问题。使用我拥有的新 nginx/php-fpm 设置,如果我简单地运行sudo service php5-fpm restart
,一切都会修复。Apache 也会出现同样的问题,如果我们同时浏览该网站,si/so 会飙升,网站会冻结,然后它会在一段时间后自行恢复,或者我必须重新启动 Apache。
我不知所措。我宁愿继续使用我的 nginx 设置并排除故障。在这种情况下,似乎 php-fpm 可能是问题所在。但是只有我们访问服务器,这是不可接受的。如果突然有 20 个人同时访问该网站,我们就完蛋了。
如果在 512MB 2 核服务器上尝试运行 WordPress 网站毫无意义,请告诉我。我可能必须升级到 1024MB/4 核。
答案1
将应用程序和显示逻辑(前端)与数据访问逻辑和存储(后端)分开。数据库将生成大量 IO 活动,因此会降低同一服务器内其他事物的速度。
添加 RAM。不,认真地说,添加 RAM。访问存储在内存中的数据比访问存储在闪存驱动器中的数据要快,而闪存驱动器中的数据又比访问存储在旋转硬盘中的数据要快。
在应用程序和数据库之间添加缓存层,例如 memcached 或该领域的其他缓存层。同样,这意味着可以从内存中提取频繁访问的数据,而不是从旋转的磁盘中提取。
更多硬盘。一个硬盘一次只能搜索一个物理位置。通过增加主轴数,您可以让其他硬盘在其中一个硬盘读取时进行搜索,并将更耗时的部分(搜索)分配给更多物理设备。
将 Web 头拆分到多个物理盒之间,并设置一个负载均衡器以在它们之间发送请求(需要注意的是,它们都将会话数据存储在共享存储中,例如数据库或 CIFS/NFS 共享中的文件),以便它们可以拆分负载。
使用提供连接池和连接重用的 Web 服务器,因为相对于服务请求而言,建立连接的时间很长,特别是当大多数数据都在内存中时。
审核服务器内部的进程,并确定是否存在未产生价值的无关进程。确定是否有任何进程正在使用资源(RAM、CPU、磁盘 IO)但未产生价值,并确定是否可以安全地禁用它们。
通过 Berkeley Syslog 将日志(尤其是 http 访问日志和 http 错误日志)传输到专用日志箱(运行 RSyslogd 或 Splunk 等),而不是写入本地磁盘。同样,本地磁盘访问成本高昂。
检测您的服务器,观察是否有数据从主内存交换到磁盘,以及有多少数据交换到磁盘。如果交换量超过 5%,或者交换量不均匀且波动很大,请添加更多 RAM。说真的,分页到磁盘很慢、成本高且很麻烦。
检测您的 php,找出哪些部分最繁忙,哪些部分使用哪些资源。为 RAM 使用量、CPU 时间、磁盘 IO 使用量、网络使用量分配成本。按平均访问时间衡量这些成本。实际上根据这些成本向您收取费用,并将资金投入优化基金。现在看看如何省钱。
但说实话,RAM 需要更大。
编辑 1:以下是我可能将其分解的方法。这是一个非常粗糙的餐巾纸背面的设计,但它说明了如何使其可扩展。可能看起来新的部分是队列位。它们本质上抽象了网络流量,并使整个系统不那么紧密耦合。这意味着数据后端和 Web 头之间的瞬时瞬变将不那么具有破坏性,并且将更容易恢复。队列在 Web 头中的应用程序和数据库服务器中的前端之间运行,并由队列管理器进行管理。这种松散的耦合将减少半夜因一个短暂的闪烁而需要呼叫的情况。
答案2
您需要对 nginx 进行很少的调整。您可以进行的所有 OS/nginx 调整可能会使您的每秒请求数增加 5-10%。在我看来,您受到的内存限制比任何事情都多。最好的办法是从您的 Web 服务器中删除 php-fpm 进程,并创建 nginx 发送流量的应用服务器。
---> internet -> nginx -> many app servers