我一直在阅读这个链接:http://blog.martinfjordvald.com/2010/08/file-uploading-with-php-and-nginx/(该博客的帖子多次链接到官方 Nginx 网站)其中写道:
每次 Apache 接受上传时,其中一个进程就会在上传期间处于忙碌状态。
现在我承认我是 Nginx 的新手,但是它是否也存在这样的问题:在整个上传过程中它将使用自己的一个工作进程,好吧,公平地说,它不是一个带有 RAM/CPU 问题的 PHP 实例,但它仍然受到限制(即 x 个连接),对吗?
我不确定这里使用 Nginx 的优势是否已经解释清楚。
Nginx 文档本身目前并没有明确说明它如何处理请求,所以如果我对 Nginx 的工作方式有严重误解,我希望有人能修复它而不是投反对票。
答案1
好的,来自@MichealHampton 的链接(http://www.aosabook.org/en/nginx.html#fig.nginx.arch)我基本上要总结一下。
首先要注意的是,Apache 2.4 还引入了(如链接所述)一些有趣的变化,即事件 MPM:http://httpd.apache.org/docs/trunk/mod/event.html它更像是一个非阻塞版本:http://httpd.apache.org/docs/trunk/mod/worker.html通过将工作转移给其他线程,使主线程可以自由地继续其工作,旨在尽可能减少 IO 使用时的摩擦。
当然,这并不能解决 Apache 的根本问题,即它的内存和 CPU 使用率(毕竟它是一组通用工具),但这是朝着正确方向迈出的一步,意味着 Apache 不再需要阻塞,而是可以更加异步。
这立即意味着,即使 Apache 2.4s 有所变化,Nginx 当然可以处理比 Apache 多得多的任务,因为它使用的资源更少。
Nginx 在上传方面的主要特点是,尽管是单线程,但其工作进程能够不局限于单个任务。使用事件通知和紧密循环来处理异步 IO,即使在单个工作进程上,单个工作进程也可以一次性处理多个(可能 1,000 个)上传任务。
这仍然与 Apache 的非事件模型形成对比,尽管 Apache 正在慢慢走上与 Nginx 相同的道路,但它仍然没有完全实现,但是,我应该重申,Apache 在支持线程上持续运行“事件”同时保持主线程空闲的能力很酷。唯一的问题是,这仍然会产生阻塞效果,Apache 会说:“此连接正在运行,我不会放弃它的阻塞,直到它完成”,因此它的名称并不是真正的“event-mpm”,因为 Apache 仍然会受到以下几行附近链接中列出的场景的影响:
生成或检索此页面可能仅需几分之一秒,但将其传输到带宽为 80 kbps(10 KB/s)的客户端却需要 10 秒钟。
Apache 上传时遇到的问题实际上取决于您上传的内容。由于我的上传内容很大,可能达到 GB 级,因此 Apache 可能会出现问题,但如果您只上传图片,不上传其他内容,那么 Apache 中的更改很有可能会起作用。
总结得差不多了。