我们能够find正在运行Magento的NGINX服务器崩溃的问题,直到以下几点:
背景信息:Magento后端有一个所见即所得的编辑器CMSfunction。 这个编辑器通过magento(cms / directive)中的控制器加载一些图片。
当我们将NGINX error_log级别设置为info时,我们得到以下行(为了更好的可读性插入换行符):
2012/10/22 18:05:40 [info] 14105#0: *1 client closed prematurely connection, so upstream connection is closed too while sending request to upstream, client: XXXXXXXXX, server: test.local, request: "GET index.php/admin/cms_wysiwyg/directive/___directive/BASEENCODEDIMAGEURL,,/ HTTP/1.1", upstream: "fastcgi://127.0.0.1:9024", host: "test.local"
在debugging器中检查代码时,以下调用永远不会返回(在'Varien_Image_Adapter_Abstract :: getMimeType()`
# $this->_fileName is http://test.local/skin/adminhtml/base/default/images/demo-image-not-existing.gif` # $_SERVER['REQUEST_URI'] = http://test.local/admin/cms_wysiwyg/directive/___directive/BASEENCODEDIMAGEURL list($this->_imageSrcWidth, $this->_imageSrcHeight, $this->_fileType, ) = getimagesize($this->_fileName);
文件名请求是
示例url:
http://test.local/skin/adminhtml/base/default/images/demo-image-not-existing.gif
当执行上述行时,任何对NGNIX服务器的后续请求都不再响应。 等待大约10分钟后,NGINX服务器再次开始应答请求。
我试图用一个简单的testing脚本重现错误,只用给定的URL调用getimagesize() ,但这不会崩溃。 这很简单,导致一个例外,说URL不能被加载(这是正确的,因为URL是错误的)
目前的理论:
NGINX / PHP FCGI只能处理一些有限的进程。 CMS WYSIWYG编辑器在NGINX尝试完成的cms_wysiwyg/directive操作上触发5个并行请求。 假设NGINX只能处理5个并行请求:现在,NGINX在这些正在运行的请求中发出一个额外的请求给自己,这当然不能满足,因为槽已满。 插槽也不能释放,因为履行一个请求取决于一个额外的请求。
可能的解决scheme:
我在这里几乎有同样的问题。 查看包含上传图像的CMS块后,整个php / php-fpm设置变得无响应。
问题原来是对getimagesize的调用(在我的情况下,在lib / Varien / Image / Adapter / Gd2.php的第72行)。 即使有问题的图像文件位于网站本身,getimagesize的参数是一个HTTP URL。 由于一个奇怪的防火墙configuration,服务器无法通过HTTP联系自己,所以请求挂起,原因不明,php-fpm一起停止服务请求。
最后nginx失去耐心logging了超时错误。
在允许服务器向自己发送HTTP请求之后,超时错误消失了。
我仍然不明白为什么Magento会通过HTTP访问本地文件,但它可能是在wysiwyg编辑器中支持外部图像的最简单的方法。
(Magento 1.8.1.0)