![Apache + SuPHP + 数百名访问者 + 网页上传 = CPU 崩溃。除了切换到 NginX 之外还有其他想法吗?](https://linux22.com/image/643616/Apache%20%2B%20SuPHP%20%2B%20%E6%95%B0%E7%99%BE%E5%90%8D%E8%AE%BF%E9%97%AE%E8%80%85%20%2B%20%E7%BD%91%E9%A1%B5%E4%B8%8A%E4%BC%A0%20%3D%20CPU%20%E5%B4%A9%E6%BA%83%E3%80%82%E9%99%A4%E4%BA%86%E5%88%87%E6%8D%A2%E5%88%B0%20NginX%20%E4%B9%8B%E5%A4%96%E8%BF%98%E6%9C%89%E5%85%B6%E4%BB%96%E6%83%B3%E6%B3%95%E5%90%97%EF%BC%9F.png)
在某些情况下,CMS 会使我的服务器瘫痪(CPU 剩余 0%,而服务器负载通常不会超过 20%,这主要是由于 mysqld、mysql 中存在大量等待和 tml、mysql 的慢速日志因 tmp 分配而爆炸式增长等)。这是此 CMS 的一个著名案例,基于以下事件的组合:
- 数百名访问者同时浏览该网站
- 包含数十万个项目的数据库
- php 包装器:SuPHP (fcgid)
这个 CMS(称为 Piwigo)的论坛知道这个问题,但给出的唯一答案是“切换到带有 Php-fpm 的 NginX”。让我们将图像和访问者的数量乘以 100,如果它是 NginX 而不是 Apache+SuPHP,则仍然不存在该问题。
问题是,我无法轻而易举地将整个服务器切换到 NginX,这不仅仅关乎我自己的网站,而且——毫不羞愧地承认——我还没有掌握 NginX 的能力。我必须保持生产网站在线、正常运行,所以我的服务器必须继续使用 Apache。
考虑到这一点,请问您有办法解决这个问题吗?通过某种“作弊”方法,让 suPHP 在这种特殊情况下再次运行?如果代价是吞噬 10+ GB 的 RAM,嘿,当然可以,为什么不呢,我的服务器只使用了 32 GB RAM 的三分之一,即使将剩余的 RAM 用于缓存,磁盘使用率也很低。如果代价是 CPU 费用翻倍,哈哈,再说一次,当然可以,那没问题。
如果你有任何建议,我愿意洗耳恭听,真的!
我的服务器的详细信息:Debian Wheezy、Apache2、PHP 版本 5.4.4-14+deb7u14、以 SuPHP(fcgid)形式运行的 Php、Mysql 5.5.38,以及老实说,功能极其强大的专用服务器、AMD Opteron 4334、32 GB 快速 RAM、两个 SSD Raid-1 磁盘(用于 /)和两个 Raid-1 Sata 磁盘(用于 /home)。面板:webmin + virtualmin。面板允许将虚拟域(= 1 个网站,有自己的用户)切换到 Php-CGI 或 Mod-PHP。Mysql 配置无可挑剔(无数的 mysql-tuner、tuning-primer),已经逐步配置为允许占用大量 RAM 和缓存,仿佛没有明天一样。
如果您对不需要 NginX 的解决方案有任何建议,我将不胜感激!:)
答案1
使用 Google 搜索 piwigo crashes,您会得到以下几个结果: http://piwigo.org/forum/viewtopic.php?id=24748 http://piwigo.org/forum/viewtopic.php?id=22348
所以很遗憾,您并不是唯一一个遇到 piwigo 性能问题的人。看起来 piwigo 确实有一些很棒的功能,但性能/稳定性可能不是其中之一,至少现在还不是?我正在考虑测试 zen photo、coppermine 和其他程序,因为 piwigo 似乎没有针对大照片或大量用户查看或上传照片进行优化。也许开发人员知道这个问题,也许这就是为什么没有允许用户上传图像的功能,除非通过一些称为社区插件的辅助“插件”。但是如果没有这个插件,只有管理员可以上传照片。显然,许多网站都希望用户能够上传图像,所以他们不将这个功能“内置”到 piwigo 的核心中是很奇怪的,除非他们知道性能问题,并且它无法处理这种使用。
因此,我对您的问题的回答是,遗憾的是,piwigo 对于您要用到的东西来说并不是一个好的选择,它似乎还没有为拥有大量用户/浏览量或大量图片上传的网站做好准备,而且由于大多数画廊都使用 GD 或 image magick,所以除非以某种方式以不同的方式实施以避免服务器过载,否则它们可能都会遇到同样的问题。
如果有人找到了具有类似功能但性能更好的 piwigo 替代品,我很想知道,我计划在有时间的时候针对该目标做一些研究/测试。