[转帖]Nginx系列之nginx四层反向代理

nginx,系列,四层,反向,代理 · 浏览次数 : 0

小编点评

**nginx四层代理配置** `nginx.conf`配置文件中包含了用于四层代理的配置。以下是一个示例配置: ```nginx server { listen 12345; # 定义 backend组 upstream backend { # 配置负载均衡算法,这里是一致性hash算法,以$remote_addr作为hash的键。 hash $remote_addr consistent; server backend1.example.com:12345 weight=5; server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; } # 定义dns组 upstream dns { server 192.168.0.1:53535; server dns.example.com:53; } server { # 指定监听的端口,tcp/udp listen 12345; proxy_connect_timeout 1s; proxy_pass http://backend; # 定义 server 的权重 weight 2; # 设置最大失败次数 max_fails 5; # 设置超时时间 fail_timeout 10; } # 定义轮询算法负载均衡 upstream least_conn { least_conn 3; } # 使用 random 负载均衡算法 upstream random { random; } } ``` **主要配置项:** * `listen 12345;`:监听端口 12345。 * `upstream backend { ... }`:定义 backend 组,包含多个服务器。 * `upstream dns { ... }`:定义 dns 组,用于解析域名。 * `server { ... }`:定义服务器块,用于处理请求。 * `weight 2;`:设置 server 权重为 2。 * `max_fails 5;`:设置最大失败次数为 5。 * `fail_timeout 10;`:设置超时时间为 10 秒。 * `upstream least_conn { ... }`:使用 least_conn 负载均衡算法。 * `upstream random { ... }`:使用 random 负载均衡算法。 **使用四层代理的优点:** * 提高性能。 * 提升灵活性。 **使用四层代理的缺点:** * 性能可能略低。 * 负载均衡算法可能使性能 worse。

正文

https://cloud.tencent.com/developer/article/2013908

 

上集说到nginx的http七层代理,其实它工作在OSI七层模型的应用层。由于其可以解析http协议,我们可以根据URI进行请求的分发,具有很大的灵活性,但是协议的解析存在性能的消耗。为了能获取更高的代理性能,nginx支持了四层代理,即传输层,就是我们常说的TCP/UDP层,没有协议解析,就是简单的TCP/UDP转发,代理性能突飞猛进,该功能依赖于ngx_http_upstream_module和ngx_stream_upstream_module,互联网公司将其作为入口代理来工作。

1. nginx配置

# nginx.conf

worker_processes auto;

error_log /var/log/nginx/error.log info;

events {
    worker_connections  1024;
}

stream {
    # 定义backend组
    upstream backend {
        # 指定负载均衡算法,这里是一致性hash算法,以$remote_addr作为hash的键.
        hash $remote_addr consistent;

        server backend1.example.com:12345 weight=5;
        server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;
        server unix:/tmp/backend3;
    }

    # 定义dns组
    upstream dns {
       server 192.168.0.1:53535;
       server dns.example.com:53;
    }

    server {
        # 指定监听的端口,tcp/udp
        listen 12345;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        # 代理至backend服务器组
        proxy_pass backend;
    }

    server {
        # 指定监听的端口,tcp/udp
        listen 127.0.0.1:53 udp reuseport;
        proxy_timeout 20s;
        # 代理至dns服务器组
        proxy_pass dns;
    }

    server {
        # 指定监听的端口,tcp/udp
        listen [::1]:12345;
        # 指定代理至本地socket文件
        proxy_pass unix:/tmp/stream.socket;
    }
}

经过以上简单的配置,nginx -s reload后,nginx即可作为四层反向代理服务器。这段配置的关键在于server配置端,指定监听的端口,proxy_pass来指定上游服务器或上游服务器组。与七层代理的配置区别主要在于http-->stream,没有localctation配置,直接监听端口,将端口的流量直接进行转发。

2. 上游服务器组的实现

