目录
一、Nginx服务基础
1、Nginx概述
1.1、Nginx简介
RamBler:http://www.rambler.ru/
nginx: http://nginx.org/
Mainline version 主线版本
Stable version
稳定版本
Legacy versions 老版本,遗产版本
旧版本下载:http://mirrors.sohu.com/nginx/
Nginx 中文参考地址: http://www.nginx.cn/doc/
1.2、Nginx的功能
静态资源的 Web 服务器
-
功能:NGINX 可以作为静态资源服务器,直接处理并提供 HTML、图片、JavaScript、CSS、文本文件等静态内容的请求。
-
应用场景:适用于部署网站的静态内容,减少后端服务器的负载,提升页面加载速度。
HTTP/HTTPS 协议的反向代理
-
功能:NGINX 支持 HTTP 和 HTTPS 协议的反向代理,可以将客户端的请求根据 URL、域名等规则转发到后端服务器。
-
应用场景:常用于 Web 应用的负载均衡和请求转发,实现高并发、高可用性的网站架构。
动态资源请求的反向代理
-
功能:NGINX 可以通过 FastCGI、uWSGI、SCGI 等协议,将动态资源请求(如 PHP、Python、Ruby 等)转发到后端应用服务器处理。
-
应用场景:适用于需要处理动态内容的 Web 应用,与 Apache、Django、Flask 等服务器协作,分担负载。
TCP/UDP 协议的请求转发(四层代理)
-
功能:NGINX 支持 TCP 和 UDP 协议的请求转发,作为四层代理服务器,将流量转发到指定的后端服务器。
-
应用场景:适用于非 HTTP/HTTPS 的服务,如数据库、邮件服务等网络应用的负载均衡和高可用性配置。
1.3、Nginx的基础特性
模块化设计与较好的扩展性:NGINX 采用模块化设计,核心功能可以通过加载不同的模块进行扩展。这种设计使得 NGINX 能够灵活适应各种需求,提供如 gzip 压缩、SSL 加密、URL 重写、访问控制等功能,提升服务器的灵活性和适应性。
高可靠性:NGINX 以其高可靠性著称,能够在高并发和高负载的环境下保持稳定运行。它支持多种故障恢复机制,如自动故障切换和健康检查,确保服务的连续性和可用性。
支持热部署:NGINX 支持热部署,可以在不中断服务的情况下重新加载配置文件、升级版本、或更换日志文件。这种功能使得管理员能够在不影响现有连接的情况下进行配置更新和系统维护,避免服务中断。
低内存消耗:NGINX 在处理大量并发连接时表现出色,内存消耗极低。在 keep-alive
模式下,处理 10,000 个非活动连接仅需约 2.5MB 的内存资源,充分展示了其在资源使用上的高效性。
事件驱动架构与高性能 I/O:NGINX 采用事件驱动架构,结合异步 I/O(AIO)、内存映射(mmap)、以及 sendfile
系统调用,能够高效地处理大量并发连接。这些技术使得 NGINX 在处理静态和动态内容时都能保持高性能,适用于高流量的网站和应用。
这些基础特性使得 NGINX 成为一个强大而灵活的服务器,广泛应用于各种 Web 应用和网络服务的部署中。
1.4、Nginx 应用场景
- 静态服务器:NGINX 能够高效处理静态内容的请求,包括图片、视频、文本文件等。作为静态服务器,NGINX 可以直接提供 HTML、CSS、JavaScript 等文件,并通过
sendfile
等技术优化文件传输,适用于高流量的网站和内容分发网络(CDN)。 - 动态服务:通过与 FastCGI、uWSGI、SCGI 等协议集成,NGINX 可以作为动态内容的反向代理,将请求转发给后端应用服务器(如 PHP、Python、Ruby 等)。这种设置允许 NGINX 处理动态服务的请求,同时分担后端服务器的负载,提高整体性能。
- 反向代理与负载均衡:NGINX 常用作反向代理服务器,负责将客户端请求转发到多个后端服务器。通过支持多种负载均衡策略(如轮询、最少连接、IP 哈希等),NGINX 能够有效分配流量,提升系统的高可用性和可扩展性。此外,NGINX 还可以处理 SSL 终端、HTTP/2 和 WebSocket 请求,进一步增强其作为反向代理的能力。
- 缓存服务:NGINX 可以配置为缓存服务器,将来自后端服务器的响应内容缓存下来,用于加速后续的相同请求。这种缓存机制能够显著减少后端服务器的负载,提升页面加载速度,并优化用户体验。NGINX 的缓存策略灵活,可以根据需求进行精细化的缓存控制。
2、Nginx的架构
解释:
(1)首先,每个 worker 进程都是从 master 进程 fork 过来,在 master 进程里面,先建立好需要 listen 的 **socket(listenfd)**之后,然后再 fork 出多个 worker 进程。
(2)所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有 worker 进程会在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,然后在读事件里调用 accept 接受该连接。(解决惊群)
(3)当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求。产生数据 后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。
3、Nginx 进程结构
- 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直 到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务 器资源耗尽而无法提供请求。
- 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客 户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器 对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可 以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作 了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
工作进程(Worker Process)的功能整理如下
①、Worker 进程的平等性:
- 所有 Worker 进程都是平等的,独立处理请求。
②、处理网络请求:
- Worker 进程负责实际处理客户端的网络请求。
③、Worker 进程数量配置:
- Worker 进程的数量通常设置为 CPU 核心数,以充分利用 CPU 资源,避免因进程过多导致的 CPU 资源竞争和上下文切换损耗。
④、请求处理流程:
- 接受客户请求并依次将其送入各个功能模块进行处理。
- 进行 I/O 调用,获取响应数据。
- 与后端服务器通信,接收并处理后端服务器的响应结果。
- 访问缓存