让我们有一个由 Nginx 提供服务的 Web 应用程序,监听端口80
。
当两个或更多用户尝试访问该应用程序的某个 URL 时,响应需要很长时间。例如,十个用户尝试在几秒钟/give_me_some_charts
内加载页面和服务器响应100
单个用户请求。
每个用户都尝试通过端口访问应用程序80
。我相信服务器(在我们的示例中为 Nginx)将阻止该端口,直到发送响应为止。因此,处理十个用户将需要10 users * 100 seconds == 1000 seconds
。
但是 Nginx 有一个功能,叫做平衡。现在我不确定服务器如何处理并行请求。
那么,服务器如何处理并行请求以及如何响应? Nginx 的平衡功能是什么?
答案1
我不太确定 nginx 是否特别(还没有理由使用它)但几乎所有在端口上提供服务的服务器的功能都类似于以下内容:
- 监听进程打开端口并等待连接
- 一旦建立了新的连接,该连接(套接字)就会被移交给另一个进程或线程
- “主”进程返回等待另一个连接。
服务器不会阻塞所有后续连接,直到当前连接完成。如果阻塞,即使是稍微繁忙的网站也会变得无法使用。上面列出的代码块通常尽可能紧凑(小),以便尽快完成。一些分叉新进程的服务器(如 Apache)还会保留备用的“子”进程,这样fork
当客户端连接时,它们就不必进行缓慢的系统调用。
这允许多个(数十、数百甚至数千)客户端同时连接。如果有 10 个用户连接到您的网站,那么 Web 服务器将有 10 个单独的线程或进程同时为这些客户端提供服务。所有请求是否在 100 秒内完成或需要更长时间主要取决于代码正在做什么。(他们是否在争夺 CPU 时间、阻止文件系统或数据库调用等)
快速的网络搜索表明,nginx 的“平衡”功能可能与它将请求代理到后端服务器的能力(使用它作为负载平衡器)有关,而不是与其同时处理多个客户端的能力有关。