在如今的流量为王的时代,单机以及远远不能满足性能要求,这就需要我们在上游服务中提供多台服务器,形成服务器组。共同来提供服务,并可以采用不同的负载均衡算法,更加灵活与可扩展。而做到这些需要依赖ngx_stream_upstream_module模块。示例:

http {

    upstream backend {
        # 配置负载均衡算法
        hash $remote_addr consistent;
        server backend1.example.com       weight=5;
        server backend2.example.com:8080;
        server unix:/tmp/backend3;

        server backup1.example.com:8080   backup;
        server backup2.example.com:8080   backup;

    }

    server {
        listen 80;
        proxy_timeout 20s;
        # 代理至dns服务器组
        proxy_pass dns;
        proxy_pass http://backend;
    }
}

从配置我们可以看到使用upstream定义了backend组,并在后续的server配置中引用,放在proxy_pass指令后面。这样就快速实现多台服务器提供服务的效果,默认是轮询算法,权重默认都为1;

代理过程属性超时控制:

•proxy_connect_timeout: 指定与上游服务器建立连接的超时时间,默认为60s,配置上下文stream和server。

•proxy_timeout: 设置客户端或代理服务器连接上两次连续的读取或写入操作之间的超时。如果在此时间内没有数据传输,则连接将关闭。默认10m,配置上下文stream和server。

容错相关的配置:

•proxy_next_upstream: 如果无法建立与代理服务器的连接,决定是否将客户端连接传递给下一个服务器。配置上下文stream和server;默认开启;

•proxy_next_upstream_timeout: 限制允许将连接传递到下一台服务器的时间,配置上下文stream和server;默认关闭;

•proxy_next_upstream_tries: 限制将连接传递到下一个服务器的可能尝试次数,配置上下文stream和server,默认关闭;

限速相关的配置:

•proxy_download_rate:限制从代理服务器读取数据的速度。单位为bytes/s。默认为0,即关闭速率限制。该限制是针对每个连接设置的,因此,如果nginx同时打开与代理服务器的两个连接,则总速率会是指定限制的两倍。从nginx1.17.0开始,该指令后可以包含变量, 配置上下文stream和server。

•proxy_upload_rate:限制从代理服务器读取数据的速度。单位为bytes/s。默认为0,即关闭速率限制。该限制是针对每个连接设置的,因此,如果nginx同时打开与代理服务器的两个连接,则总速率会是指定限制的两倍。从nginx1.17.0开始,该指令后可以包含变量, 配置上下文stream和server。

upstream中的server的属性,我们也可以灵活配置,包括轮询算法、server权重等属性。

3. server的属性配置

•weight: 指定server的权重,默认为1

•max_fails: 容错处理,配置与服务器通信失败达到多少次后判断服务器异常,通信过程中的超时时间由fail_timeout指定,默认是1次,0为禁用。

•fail_timeout: 指定与服务器通信的超时时间。

•更多配置参数请参考官方文档: http://nginx.org/en/docs/http/ngx_stream_upstream_module.html

4. 负载均衡算法

•hash: 配置格式为 hash key [consistent]; 配置上下文为upstream。 该指定为服务器组指定基于hash的负载平衡方法,在服务器组中,客户端与服务器映射关系基于散列键key。key可以包含文本,变量及其两者组合。请注意,从组中添加或删除服务器可能会导致将大多数keys重新映射到其他服务器。 但是如果指定了consistent参数,则会使用ketama一致性哈希算法。该方法可确保在将服务器添加到组中或从组中删除服务器时,只有很少的key被重新映射到不同的服务器。这有助于为缓存服务器实现更高的缓存命中率。

•least_conn: 配置格式为 least_conn; 配置上下文为upstream。 指定组应使用least_conn负载平衡算法,该算法将请求传递到活动连接数最少的服务器,同时考虑服务器的权重。如果有多个这样的服务器,则依次使用加权循环平衡方法进行尝试。

