什么是 Web 服务器?
每当我们打开浏览器,输入一个 URL 并点击回车时,实际上我们都在请求该 URL 所指代的内容。你有没有想过这些内容存放在哪里?是的,没错,它们存放在远程计算机上,这些计算机接受我们的请求,并将 URL 的内容作为响应发送回来。
Web 服务器就是负责交付(提供)我们所请求的网页的计算机。每一个 Web 服务器都有一个 IP 地址和域名。
让我们通过一个例子来理解 Web 服务器。
当我们打开喜欢的浏览器,输入 www.example-site.org/c-plus-plus 并点击回车以查看 C++ 相关的资源时。在这个 URL 中,www.example-site.org 是域名,而 /c-plus-plus 是我们想要查看的页面路径。
因此,www.example-site.org 会将我们的请求路由到 Web 服务器,服务器随后会查看我们所请求的文件系统。在我们的例子中,就是 /c-plus-plus。
!image(图示:Web 服务器工作原理)
什么是 Nginx?
Nginx 是一款开源软件,旨在提供最大的性能和稳定性。让我们来看看为什么我们需要它,以及我们能从中获得什么好处。
为什么我们需要专用的 Web 服务器?
假设我们使用 Django 或 Node.js 开发了应用程序。所有这些框架都拥有内置的开发服务器来托管项目。但是,如果有人尝试在生产环境中使用这些内置的开发服务器来托管应用程序,在处理请求时将会非常吃力,甚至在仅仅处理 30-40 个并发请求时就会经历停机。
Nginx 是一款专用的 Web 服务器,它解决了效率问题,为我们提供了一种最佳方式来并发处理数千个请求。
#### 用于反向代理、缓存和负载均衡的 Web 服务器
反向代理:接受来自客户端的请求,将其转发给能够处理该请求的服务器,然后将服务器的响应返回给客户端。
缓存:这是一种存储给定资源副本的技术,当再次请求该资源时直接提供副本。当 Web 缓存中存储了请求的资源时,它会拦截请求并返回其副本,而不是从源服务器重新下载。
负载均衡器:将传入的客户端请求分发到一组服务器中,这样可以在不给特定服务器造成负载的情况下处理并发请求。
Nginx 的其他特性如下:
- 它提供 HTTP 服务器能力。
- 旨在提供稳定性和最大性能。
- 充当电子邮件(IMAP、POP3 和 SMTP)的代理服务器。
- 它采用事件驱动和非线程化架构,从而减少每个请求所消耗的 CPU 计算量。
- 它提供可扩展性。
- 减少客户端的等待时间。
- 可以在 Nginx 托管网站时进行升级,而无需任何停机时间。
我希望现在你已经相信,为什么我们应该在生产应用程序中使用专用的 Web 服务器了。
#### Nginx 的架构
为了理解后续的 Nginx 配置设置,我们需要先了解一下 Nginx 的架构原理。
Nginx 采用主从架构。在这个架构中,有一个主进程负责将我们的请求重新路由到其下属的任意一个工作进程,通过在服务器上分发负载来提高效率;接着系统会查找代理缓存以获得更快的响应,如果未找到缓存,网页则会直接从内存中加载。一张示意图将有助于更清晰地理解这种结构。
!image(图示:Nginx 架构)
Nginx 的一些配置设置
Nginx 所需的主要设置存储在一个名为 nginx.conf 的文件中。该文件主要分为多个上下文。
workerprocesses:工作进程基本上是指主进程将控制的工作进程数量。更准确地说,这是一个单线程进程。因此,如果你有一个多核处理器(例如 8 核),你可以设置 8 个 workerprocesses,以充分利用磁盘带宽并帮助其执行 CPU 密集型工作。
workerconnections:这是与不同客户端的同时连接数。默认值为 512 或 1024。因此,假设你有 8 个 workerprocesses 和 512 个 workerconnections,你可以服务的最大客户端数量为 workerprocesses worker_connections,即 8512 = 4096 个连接。
accesslog & errorlog:默认情况下,Nginx 服务器将其事件记录在上述两种类型的日志中。所有从服务器请求数据的访问者活动都会记录在 accesslog(访问日志)中,你可以找到访问了哪些文件、Nginx 如何响应、客户端的 IP 等信息。但是,如果 Nginx 遇到任何问题和故障,它将把所有这些信息记录在 errorlog(错误日志)中,以便进行进一步的调试。
gzip:如果你想榨取尽可能多的性能,它可以压缩所有响应数据。但这会消耗大量的 CPU 资源,如果在特定环境下使用不当,可能会导致 Nginx 变慢。