Nginx

Nginx 简介

Nginx 是一个高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3 邮件代理服务器。它以高并发、低资源占用和模块化设计著称,广泛应用于 Web 服务和运维领域。

Nginx 的优势

  1. 高性能: Nginx 能够高效处理数以万计的并发连接,适用于高流量场景。
  2. 低资源消耗: Nginx 的事件驱动架构使其在内存和 CPU 使用方面非常高效。
  3. 模块化设计: Nginx 支持多种扩展模块,例如 Lua 和 WebSocket,便于功能扩展。
  4. 灵活性: 提供强大的配置选项,支持反向代理、负载均衡、缓存等多种功能。
  5. 稳定性: 在长时间运行和高负载场景下表现出色。

为什么选择 Nginx

  • 应对高并发需求: 适合构建需要高并发处理能力的 Web 应用。
  • 多功能性: 集成反向代理、负载均衡、缓存、静态资源服务等多种功能。
  • 社区支持: 拥有活跃的开源社区和丰富的文档资源。
  • 跨平台支持: 适用于多种操作系统,包括 Linux 和 Windows。

以下将介绍 Nginx 的主要功能及其配置示例。

Nginx 可配置的属性

Nginx 提供了丰富的配置选项,以下是一些常用的属性分类及其说明:

全局属性

这些属性通常定义在 nginx.confmain 块中,影响整个 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应用程序 | |
  | +-------------+ |        | +-------------+ |
  +-----------------+        +-----------------+

这张图展示了以下过程:

  1. 客户端发送请求到Nginx反向代理服务器
  2. Nginx服务器根据配置文件nginx.conf中的upstream模块定义的后端服务器组
  3. Nginx使用反向代理和负载均衡策略,将请求转发到其中一个后端应用服务器
  4. 后端应用服务器上运行着实际的Web应用程序
  5. Web应用程序处理请求,并将响应返回给Nginx服务器
  6. 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等) |
                           +-------------------+

这个架构图展示了一个大型前后端项目的典型部署结构:

  1. DNS服务器: 将域名解析到负载均衡器的IP地址上
  2. 负载均衡器: 可以使用Nginx, HAProxy等工具,将请求分发到多个Nginx反向代理服务器上
  3. Nginx反向代理服务器: 作为Web服务的入口点,接收请求并反向代理到后端应用服务器
  4. 后端应用服务器: 运行实际的后端应用程序(Java, Node.js等),处理业务逻辑
  5. 数据库服务器: 如MySQL, MongoDB等,为应用程序提供持久化数据存储
  6. 文件存储服务器: 如对象存储(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        # 配置检查脚本

苏ICP备2025153828号