我有另一个相关的问题,但我偏离了它,因为我正在更改我的服务器以使用 nginx 而不是 Apache。
我仍然遇到问题,尽管它们现在更容易定位。这是我能提供的尽可能详细的情况:
我妻子有一个 WordPress 网站,里面有很多插件,包括 WooCommerce。即使只有我们两个人不停地上网(我打开了两个浏览器,她打开了一个),我们也能够让服务器停止运行。
系统规格:Debian 7.7、512MB RAM、512MB swap、2 核(速度未知)、nginx、PHP5-FPM、MySQL Server。
我的终端窗口的屏幕截图几乎讲述了这个故事:
在轻冲浪期间,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 核。
将您的应用程序和显示逻辑(正面)与数据访问逻辑和存储(背面)分开。数据库将生成大量 IO 活动,因此会减慢同一服务器内的其他操作。
添加内存。不,说真的,添加内存。访问存储在内存中的数据比访问存储在闪存驱动器中的数据更快,这比访问存储在旋转硬盘驱动器中的数据更快。
在应用程序和数据库之间添加一个缓存层,例如 memcached 或空间中的其他一些。同样,这意味着可以从内存中提取频繁访问的数据,而不是从旋转的盘片中提取。
更多硬盘。硬盘一次只能寻找一个物理位置。通过增加主轴数,您可以让其他人在阅读时进行搜索,并将更耗时的部分(搜索)分配给更多的物理设备。
在多个物理框之间拆分 web-head 并设置负载均衡器以在它们之间喷射请求(需要注意的是它们都将会话数据存储在共享存储中,例如数据库或 CIFS/NFS 共享中的文件),以便他们可以分担负载。
使用提供连接池和连接重用的 Web 服务器,因为相对于服务请求而言,启动连接的时间很长,尤其是在大多数 hte 数据都在内存中的情况下。
审核您的一个或多个服务器内部的进程,并确定是否存在没有建立价值的无关进程。确定是否有任何正在使用资源(RAM、CPU、磁盘 IO)但没有创造价值,并确定是否可以安全地禁用它们。
通过 Berkeley Syslog 将您的日志(尤其是 http 访问日志和 http 错误日志)流式传输到专用日志框(运行 RSyslogd 或 Splunk 等),而不是写入本地磁盘。同样,本地磁盘访问成本很高。
检测您的服务器并观察是否以及有多少数据正在从主内存换出到磁盘。如果超过 5%,或者数量不均匀且波动很大,请添加更多 RAM。说真的,分页到磁盘是缓慢、昂贵和痛苦的。
检测您的 php 并找出最繁忙的部分,以及哪些部分使用哪些资源集。为 RAM 使用、CPU 时间、磁盘 IO 使用、网络使用分配成本。按平均访问时间来衡量这些成本。实际上根据这些成本向自己收费,并将钱存入您的优化基金。现在看看如何省钱。
但说真的,更多的内存。
编辑1:这就是我可以打破它的方式。这是一个非常粗糙的餐巾纸背面设计,但它说明了如何使其规模化。可能看起来很新的部分是队列位。它们本质上抽象出网络流量,并使整个系统的耦合度降低。这意味着数据后端和网络头之间的瞬时瞬态将减少破坏性,并且将更容易恢复。队列在 Web 头中的应用程序和数据库服务器中的前端之间运行,并由队列管理器进行管理。这种更松散的耦合将减少在半夜为单个瞬时信号而进行寻呼的需要。
nginx 几乎不需要做任何调整。您可以执行的所有 OS/nginx 调整可能会使您每秒多获得 5-10% 的请求。在我看来,你比任何东西都更受内存限制。您最好的选择是从您的网络服务器中删除 php-fpm 进程,并创建 nginx 向其发送流量的应用服务器。