•random: 配置格式为 random [two [method]]; 配置上下文为upstream。 指定组应使用random负载平衡算法,该算法将请求传递到随机选择的服务器,同时考虑服务器的权重。 可选的two参数指示nginx可以随机选择两个服务器,然后使用指定的method选择一个服务器。默认方法是least_conn,它将请求传递给活动连接数最少的服务器。

5. 模块的有用的内置变量

1. $status: 会话的处理状态码: 200、400、403、500、502、503。具体含义可参考http://nginx.org/en/docs/stream/ngx_stream_core_module.html;
2. $remote_addr:客户端地址;
3. $server_addr: 接受连接的服务器的地址;

6. 总结

依赖ngx_stream_proxy_modulengx_stream_upstream_module等模块,nginx实现了强大的四层反向代理功能。相较于七层反向代理,性能更高。但是对于业务的请求分发,灵活性比较低,所以nginx的四层和七层代理我们要根据自己的要求灵活使用,让nginx发挥最大的作用。

与[转帖]Nginx系列之nginx四层反向代理相似的内容:

[转帖]Nginx系列之nginx四层反向代理

https://cloud.tencent.com/developer/article/2013908 上集说到nginx的http七层代理,其实它工作在OSI七层模型的应用层。由于其可以解析http协议,我们可以根据URI进行请求的分发,具有很大的灵活性,但是协议的解析存在性能的消耗。为了能获取更

[转帖]探索惊群 ①

https://wenfh2020.com/2021/09/25/thundering-herd/ 惊群比较抽象,类似于抢红包 😁。它多出现在高性能的多进程/多线程服务中,例如:nginx。 探索惊群 系列文章将深入 Linux (5.0.1) 内核,透过 多进程模型 去剖析惊群现象、惊群原理、惊

[转帖]Nginx(四)负载均衡

一 nginx目录的说明 1 nginx/ 3 |-- client_body_temp 4 |-- conf #这是Nginx所有配置文件的目录,极其重要 5 | |-- fastcgi.conf 'fastcgi相关参数的配置文件' 6 | |-- fastcgi.conf.default #f

[转帖]nginx限速

https://www.cnblogs.com/fengzi7314/p/16541440.html 第一步,先创建限制的规则,我这里直接在nginx默认的配置文件目录下配置,如果想自定义,需要在主配置文件添加include xx/xxx/xxx/*.conf配置 [root@node5 nginx

[转帖]Nginx支持WebSocket反向代理

https://www.cnblogs.com/zhengchunyuan/p/12923692.html WebSocket是目前比较成熟的技术了,WebSocket协议为创建客户端和服务器端需要实时双向通讯的webapp提供了一个选择。其为HTML5的一部分,WebSocket相较于原来开发这类

[转帖]Nginx内置变量以及日志格式变量参数详解

补充 $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为空字符串 $uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$reques

[转帖]nginx proxy_pass keepalive

Syntax: keepalive connections; Default: — Context: upstream This directive appeared in version 1.1.4. Activates the cache for connections to upstream

[转帖]Nginx超时timeout 设置

Nginx 超时配置,连接时间过长直接关闭连接,显示timeout http { #每个 TCP 连接最多可以保持多长时间 keepalive_timeout 60; #客户端向服务端发送一个完整的 request header client_header_timeout 10; #客户端发送服务端

[转帖]nginx反向代理时保持长连接

https://www.cnblogs.com/liufarui/p/11075630.html ·【场景描述】 HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。 如果我们使用了nginx去作为反

[转帖]Nginx报错404,由于请求处理时间过长

问题复现 近期部门内部有一个应用由于数据量过于庞大,或者说sql优化性能问题,导致查询全量数据时老报错nginx404,后来查看浏览器timing信息,发现其竟然时常达到可怕的2分钟十秒,抛去解决sql优化问题,这里从Nginx端的配置来说如何解决这类问题! 存在的问题 服务器处理请求时间过长,导致