Nginx网关

1. Nginx安装目录(对于源码安装):

  • 当使用源代码编译安装 Nginx 时,整个 Nginx 的安装树可能位于此目录下。这包括可执行文件、配置文件、文档和模块文件等。
  • 内部可能包含以下子目录:
    • client_body_temp: 用于存储上传的大文件的临时目录。
    • conf: 包含所有的配置文件,如 nginx.conf,以及其他的配置片段或模块配置。
    • html: 这是 Nginx 的默认网站根目录,通常包含默认的 HTML 页面。
    • logs: 类似于 /var/log/nginx,用于存储日志文件。
    • mime.types: 包含 MIME 类型的定义,用于识别和处理不同的文件类型。
    • modules: 可能包含 Nginx 的模块文件,用于扩展 Nginx 的功能。
    • sbin: 包含 Nginx 的二进制可执行文件。

2. Nginx多线程请求模型和基本请求流程

image-20240610171535163

Nginx 的设计并不基于传统的多线程模型来处理请求,而是采用了异步非阻塞的事件驱动模型。Nginx 使用了多进程(多worker进程)模型来提高并发性能和稳定性,每个worker进程内处理请求时则利用了高效的事件处理机制。

2.1 Nginx 的多进程模型

Nginx 的工作模型包括一个master进程和多个worker进程。master进程主要负责读取和验证配置文件,生成worker进程,并监听和响应来自worker进程和外部的信号,如重启、停止等操作。worker进程则负责处理所有来自客户端的网络请求。

2.2 Nginx 的事件驱动模型

每个worker进程都有自己的事件循环,可以同时处理多个连接。Nginx 使用了高效的事件处理模块,比如epoll(Linux)、kqueue(BSD系统)等,这些模块允许Nginx在一个进程内处理成千上万的并发连接,而无需为每一个连接创建一个新的线程。

2.3 Nginx 的基本请求处理流程

当一个HTTP请求到达Nginx时,它遵循以下基本流程:

  1. 接受连接:Nginx监听在配置的端口上,当请求到达时,master进程通过套接字接受连接,然后将连接分配给一个空闲的worker进程。

  2. 读取请求:worker进程读取客户端的HTTP请求,包括请求行、请求头和可能的请求体。

  3. 解析请求:解析请求的URL、HTTP方法、协议版本等信息。

  4. 处理请求:根据配置文件中的规则和指令,Nginx决定如何处理请求,这可能包括:

    • 路由到正确的站点或服务器块。
    • 提供静态文件服务。
    • 执行重定向。
    • 执行反向代理,将请求转发到后端服务器。
    • 执行负载均衡,选择后端服务器池中的一个服务器。
    • 执行缓存策略,检查是否有缓存的数据可以提供。
  5. 生成响应:一旦请求被处理,Nginx会生成响应,这可能包括从文件系统读取数据、从后端服务器获取数据或从缓存中获取数据。

  6. 发送响应:将响应发送回客户端,包括HTTP状态行、响应头和响应体。

  7. 记录日志:Nginx会记录请求和响应的信息到日志文件,通常包括访问日志和错误日志。

  8. 关闭连接:根据HTTP协议版本和配置,Nginx可能会保持连接打开一段时间(持久连接)或立即关闭连接。

这种模型允许Nginx高效地处理大量的并发连接,同时也保持了较低的内存消耗和CPU占用率。由于每个worker进程独立处理请求,即使一个请求处理失败,也不会影响其他worker进程的正常工作。

3. Nginx配置文件nginx.conf详解

Nginx的配置文件nginx.conf是其核心配置所在,用于定义Nginx的行为和服务设置。以下是您提到的一些关键配置项的详细解释:

3.1 worker_connections属性

worker_connectionsevents块中的一个配置项,用来指定每个worker进程能够同时打开的最大连接数。这是Nginx并发能力的关键设置。例如:

Nginx

1
2
3
1events {
2 worker_connections 1024;
3}

默认情况下,这个值通常是系统限制的最大文件描述符数量。增加这个值可以提高Nginx处理并发连接的能力,但也要考虑到系统的实际硬件资源,如内存。

3.2 http属性

http块包含了全局的HTTP设置和虚拟服务器定义。在这个块中,你可以定义各种与HTTP相关的设置,比如MIME类型、日志格式、gzip压缩、缓存、SSL证书等。例如:

Nginx

1
2
3
4
5
6
7
8
9
10
1http {
2 include mime.types;
3 default_type application/octet-stream;
4
5 sendfile on;
6 tcp_nopush on;
7 tcp_nodelay on;
8
9 keepalive_timeout 65;
10}

3.3 sendfile属性

sendfile是一个与文件传输相关的指令,控制Nginx是否使用高效的操作系统级别的文件传输方式。默认情况下,它是开启的(on)。使用sendfile可以避免用户空间和内核空间之间的数据复制,从而提高文件传输效率。例如:

Nginx

1
1 sendfile on;

