Nginx
Nginx 简介
Nginx 是一个高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3 邮件代理服务器。它以高并发、低资源占用和模块化设计著称,广泛应用于 Web 服务和运维领域。
Nginx 的优势
- 高性能: Nginx 能够高效处理数以万计的并发连接,适用于高流量场景。
- 低资源消耗: Nginx 的事件驱动架构使其在内存和 CPU 使用方面非常高效。
- 模块化设计: Nginx 支持多种扩展模块,例如 Lua 和 WebSocket,便于功能扩展。
- 灵活性: 提供强大的配置选项,支持反向代理、负载均衡、缓存等多种功能。
- 稳定性: 在长时间运行和高负载场景下表现出色。
为什么选择 Nginx
- 应对高并发需求: 适合构建需要高并发处理能力的 Web 应用。
- 多功能性: 集成反向代理、负载均衡、缓存、静态资源服务等多种功能。
- 社区支持: 拥有活跃的开源社区和丰富的文档资源。
- 跨平台支持: 适用于多种操作系统,包括 Linux 和 Windows。
以下将介绍 Nginx 的主要功能及其配置示例。
Nginx 可配置的属性
Nginx 提供了丰富的配置选项,以下是一些常用的属性分类及其说明:
全局属性
这些属性通常定义在 nginx.conf
的 main
块中,影响整个 Nginx 的运行。
- worker_processes: 定义 Nginx 的工作进程数。
- worker_connections: 每个工作进程能处理的最大连接数。
- error_log: 指定错误日志的路径和级别。
- pid: 定义存储 Nginx 主进程 PID 的文件路径。
HTTP 块属性
定义 HTTP 协议相关的全局配置,通常在 http {}
块中。
- server: 定义虚拟主机的配置块。
- include: 引入其他配置文件。
- sendfile: 是否启用零拷贝(zero-copy)文件传输。
- keepalive_timeout: 设置 HTTP 长连接的超时时间。
- gzip: 是否启用 gzip 压缩。
- client_max_body_size: 设置客户端请求的最大 body 大小。
- proxy_cache_path: 配置缓存存储路径及相关参数。
Server 块属性
定义具体的虚拟主机配置,通常在 server {}
块中。
- listen: 指定虚拟主机的监听端口。
- server_name: 定义虚拟主机的域名。
- access_log: 指定访问日志的路径和格式。
- error_page: 自定义错误页面。
Location 块属性
控制特定 URI 的处理方式,通常在 location {}
块中。
- root: 指定资源的根目录。
- index: 定义默认访问的文件名。
- proxy_pass: 指定反向代理的后端服务器。
- rewrite: 配置 URL 重写规则。
- return: 返回特定的 HTTP 状态码或内容。
- try_files: 定义文件查找顺序。
Upstream 块属性
配置后端服务器组,通常在 upstream {}
块中。
- server: 定义后端服务器地址及其参数(如权重、状态)。
- ip_hash: 使用客户端 IP 哈希算法进行负载均衡。
- least_conn: 使用最少连接数的负载均衡算法。
Stream 块属性
用于配置 TCP/UDP 流量的代理,通常在 stream {}
块中。
- server: 定义监听的端口和后端服务器。
- proxy_pass: 指定 TCP/UDP 流量的后端地址。
SSL/TLS 配置属性
用于启用 HTTPS 和安全连接。
- ssl_certificate: 指定 SSL 证书文件路径。
- ssl_certificate_key: 指定 SSL 证书私钥文件路径。
- ssl_protocols: 设置支持的 SSL/TLS 协议版本。
- ssl_ciphers: 配置支持的加密算法。
- ssl_session_cache: 启用 SSL 会话缓存。
日志相关属性
- access_log: 定义访问日志的存储路径和格式。
- error_log: 定义错误日志的存储路径和级别。
- log_format: 自定义日志格式。
其他常用属性
- rewrite: 实现 URL 的重写或重定向。
- add_header: 添加自定义 HTTP 响应头。
- limit_req: 限制请求速率。
- limit_conn: 限制连接数。
1. 反向代理
功能说明: Nginx 可以作为反向代理服务器,将客户端请求转发给后端服务器,隐藏后端服务器细节并实现负载均衡和缓存。
示例配置:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
upstream backend_servers {
server backend1.example.com;
server backend2.example.com;
}
2. 负载均衡
功能说明: Nginx 支持多种负载均衡算法,例如轮询、最少连接数、IP 哈希等。
示例配置:
upstream backend_servers {
# 轮询(默认)
server backend1.example.com;
server backend2.example.com;
# 最少连接数
# server backend1.example.com weight=1;
# server backend2.example.com weight=2;
# IP 哈希
# ip_hash;
}
server {
listen 80;
location / {
proxy_pass http://backend_servers;
}
}
3. HTTP 缓存
功能说明: Nginx 作为 Web 缓存服务器,能缓存静态资源,减少后端服务器压力。
示例配置:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m;
server {
listen 80;
location / {
proxy_cache my_cache;
proxy_pass http://backend_servers;
proxy_cache_valid 200 1h;
add_header X-Cache-Status $upstream_cache_status;
}
}
4. Web 服务器
功能说明: Nginx 可以高效处理静态资源请求。
示例配置:
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
5. SSL/TLS
功能说明: 通过 SSL/TLS 提供加密连接。
示例配置:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
location / {
root /var/www/html;
index index.html;
}
}
6. gzip 压缩
功能说明: 减少响应数据的传输大小。
示例配置:
gzip on;
gzip_types text/plain application/json application/javascript text/css;
gzip_min_length 1024;
server {
listen 80;
location / {
root /var/www/html;
}
}
7. 访问控制
功能说明: 基于条件限制访问。
示例配置:
server {
listen 80;
location / {
allow 192.168.1.0/24;
deny all;
}
}
8. 日志管理
功能说明: 记录访问和错误日志。
示例配置:
server {
listen 80;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
root /var/www/html;
}
}
9. rewrite 重写
功能说明: 实现 URL 重定向和别名。
示例配置:
server {
listen 80;
server_name example.com;
location /old-path {
rewrite ^/old-path(.*)$ /new-path$1 permanent;
}
location /new-path {
root /var/www/html;
}
}
10. upstream
功能说明: 转发请求到后端服务器组,支持灵活策略。
示例配置: 见 负载均衡 部分。
11. location 匹配
功能说明: 对 URL 进行精确和模糊匹配。
示例配置:
server {
listen 80;
location = /exact-match {
root /var/www/html;
}
location /prefix-match {
root /var/www/html;
}
location ~* \.php$ {
root /var/www/php;
}
}
12. 模块化设计
功能说明: Nginx 支持通过模块扩展功能,例如 Lua、WebSocket 等。
示例配置(Lua 模块):
server {
listen 80;
location /lua {
content_by_lua_block {
ngx.say("Hello, Lua!");
}
}
}
一张图来说明Nginx反向代理服务器与后端应用服务器之间的请求转发过程:
+---------------------+
| Nginx反向代理服务器 |
| |
| +-----------------+ |
| | nginx.conf | |
+-----------------+>| upstream {...} | |
| | | server {...} | |
| | +-----------------+ |
| +---------------------+
| |
| | 反向代理
| | 负载均衡
| |
+-----------------+ +-----------------+
| 后端应用服务器 1 | | 后端应用服务器 2 |
| | | |
| +-------------+ | | +-------------+ |
| | Web应用程序 | | | | Web应用程序 | |
| +-------------+ | | +-------------+ |
+-----------------+ +-----------------+
这张图展示了以下过程:
- 客户端发送请求到Nginx反向代理服务器
- Nginx服务器根据配置文件
nginx.conf
中的upstream
模块定义的后端服务器组 - Nginx使用反向代理和负载均衡策略,将请求转发到其中一个后端应用服务器
- 后端应用服务器上运行着实际的Web应用程序
- Web应用程序处理请求,并将响应返回给Nginx服务器
- Nginx服务器将响应发送回客户端
需要注意的是:
- Nginx反向代理服务器只负责接收请求,转发请求,不运行实际的应用程序
- 后端应用服务器运行实际的Web应用程序,但不需要安装或配置Nginx
- Nginx的配置文件
nginx.conf
位于Nginx反向代理服务器上 - 通过反向代理和负载均衡,Nginx可以将请求分发到多个后端服务器,实现高可用和负载分担
这种部署模式常见于生产环境,可以充分利用Nginx作为反向代理服务器的优势,实现高性能、高可用的Web服务。
大型前后端项目的典型部署架构图:
+-----------------------+
| DNS服务器 |
+-----------+-----------+
|
|
+-----------+-----------+
| 负载均衡器(LB) |
| (Nginx, HAProxy等) |
+-----------+-----------+
|
+-------------------+ +-------------------+ +-------------------+
| Nginx反向代理 | | Nginx反向代理 | | Nginx反向代理 |
| 服务器 | | 服务器 | | 服务器 |
+-------------------+ +-------------------+ +-------------------+
| | |
+-------------------+ +-------------------+ +-------------------+
| 后端应用服务器 | | 后端应用服务器 | | 后端应用服务器 |
| (Java, Node.js等) | | (Java, Node.js等) | | (Java, Node.js等) |
+-------------------+ +-------------------+ +-------------------+
| | |
+--------------------------+-------------------------+
|
+-------------------+
| 数据库服务器 |
| (MySQL, Mongo) |
+-------------------+
|
+-------------------+
| 文件存储服务器 |
| (对象存储,NAS等) |
+-------------------+
这个架构图展示了一个大型前后端项目的典型部署结构:
- DNS服务器: 将域名解析到负载均衡器的IP地址上
- 负载均衡器: 可以使用Nginx, HAProxy等工具,将请求分发到多个Nginx反向代理服务器上
- Nginx反向代理服务器: 作为Web服务的入口点,接收请求并反向代理到后端应用服务器
- 后端应用服务器: 运行实际的后端应用程序(Java, Node.js等),处理业务逻辑
- 数据库服务器: 如MySQL, MongoDB等,为应用程序提供持久化数据存储
- 文件存储服务器: 如对象存储(AWS S3等)或NAS,为应用程序提供文件存储服务
这种架构具有以下优势:
- 高可用性: 通过负载均衡器和多个Nginx反向代理,实现服务的高可用
- 伸缩性: 可以根据需求横向扩展Nginx反向代理服务器和后端应用服务器
- 安全性: Nginx反向代理隔离了内部服务,只暴露统一的入口点
- 解耦: 前端和后端服务解耦,Nginx反向代理对前端隐藏了后端细节
该架构适用于大型、高并发的前后端项目,能够满足高性能、高可用的要求。实际部署时,还需根据项目的具体情况进行调整和优化。
nginx-config/
├── conf.d/ # 各个项目的配置文件
│ ├── project1.conf # 项目1的配置
│ ├── project2.conf # 项目2的配置
│ └── default.conf # 默认配置
├── includes/ # 通用配置片段
│ ├── gzip.conf # gzip压缩配置
│ ├── ssl.conf # SSL通用配置
│ └── proxy.conf # 代理相关的通用配置
├── certs/ # SSL证书文件
│ ├── project1/
│ │ ├── cert.pem
│ │ └── key.pem
│ └── project2/
│ ├── cert.pem
│ └── key.pem
├── nginx.conf # 主配置文件
└── scripts/ # 管理脚本
├── deploy.sh # 部署脚本
├── reload.sh # 重载配置脚本
└── check-conf.sh # 配置检查脚本