谁能解释一下为什么安装 nginx 和反向代理 Apache 比普通 Apache 更快?
我已经将所有静态文件移动到 s3(我听说 nginx 更擅长处理静态文件),那么它还有什么其他好处?
答案1
Apache 有两种处理客户端连接的模型:worker 和 prefork。Prefork 占用大量资源(每个客户端连接都需要一个完整的进程),但仍常用于 PHP。从资源角度来看,Worker 要好得多,但每个客户端连接仍需要专用线程。
Nginx 仅使用少量线程(通常每个 CPU 只有一个线程)来处理所有客户端连接。这使它比 Apache 更轻量,并允许它扩展并在单台机器上处理数万个连接。
但是,这并不意味着它在所有情况下都比 Apache “更好”。它通常比 Apache 更适合提供静态文件,但不适合从 Web 应用程序生成的动态内容(即,当其中一个请求执行数据库查询时,您不希望数百个连接被阻止)。这就是为什么您仍然需要 fastcgi、uWSGI、passenger 甚至 apache+mod_wsgi+passenger 来将 Web 应用程序工作卸载到应用服务器中。这些后端进程仍然将每个请求使用一个线程,但至少它只适用于需要动态内容的请求。
因此,nginx + apache 比直接使用 apache 更快的主要原因是 (A) 静态文件处理效率更高,(B) 减少了 (繁重的) apache 资源的负载。
最后,关于您问题中的“其他好处”部分:nginx 处理 SSL 连接的速度也比 Apache 快,尽管这并不意味着它在所有情况下都表现更好。例如,如果您需要使用客户端证书进行详细身份验证,您仍然需要 Apache 来处理 SSL。如果您只是通过 HTTPS 运行页面进行加密,那么 nginx 会为您带来一点速度提升。
答案2
简单地说,Apache 非常适合动态内容处理,但您必须等待它的响应。
反向代理(将 Nginx 放在用户和 Apache 之间)可以节省您的时间,因为 apache 响应 127.0.0.1,它与您访问本地主机位于同一台机器上。
因此 Apache 客户端将始终是 Nginx,而来自 apache 的响应是静态内容,这将使您充分利用 Nginx,因为它在提供此内容方面比 apache 更快。
您可以查看此图表