3.4keepalive_timeout属性

keepalive_timeout用于设置HTTP持久连接(keep-alive)的超时时间。这是客户端和服务器之间保持连接打开的时间长度,直到超时或被关闭。例如:

Nginx

1
1 keepalive_timeout 65;

这个设置对于减少网络延迟和提高性能非常重要,因为它允许客户端和服务器在多个请求间重用同一个TCP连接,而不需要每次请求都重新建立和关闭连接。

3.5 server属性

server块用于定义一个虚拟服务器,可以绑定到特定的IP地址和端口,或者监听所有的可用接口。每个server块都可以有自己独立的设置,包括监听的端口、主机名、请求处理逻辑等。例如:

Nginx

1
2
3
4
5
6
7
8
1server {
//监听端口号
2 listen 80;
//主机名称
3 server_name localhost;
4
5 # 配置请求路由、错误页面、日志等
6}

每个server块都可以包含多个location块,用于更细粒度的请求路由和处理。通过不同的server块,Nginx可以同时为多个不同的域名或服务提供服务。

正确配置这些选项对于优化Nginx的性能、安全性和功能性至关重要。

3.5.1 Server Block

server 是 Nginx 中用于定义一个虚拟服务器的配置块,可以理解为一个独立的“网站”配置。每个 server 块可以绑定到一个或多个 IP 地址和端口,也可以监听特定的域名。server 块内的设置定义了该虚拟服务器的行为,包括但不限于:

  • listen: 指定要监听的端口和地址,例如 listen 80; 表示监听 80 端口。
  • server_name: 设置虚拟服务器的域名,例如 server_name example.com;

3.5.2 Location Block

location 块是 server 块内的子配置块,用于更精细地控制请求的处理方式。它基于 URL 的路径模式来匹配请求,并应用相应的配置。例如:

  • 精确匹配: location = /index.html { ... }
  • 前缀匹配: location /images/ { ... }
  • 正则表达式匹配: location ~* \.(jpg|jpeg|gif|png)$ { ... }

location 块内的配置可以包括静态文件服务、反向代理设置、重写规则、错误页定制、访问控制等。

3.5.3 Error_page Directive

error_page 指令用于定义特定错误代码的自定义错误页面。它可以将一组错误代码映射到一个特定的 URI,当发生这些错误时,Nginx 将重定向到该 URI。例如:

Nginx

1
1error_page 404 /404.html;

这表示当 Nginx 遇到 404 错误时,会显示 /404.html 文件作为错误页面。error_page 可以在 httpserverlocation 块中定义。

4. Nginx 反向代理和负载均衡

4.1 Nginx 反向代理

Nginx作为反向代理服务器时,其主要工作原理是位于网络服务器群前端,接受来自客户端(如浏览器)的请求,但客户端并不直接知道实际提供服务的服务器位置。Nginx根据预设的规则将请求转发至后端服务器之一,并将该服务器的响应再转发回客户端。这一过程对客户端是透明的,即客户端只知道Nginx的地址,而不知道实际提供服务的服务器地址。

优点

  • 安全:隐藏后端服务器的真实IP,增强安全防护。
  • 性能优化:可以通过缓存、压缩等技术减少后端服务器的负担。
  • 负载均衡:通过分配请求到不同的后端服务器,实现资源的有效利用,提高系统整体性能。

4.2 负载均衡

负载均衡是指将大量并发访问或数据流量合理地分配到多台服务器上,以达到最优资源利用,最大化处理能力,最小化响应时间,同时避免任何单一服务器过载。Nginx作为一个优秀的负载均衡器,它提供了多种算法来决定如何将请求分发到后端服务器,包括但不限于轮询(Round Robin)、最少连接数(Least Connections)、IP哈希(IP Hash)等。

轮询:按照顺序将请求分发给后端服务器。 最少连接数:将新请求分发给当前连接数最少的服务器。 IP哈希:根据客户端的IP地址进行哈希运算,将同一客户端的请求尽量分发到同一服务器上,以保持会话的一致性。

4.3 正向代理

正向代理与反向代理的工作方式相反。正向代理位于客户端一侧,它的主要作用是代表客户端去获取互联网上的资源,而不是像反向代理那样代表服务器接收请求。当客户端配置了正向代理后,所有对外的请求都会先经过这个代理,由代理服务器代替客户端去访问目标服务器,获取资源后再返回给客户端。

用途

  • 匿名访问:通过代理服务器隐藏客户端的真实IP,保护隐私。
  • 内容过滤:企业或学校网络中常见的场景,用于过滤不适宜的网站或内容。
  • 缓存加速:对于重复的请求,代理服务器可以缓存资源,提高访问速度。

正向代理和反向代理虽然在工作方向上有本质的区别,但在实际应用中,它们都可以起到优化网络性能、提高安全性和控制网络流量的作用。Nginx本身既可以配置为反向代理,也可以配置为正向代理,不过在实践中更多被用作反向代理和负载均衡器。