从零手写实现 nginx-21-modules 模块

前言

大家好,我是老马。很高兴遇到你。

我们为 java 开发者实现了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何处理的,可以参考我的另一个项目:

手写从零实现简易版 tomcat minicat

手写 nginx 系列

如果你对 nginx 原理感兴趣,可以阅读:

从零手写实现 nginx-01-为什么不能有 java 版本的 nginx?

从零手写实现 nginx-02-nginx 的核心能力

从零手写实现 nginx-03-nginx 基于 Netty 实现

从零手写实现 nginx-04-基于 netty http 出入参优化处理

从零手写实现 nginx-05-MIME类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)

从零手写实现 nginx-06-文件夹自动索引

从零手写实现 nginx-07-大文件下载

从零手写实现 nginx-08-范围查询

从零手写实现 nginx-09-文件压缩

从零手写实现 nginx-10-sendfile 零拷贝

从零手写实现 nginx-11-file+range 合并

从零手写实现 nginx-12-keep-alive 连接复用

从零手写实现 nginx-13-nginx.conf 配置文件介绍

从零手写实现 nginx-14-nginx.conf 和 hocon 格式有关系吗?

从零手写实现 nginx-15-nginx.conf 如何通过 java 解析处理?

从零手写实现 nginx-16-nginx 支持配置多个 server

从零手写实现 nginx-17-nginx 默认配置优化

从零手写实现 nginx-18-nginx 请求头+响应头操作

从零手写实现 nginx-19-nginx cors

从零手写实现 nginx-20-nginx 占位符 placeholder

从零手写实现 nginx-21-nginx modules 模块信息概览

从零手写实现 nginx-22-nginx modules 分模块加载优化

从零手写实现 nginx-23-nginx cookie 的操作处理

从零手写实现 nginx-24-nginx IF 指令

前言

大家好,我是老马。

这一节我们来系统的看一下 nginx 有哪些模块,为我们后续的设计实现打下基础。

模块概览

Nginx 的配置文件通常由几个不同的模块组成,这些模块定义了服务器的不同方面。以下是一些主要的配置模块:

  1. main(主配置) - 这是配置文件的核心部分,包括了全局设置和默认行为。

  2. events(事件) - 这个模块定义了Nginx如何处理连接和事件。例如,它设置了工作进程的数量和连接的超时时间。

  3. http(HTTP模块) - 这个模块定义了HTTP服务器的配置,包括日志格式、MIME类型、文件扩展名和文件类型映射等。

  4. mail(邮件模块) - 如果Nginx配置为邮件代理,这个模块定义了邮件处理的配置。

  5. stream(流模块) - 这个模块定义了TCP和UDP服务器的配置,用于处理非HTTP协议的流量。

  6. server(服务器) - 这个模块定义了虚拟服务器的配置,包括监听的端口、服务器名称、处理请求的规则等。

  7. location(位置) - 这个模块定义了请求的匹配规则和相应的处理指令,可以嵌套在server模块中。

  8. upstream(上游) - 这个模块定义了后端服务器的列表,用于负载均衡和反向代理。

  9. include(包含) - 这个指令用于包含其他配置文件,使得配置更加模块化和易于管理。

  10. log_format(日志格式) - 定义自定义的日志格式。

  11. ssl(SSL模块) - 如果配置了SSL,这个模块定义了SSL相关的设置,如证书和密钥文件。

  12. if(条件判断) - 这个指令允许在配置文件中进行条件判断,根据条件来启用或禁用某些配置。

这些模块通过不同的指令和参数组合,允许管理员精细地控制Nginx服务器的行为。

配置文件通常以nginx.conf为文件名,并且可以在不同的目录级别上进行分割,以便于管理和维护。

模块

1. Main (全局) 模块

全局模块配置 Nginx 的全局设置,例如工作进程数量、日志路径等。

通常,这些配置位于 Nginx 配置文件的顶部。

worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

指令

Nginx Main(全局)模块配置指令及其示例:

指令名称 说明 示例
worker_processes 指定工作进程数量。 worker_processes auto;
error_log 配置错误日志路径和日志级别。 error_log /var/log/nginx/error.log warn;
pid 指定存储 Nginx 主进程 PID 的文件路径。 pid /run/nginx.pid;
worker_rlimit_nofile 设置工作进程可打开的最大文件描述符数量。 worker_rlimit_nofile 8192;
worker_priority 设置工作进程的优先级。 worker_priority -10;
daemon 是否以守护进程方式运行 Nginx。 daemon on;
master_process 是否启用主进程模式。 master_process on;
user 设置 Nginx 进程的用户和组。 user www-data;
worker_cpu_affinity 绑定工作进程到特定 CPU 核心。 worker_cpu_affinity auto;
worker_shutdown_timeout 设置工作进程关闭时的超时时间。 worker_shutdown_timeout 10s;
timer_resolution 设置事件定时器的分辨率。 timer_resolution 100ms;
include 包含其他配置文件。 include /etc/nginx/conf.d/*.conf;
load_module 动态加载 Nginx 模块。 load_module modules/ngx_http_geoip_module.so;
env 设置环境变量。 env PATH;
env MY_VARIABLE=value;

配置示例

以下是一个包含多个 Main 模块指令的 Nginx 配置示例:

worker_processes auto;                             # 自动配置工作进程数量
error_log /var/log/nginx/error.log warn;           # 错误日志路径和级别
pid /run/nginx.pid;                                # PID 文件路径
worker_rlimit_nofile 8192;                         # 最大文件描述符数量
worker_priority -10;                               # 工作进程优先级
daemon on;                                         # 以守护进程方式运行
master_process on;                                 # 启用主进程模式
user www-data;                                     # 进程用户和组
worker_cpu_affinity auto;                          # 自动绑定工作进程到 CPU 核心
worker_shutdown_timeout 10s;                       # 工作进程关闭超时时间
timer_resolution 100ms;                            # 事件定时器分辨率
include /etc/nginx/conf.d/*.conf;                  # 包含其他配置文件
load_module modules/ngx_http_geoip_module.so;      # 动态加载模块
env PATH;                                          # 设置环境变量
env MY_VARIABLE=value;                             # 设置自定义环境变量

通过合理配置这些全局指令,可以优化 Nginx 的性能和稳定性,并确保其在各种操作系统和硬件环境下的高效运行。

2. Events 模块

Events 模块配置与连接处理相关的参数,例如每个工作进程允许的最大连接数。

events {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

Nginx 的 Events 模块用于配置处理事件的相关参数,例如每个工作进程允许的最大连接数、使用的事件模型等。以下是 Nginx Events 模块的常见配置指令及其示例:

指令名称 说明 示例
worker_connections 每个工作进程允许的最大连接数。 worker_connections 1024;
multi_accept 设置工作进程是否同时接受多个新连接。 multi_accept on;
use 指定使用的事件驱动模型。 use epoll;

配置示例

以下是一个包含多个 Events 模块指令的 Nginx 配置示例:

events {
    worker_connections 1024;  # 每个工作进程允许的最大连接数
    multi_accept on;          # 同时接受多个新连接
    use epoll;                # 使用 epoll 事件驱动模型(适用于 Linux)
}

指令详细说明

  1. worker_connections

    • 说明:设置每个工作进程允许的最大连接数。这是一个关键参数,决定了 Nginx 的并发处理能力。
    • 示例:worker_connections 1024;
  2. multi_accept

    • 说明:当设置为 on 时,每个工作进程将尝试同时接受所有的新连接。当负载较重时,这可以提高连接的接受速度。
    • 示例:multi_accept on;
  3. use

    • 说明:指定 Nginx 使用的事件驱动模型。常见的选项包括 selectpollkqueueepoll/dev/polleventport 等。选择适合操作系统和负载的事件模型可以显著提高性能。
    • 示例:use epoll;(epoll 是 Linux 上性能优异的事件驱动模型)

通过合理配置 Events 模块指令,可以优化 Nginx 的事件处理性能,提升服务器在高并发环境下的响应能力。

events 模块可以配置多个吗?

在 Nginx 中,Events 模块本身只能配置一个。

这是因为 Events 模块主要用于配置与事件处理相关的参数,例如工作进程允许的最大连接数、事件驱动模型等。

这些配置对于整个 Nginx 实例是全局性质的,因此只需要一个 Events 模块来定义这些参数即可。

在 Nginx 的配置文件中,Events 模块通常位于 nginx.conf 文件的顶层,如下所示:

events {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

上述配置示例中,events 块内的指令只能配置一次,且其中的指令影响所有工作进程和连接处理。

如果需要更多的事件处理配置,通常情况下并不会在同一个配置文件中重复定义 events 块,而是依赖于全局配置的一致性。

因此,答案是:在 Nginx 中,Events 模块本身只能配置一个,用于定义全局的事件处理参数。

3. HTTP 模块

HTTP 模块是最常用的模块,包含 HTTP 服务器和反向代理相关的配置。

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    keepalive_timeout 65;

    # Include server blocks
    include /etc/nginx/conf.d/*.conf;
}

nginx http 模块可以配置多个吗?

在 Nginx 配置文件中,每个文件只能包含一个 http 块,用于定义 HTTP 服务器的全局配置。

这个 http 块包含了所有的 server 块,每个 server 块代表一个虚拟主机或者一个 HTTP 服务配置单元。

Nginx HTTP 模块配置指令及其示例:

以下是一些常见的 Nginx HTTP 模块配置指令及其说明:

指令名称 说明
include 包含其他配置文件。
default_type 设置默认的 MIME 类型。
log_format 定义日志格式。
access_log 配置访问日志路径和格式。
error_log 配置错误日志路径和级别。
gzip 启用或禁用 Gzip 压缩。
gzip_types 配置哪些 MIME 类型的响应需要进行 Gzip 压缩。
client_max_body_size 设置请求体的最大大小。
keepalive_timeout 配置 Keep-Alive 连接超时时间。
proxy_cache_path 配置反向代理的缓存路径和参数。
proxy_set_header 设置发送给后端服务器的 HTTP 头字段。
proxy_pass 设置反向代理到后端服务器。
root 设置请求的根目录。
index 设置默认的索引文件。
try_files 配置尝试查找文件的规则。
error_page 配置错误页面。
expires 设置响应的过期时间。
add_header 添加 HTTP 响应头字段。
ssl_certificate 配置 SSL 证书文件路径。
ssl_certificate_key 配置 SSL 证书私钥文件路径。
ssl_protocols 配置支持的 SSL 协议版本。
ssl_ciphers 配置支持的 SSL 加密算法。
server_name 配置虚拟主机的域名。
listen 配置监听的端口和 IP 地址。
resolver 配置域名解析器地址。
include 包含其他配置文件。

以下是一个示例 Nginx 配置文件,包含了上述提到的一些常见的 HTTP 模块配置指令:

# 定义全局的 MIME 类型和默认类型
http {
    include       mime.types;
    default_type  application/octet-stream;

    # 定义日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 配置访问日志
    access_log /var/log/nginx/access.log main;

    # 配置错误日志
    error_log /var/log/nginx/error.log warn;

    # 第一个虚拟主机配置
    server {
        listen       80;
        server_name  example.com www.example.com;

        root /var/www/example.com;
        index index.html index.htm;

        # 配置请求处理规则
        location / {
            try_files $uri $uri/ =404;
        }

        # 配置反向代理
        location /api/ {
            proxy_pass http://backend_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        # 启用 Gzip 压缩
        gzip on;
        gzip_types text/plain application/xml;
    }

    # 第二个虚拟主机配置
    server {
        listen       80;
        server_name  anotherdomain.com;

        root /var/www/anotherdomain.com;
        index index.html index.htm;

        # 配置请求处理规则
        location / {
            try_files $uri $uri/ =404;
        }

        # 配置 SSL
        ssl_certificate /etc/nginx/ssl/anotherdomain.com.crt;
        ssl_certificate_key /etc/nginx/ssl/anotherdomain.com.key;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        # 添加自定义 HTTP 头字段
        add_header X-Frame-Options "SAMEORIGIN";
    }

    # 全局配置
    client_max_body_size 10M;
    keepalive_timeout 65;

    # 配置 HTTP 缓存
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
}

在这个示例配置文件中:

  • http 块包含了全局的配置,如包含其他配置文件、默认 MIME 类型、日志格式和路径等。
  • 两个 server 块分别定义了两个虚拟主机的配置,包括监听的端口、域名、根目录、索引文件、请求处理规则(使用 location 块)、反向代理配置、Gzip 压缩、SSL 配置等。
  • 全局配置部分包括了一些通用的配置指令,如客户端请求体大小限制 (client_max_body_size)、Keep-Alive 连接超时时间 (keepalive_timeout),以及 HTTP 缓存配置 (proxy_cache_path)。

这个示例展示了如何通过组合使用不同的 Nginx HTTP 模块配置指令,来实现一个具有多个虚拟主机、反向代理、SSL 加密、HTTP 头字段添加、Gzip 压缩和缓存控制的完整的 HTTP 服务器配置。

4. Server 模块

Server 模块配置单个虚拟主机的参数。

它通常包含在 HTTP 模块内。

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    location = /404.html {
        internal;
    }
}

nginx server 模块常见的指令表格

以下是一些常见的 Nginx server 模块配置指令及其说明:

指令名称 说明
listen 配置监听的端口和 IP 地址。
server_name 配置虚拟主机的域名。
root 设置请求的根目录。
index 设置默认的索引文件。
location 定义请求处理的位置块。
try_files 配置尝试查找文件的规则。
error_page 配置错误页面。
access_log 配置访问日志路径和格式。
error_log 配置错误日志路径和级别。
ssl_certificate 配置 SSL 证书文件路径。
ssl_certificate_key 配置 SSL 证书私钥文件路径。
ssl_protocols 配置支持的 SSL 协议版本。
ssl_ciphers 配置支持的 SSL 加密算法。
add_header 添加 HTTP 响应头字段。
proxy_pass 设置反向代理到后端服务器。
proxy_set_header 设置发送给后端服务器的 HTTP 头字段。
proxy_read_timeout 配置从后端服务器读取响应的超时时间。
proxy_connect_timeout 配置与后端服务器建立连接的超时时间。
proxy_send_timeout 配置向后端服务器发送请求的超时时间。
proxy_buffering 启用或禁用反向代理缓冲。
proxy_cache 启用反向代理缓存。
proxy_cache_valid 配置反向代理缓存的有效期。
proxy_cache_key 配置反向代理缓存键。
proxy_cache_path 配置反向代理缓存路径和参数。
limit_req_zone 配置请求速率限制区域。
limit_conn_zone 配置连接速率限制区域。
gzip 启用或禁用 Gzip 压缩。
gzip_types 配置哪些 MIME 类型的响应需要进行 Gzip 压缩。
gzip_comp_level 配置 Gzip 压缩级别。
gzip_min_length 配置启用 Gzip 压缩的最小响应长度。
gzip_buffers 配置 Gzip 压缩使用的缓冲区大小。
gzip_disable 配置禁用 Gzip 压缩的条件。
expires 设置响应的过期时间。
add_header 添加 HTTP 响应头字段。
error_page 配置错误页面。

这些指令允许管理员在每个 server 块中配置特定虚拟主机的行为,从基本的请求处理到高级的代理、安全和性能调优配置。

通过合理配置这些指令,可以实现丰富的功能和灵活的服务器行为定制。

nginx server 模块常见的配置例子

以下是一个简单的 Nginx server 模块的配置例子,展示了如何配置一个基本的静态文件服务器:

server {
    listen 80;  # 监听端口

    server_name example.com www.example.com;  # 设置虚拟主机的域名

    root /var/www/example.com;  # 设置根目录

    index index.html index.htm;  # 设置默认的索引文件

    access_log /var/log/nginx/example.access.log;  # 配置访问日志
    error_log /var/log/nginx/example.error.log;    # 配置错误日志

    location / {
        try_files $uri $uri/ =404;  # 配置请求处理规则
    }

    location /images/ {
        # 反向代理到另一个服务器的示例
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 启用 Gzip 压缩
    gzip on;
    gzip_types text/plain application/xml;

    # 添加自定义 HTTP 响应头
    add_header X-Frame-Options "SAMEORIGIN";

    # 设置 SSL 配置示例
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
}

在这个例子中:

  • listen 指令指定了 Nginx 监听的端口。
  • server_name 指令设置了虚拟主机的域名。
  • root 指令定义了服务器的根目录,客户端请求将在这个根目录下查找文件。
  • index 指令设置了默认的索引文件,如果请求的路径是一个目录,则尝试显示指定的索引文件。
  • access_logerror_log 指令配置了访问日志和错误日志的路径。
  • location / 块定义了基本的请求处理规则,使用 try_files 指令尝试查找请求的文件。
  • location /images/ 块演示了如何配置反向代理,将以 /images/ 开头的请求转发到 http://backend_server
  • gzip 指令启用了 Gzip 压缩,并配置了需要压缩的 MIME 类型。
  • add_header 指令添加了自定义的 HTTP 响应头字段。
  • ssl_certificatessl_certificate_key 指令配置了 SSL 证书和私钥的路径,启用了 HTTPS 访问。
  • ssl_protocolsssl_ciphers 指令配置了 SSL 支持的协议版本和加密算法。

这个配置示例展示了一个基本的 Nginx HTTP 服务器配置,包括静态文件服务、反向代理、Gzip 压缩、自定义响应头、SSL 配置等功能。

根据实际需求,可以进一步调整和扩展这些配置来满足特定的应用场景和安全要求。

5. Location 模块

Location 模块用于定义请求路径和处理方法。

location /images/ {
    root /data;
}

location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

nginx location 常见的指令表格

在 Nginx 的 location 块中,常见的配置指令用于定义请求的处理规则和行为。以下是一些常见的 Nginx location 块配置指令及其说明:

指令名称 说明
alias 定义请求的路径别名。
root 设置请求的根目录。
try_files 配置尝试查找文件的规则。
index 设置默认的索引文件。
rewrite 定义重写规则。
return 定义返回响应码和重定向。
error_page 配置错误页面。
expires 设置响应的过期时间。
limit_req 配置请求速率限制。
limit_conn 配置连接速率限制。
proxy_pass 设置反向代理到后端服务器。
proxy_set_header 设置发送给后端服务器的 HTTP 头字段。
proxy_read_timeout 配置从后端服务器读取响应的超时时间。
proxy_connect_timeout 配置与后端服务器建立连接的超时时间。
proxy_send_timeout 配置向后端服务器发送请求的超时时间。
proxy_buffering 启用或禁用反向代理缓冲。
proxy_cache 启用反向代理缓存。
proxy_cache_valid 配置反向代理缓存的有效期。
proxy_cache_key 配置反向代理缓存键。
proxy_cache_path 配置反向代理缓存路径和参数。
fastcgi_pass 设置 FastCGI 后端服务器。
fastcgi_param 设置传递给 FastCGI 服务器的参数。
uwsgi_pass 设置 uWSGI 后端服务器。
scgi_pass 设置 SCGI 后端服务器。
grpc_pass 设置 gRPC 后端服务器。
include 包含其他配置文件。

这些指令允许管理员在 location 块中配置特定请求路径的处理规则,包括路径重写、缓存控制、反向代理、FastCGI、uWSGI、SCGI 等 CGI 协议支持,以及各种请求速率和连接速率的限制。配置文件中可以根据具体需求组合和使用这些指令,以实现复杂的请求路由和后端服务集成。

nginx location 常见的配置例子

以下是一些常见的 Nginx location 块配置示例,展示了不同情况下如何配置具体的请求处理规则:

静态文件服务

server {
    listen 80;
    server_name example.com;

    root /var/www/example.com;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location /images/ {
        alias /var/www/images/;
    }
}
  • 说明
    • / 路径下的请求使用 try_files 指令尝试查找文件,如果找不到则返回 404。
    • /images/ 路径下的请求使用 alias 指令将请求路径映射到服务器文件系统中的另一个位置。

反向代理

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
  • 说明
    • 所有 / 路径下的请求将被反向代理到名为 backend_server 的后端服务器。
    • 使用 proxy_set_header 指令设置发送给后端服务器的 HTTP 头字段。

FastCGI 服务

server {
    listen 80;
    server_name php.example.com;

    root /var/www/php.example.com;
    index index.php;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
  • 说明
    • 所有以 .php 结尾的请求将使用 fastcgi_pass 指令转发到 PHP FastCGI 进程。
    • fastcgi_param 指令设置传递给 FastCGI 服务器的参数,例如 SCRIPT_FILENAME

缓存控制

server {
    listen 80;
    server_name static.example.com;

    root /var/www/static.example.com;
    index index.html;

    location / {
        expires 1d;
    }
}
  • 说明
    • 所有请求在 / 路径下,响应的过期时间设置为 1 天,使用 expires 指令。

HTTPS 配置

server {
    listen 443 ssl;
    server_name secure.example.com;

    ssl_certificate /etc/nginx/ssl/secure.example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/secure.example.com.key;

    location / {
        # HTTPS 配置的具体内容
    }
}
  • 说明
    • 使用 ssl_certificatessl_certificate_key 指令配置 SSL 证书和私钥路径。
    • 此处 location / 块内可以配置与 HTTPS 相关的其他指令,如 SSL 协议版本、加密算法等。

这些示例展示了在不同场景下如何配置 Nginx 的 location 块,以实现静态文件服务、反向代理、FastCGI、缓存控制和 HTTPS 安全设置等功能。

根据具体需求,可以进一步调整和扩展这些配置来满足特定的应用场景和安全要求。

6. Upstream 模块

Upstream 模块配置负载均衡和反向代理的后端服务器组。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
}

nginx Upstream 模块指令表格

在 Nginx 中,Upstream 模块用于定义一组后端服务器,常用于负载均衡和反向代理配置。

以下是一些常见的 Nginx Upstream 模块配置指令及其说明:

指令名称 说明
upstream 定义一个上游服务器组。
server 定义单个上游服务器。
weight 设置服务器的权重,用于负载均衡。
max_fails 设置在服务器被标记为不可用前允许的最大失败次数。
fail_timeout 设置在服务器被标记为不可用多长时间后尝试重新启用的时间。
backup 指定服务器为备份服务器,只有在所有非备份服务器失败时才会使用。
down 标记服务器为永久不可用,不会尝试与其建立连接。
keepalive 设置与上游服务器的 keepalive 连接参数。
zone 设置共享内存区域以跟踪上游服务器的状态。
hash 根据指定的键值对请求进行散列分配。
ip_hash 根据客户端 IP 地址进行散列分配。
least_conn 选择活跃连接数最少的服务器进行请求分发。

这些指令允许管理员配置上游服务器组的各种参数,包括负载均衡策略、健康检查、备份服务器、连接保持等。

通过合理配置 Upstream 模块,可以实现高可用性、负载均衡和性能优化的反向代理服务。

nginx Upstream 模块配置例子

以下是一个简单的 Nginx Upstream 模块的配置例子,演示了如何定义一组后端服务器并进行负载均衡配置:

http {
    upstream backend_servers {
        server backend1.example.com weight=3;
        server backend2.example.com:8080 max_fails=3 fail_timeout=30s;
        server 192.168.1.100:8080 backup;
        server unix:/var/run/backend3.sock;
        keepalive 32;
    }

    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 { ... } 定义了一个名为 backend_servers 的上游服务器组。
    • server 指令用于定义每个后端服务器的配置:
      • backend1.example.com 权重为 3,表示比其他服务器被选中的概率更高。
      • backend2.example.com:8080 设置了最大失败次数为 3 次,每次失败后等待 30 秒后再次尝试。
      • 192.168.1.100:8080 设为备份服务器,在所有非备份服务器失败时才会使用。
      • unix:/var/run/backend3.sock 使用 UNIX 域套接字连接。
    • keepalive 32; 设置与上游服务器的 keepalive 连接数。

在上述配置中,Nginx 将通过 proxy_pass 指令将所有来自 example.com 的请求代理到 backend_servers 组中的后端服务器。

通过合理配置权重、失败处理和备份服务器,可以实现高可用性和负载均衡,确保应用在各种条件下的稳定运行。

7. Stream 模块

Stream 模块用于配置 TCP/UDP 代理服务。

stream {
    upstream backend {
        server backend1.example.com:12345;
        server backend2.example.com:12345;
    }

    server {
        listen 12345;
        proxy_pass backend;
    }
}

nginx stream 模块的指令表格

Nginx 的 Stream 模块用于处理 TCP 和 UDP 流量,例如用于代理和负载均衡非 HTTP 流量。

以下是一些常见的 Nginx Stream 模块配置指令及其说明:

指令名称 说明
stream 定义一个 TCP 或 UDP 代理服务器。
server 定义一个 TCP 或 UDP 服务器块。
listen 配置监听的 IP 地址和端口。
proxy_pass 设置反向代理到后端服务器。
proxy_timeout 配置与后端服务器的超时时间。
proxy_connect_timeout 配置与后端服务器建立连接的超时时间。
proxy_send_timeout 配置向后端服务器发送数据的超时时间。
proxy_read_timeout 配置从后端服务器读取数据的超时时间。
proxy_protocol 启用或禁用代理协议支持。
ssl_preread 启用 SSL 预读取用于 TCP 和 UDP 代理。
allow 定义允许连接的 IP 地址或地址范围。
deny 定义拒绝连接的 IP 地址或地址范围。
limit_conn 配置并发连接数限制。
limit_rate 配置限制连接速率。
zone 配置共享内存区域以跟踪连接状态。
resolver 配置域名解析器地址。

这些指令允许管理员配置 Nginx Stream 模块用于处理 TCP 或 UDP 流量的各种行为,包括代理、超时控制、SSL 预读取、访问控制、限速等。

通过合理配置这些指令,可以实现非 HTTP 流量的反向代理、负载均衡和安全控制。

nginx stream 模块的常见配置例子

以下是一个简单的 Nginx Stream 模块的配置例子,演示了如何配置 TCP 和 UDP 代理服务器:

TCP 代理

stream {
    upstream backend_servers {
        server backend1.example.com:12345;
        server backend2.example.com:12345;
    }

    server {
        listen 12345;
        proxy_pass backend_servers;
        proxy_timeout 3s;
    }
}
  • 说明
    • stream { ... } 定义了一个 TCP 代理服务器。
    • upstream backend_servers { ... } 定义了一个名为 backend_servers 的上游服务器组。
    • server { ... } 定义了一个 TCP 服务器块,监听端口 12345
    • proxy_pass backend_servers; 使用 proxy_pass 指令将所有来自客户端的 TCP 请求代理到 backend_servers 组中的后端服务器。
    • proxy_timeout 3s; 配置与后端服务器的超时时间为 3 秒。

UDP 代理

stream {
    server {
        listen 12345 udp;
        proxy_pass backend_server;
        proxy_timeout 3s;
        proxy_responses 1;
    }
}
  • 说明
    • stream { ... } 定义了一个 UDP 代理服务器。
    • server { ... } 定义了一个 UDP 服务器块,监听 UDP 端口 12345
    • proxy_pass backend_server; 使用 proxy_pass 指令将所有来自客户端的 UDP 请求代理到 backend_server
    • proxy_timeout 3s; 配置与后端服务器的超时时间为 3 秒。
    • proxy_responses 1; 配置 UDP 代理的最大响应次数为 1。

这些示例展示了如何配置 Nginx Stream 模块来处理 TCP 和 UDP 流量的代理功能。

通过合理配置 upstreamserver 块,可以实现 TCP 和 UDP 请求的负载均衡、超时控制和安全性。

小结

看的出来,nginx 的模块非常强大。

我们实现的时候,还是要分清主次,依次处理。

我是老马,期待与你的下次重逢。

开源地址

为了便于大家学习,已经将 nginx 开源

https://github.com/houbb/nginx4j

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容