Nginx 是一款高性能的 HTTP 和反向代理服务器,它以其高并发、高性能、低内存占用而闻名,在平时的工作中,我们也经常用到它,以下,就来总结一下 Nginx
相关的知识。
Nginx 的主要用途
Nginx 在后端架构中扮演着多种关键角色:
静态资源服务: 直接提供图片、CSS、JavaScript、HTML 文件等静态资源,性能极高。
反向代理 (Reverse Proxy): 这是 Nginx 最常用的功能之一,它接收客户端请求,然后将请求转发给后端的应用服务器(如 Tomcat、Node.js、Python Django/Flask 等),并将应用服务器的响应返回给客户端。优点: 隐藏后端服务器 IP、负载均衡、高安全性、统一入口。
负载均衡 (Load Balancing): 将客户端请求分发到多个后端服务器,实现流量的均匀分配,提高系统的可用性和扩展性。
API 网关: 作为所有微服务的统一入口,处理认证、授权、限流、熔断等。
Web 服务器: 部署简单的 Web 应用。
HTTPS/SSL 终结: 负责处理 SSL/TLS 加密解密,将加密流量转换为明文转发给后端,减轻后端服务器的压力。
动静分离: Nginx 处理静态资源,后端应用服务器处理动态请求,提高整体性能。
URL 重写与转发: 根据规则修改或重定向 URL。
Nginx 的架构
Nginx 的核心是其主从进程模型:
Master Process (主进程):
- 负责读取和验证配置文件。
- 管理 Worker 进程的生命周期(启动、停止、重启)。
- 处理端口绑定。
- 在配置更改时,实现平滑升级。
Worker Processes (工作进程):
- 所有实际的网络请求处理都在 Worker 进程中完成。
- 每个 Worker 进程都是单线程的。
- 采用事件驱动模型(如 epoll、kqueue),能够在一个线程内高效处理大量并发连接。当一个请求到达时,Worker 进程不会为它创建一个新线程,而是将请求注册到事件循环中,然后继续处理其他请求。当数据准备好时,事件循环会通知 Worker 进程处理该请求。
- Worker 进程之间通过共享内存通信(例如共享一些配置信息、缓存数据)。
Nginx 常用配置
Nginx 的配置非常灵活,主要通过 nginx.conf
文件进行管理。
核心配置
1 | # 全局块:配置影响 Nginx 服务器整体运行的参数 |
常用指令解释
user
: 指定 worker 进程运行的用户和组。worker_processes
: 启动多少个 worker 进程。通常设置为auto
或 CPU 核心数。error_log
: 错误日志路径和级别。pid
: Nginx master 进程的 PID 文件。events
: 配置 Nginx 的工作模式和最大连接数。worker_connections
: 单个 worker 进程允许的最大并发连接数。use
: 指定使用的事件模型,如epoll
(Linux)、kqueue
(FreeBSD/macOS)。
http
: HTTP 服务器的配置块。include mime.types
: 引入文件类型映射。default_type
: 默认的文件类型。log_format
: 定义访问日志的格式。access_log
: 访问日志路径和格式。sendfile on
: 启用零拷贝技术,提高静态文件传输效率。keepalive_timeout
: 客户端连接的保持活动时间。gzip on
: 启用 Gzip 压缩,减少传输数据量。
server
: 定义一个虚拟主机。listen
: 监听的端口。server_name
: 绑定的域名。
location
: 基于请求 URI 匹配的规则块。root
: 定义文件系统的根目录。index
: 定义默认索引文件。proxy_pass
: 将请求转发到后端服务器。proxy_set_header
: 设置转发请求头,非常重要,用于将客户端真实 IP 等信息传递给后端。
upstream
: 定义一组后端服务器,用于负载均衡。server
: 定义后端服务器的地址和端口。- 负载均衡算法:
weight
(权重轮询,默认)、ip_hash
(基于客户端 IP 哈希)、least_conn
(最少连接)。
常用的命令
1 | sudo systemctl start nginx # 启动 Nginx |