nginx之负载均衡

用Nginx实现四层负载均衡

可以使用Nginx的Stream模块,该模块能够对TCP和UDP流量进行负载均衡。下面是具体实现步骤:
安装Nginx并开启Stream模块。
配置Stream模块,定义上游服务器和负载均衡算法。可以在nginx.conf文件中添加如下配置:

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

    server {
        listen 80;
        proxy_pass backend;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_next_upstream error;
    }
}

在这个配置中,我们定义了一个名为“backend”的上游服务器组,其中包含两个服务器,分别是backend1.example.com和backend2.example.com,它们都监听80端口。然后定义了一个监听80端口的Server,使用了proxy_pass指令将请求转发给上游服务器组。此外,我们还设置了一些负载均衡器的相关参数,例如连接超时时间、请求超时时间和错误处理方式等。

重新加载Nginx配置文件。可以使用如下命令:

sudo nginx -t
sudo nginx -s reload

测试负载均衡。可以使用类似telnet的工具测试:

telnet localhost 80

这时,Nginx会将请求转发到后端的服务器上,从而实现四层负载均衡。

需要注意的是,使用Nginx进行四层负载均衡,它只能对TCP和UDP的流量进行负载均衡,而不能对HTTP等应用层协议进行负载均衡。如果需要实现应用层的负载均衡,就需要使用七层负载均衡了。

7层负载均衡的示例

包括常用的配置参数和详细解析:

http {
    upstream backend {
        server backend1.example.com weight=5;
        server backend2.example.com;
        server unix:/var/run/backend3.sock;
    }
    
    server {
        listen 80;
        server_name example.com;
        
        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

upstream: 指定后端服务器列表及相关参数,可以使用域名、IP地址或Unix socket作为服务器地址。在这个例子中,backend1.example.com服务器的权重为5,backend2.example.com服务器的权重为默认值1,backend3.sock是Unix socket类型的服务器。
server: 定义Nginx监听的端口和域名。在这个例子中,监听80端口,server_name为example.com。
location: 定义请求的路径和代理方式。在这个例子中,路径为/,代理方式为proxy_pass,即将请求转发给upstream中定义的后端服务器列表,同时在请求头中添加Host和X-Real-IP两个字段,用于传递请求的目标地址和客户端真实IP地址。
此外,还可以通过设置其他的参数来进一步优化负载均衡效果,比如:

proxy_connect_timeout: 设置连接后端服务器的超时时间。
proxy_read_timeout: 设置从后端服务器读取响应的超时时间。
proxy_send_timeout: 设置向后端服务器发送请求的超时时间。
proxy_next_upstream: 设置当一个后端服务器无法响应请求时,Nginx应该如何处理。比如可以使用error选项表示立即停止请求,使用timeout选项表示在超时后重试下一个服务器。
ip_hash: 将同一个客户端的请求路由到同一个后端服务器,可以减少后端服务器之间的会话复杂度。
需要注意的是,7层负载均衡比4层负载均衡更加复杂,需要更多的配置和参数调整,因此建议根据实际情况进行适当调整和优化。

以下是常用的几种负载均衡算法及其配置方法:

轮询算法(Round Robin)

该算法将请求依次分配给后端服务器,实现方法如下:

upstream backend {
  server 192.168.1.1;
  server 192.168.1.2;
  server 192.168.1.3;
}

server {
  listen 80;
  location / {
    proxy_pass http://backend;
  }
}

IP Hash算法

该算法通过对客户端 IP 地址进行 Hash 计算,将同一客户端的请求分配给同一台后端服务器。实现方法如下:

upstream backend {
  ip_hash;
  server 192.168.1.1;
  server 192.168.1.2;
  server 192.168.1.3;
}

server {
  listen 80;
  location / {
    proxy_pass http://backend;
  }
}

最小连接数算法(Least Connections)

该算法将请求分配给当前连接数最少的服务器,实现方法如下:

upstream backend {
  least_conn;
  server 192.168.1.1;
  server 192.168.1.2;
  server 192.168.1.3;
}

server {
  listen 80;
  location / {
    proxy_pass http://backend;
  }
}

加权轮询算法(Weighted Round Robin)

该算法将请求按照预设的权重分配给后端服务器,实现方法如下:

upstream backend {
  server 192.168.1.1 weight=3;
  server 192.168.1.2 weight=2;
  server 192.168.1.3 weight=1;
}

server {
  listen 80;
  location / {
    proxy_pass http://backend;
  }
}

加权最小连接数算法(Weighted Least Connections)

该算法将请求分配给连接数最少且权重最高的服务器,实现方法如下:

upstream backend {
  least_conn;
  server 192.168.1.1 weight=3;
  server 192.168.1.2 weight=2;
  server 192.168.1.3 weight=1;
}

server {
  listen 80;
  location / {
    proxy_pass http://backend;
  }
}

除了上面提到的常用参数,还有以下一些常见的参数:

proxy_set_header: 设置转发请求头的字段,可以将客户端的请求头中的一些字段转发给后端服务器。例如:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 可以将客户端的真实IP地址传递给后端服务器。
proxy_cache: 启用缓存功能,将后端服务器的响应缓存到本地,可以减轻后端服务器的负载。需要设置缓存目录、缓存时间和缓存规则等参数。
proxy_ssl: 启用SSL连接,将客户端和后端服务器之间的通信加密。需要设置SSL证书和私钥等参数。
proxy_buffering: 是否启用缓冲,默认情况下,nginx会将响应全部缓存到内存中再一次性发送给客户端。可以设置为off关闭缓冲,将响应实时发送给客户端,可以降低延迟和内存使用。
proxy_redirect: 重定向配置,可以将后端服务器返回的重定向响应自动重写为新的URL。
proxy_pass_request_headers: 设置哪些请求头需要传递给后端服务器。默认情况下,所有请求头都会被传递。
proxy_pass_request_body: 是否传递POST请求的body数据给后端服务器,默认情况下是不传递的。

proxy_ignore_headers: 忽略一些响应头字段,可以节省内存和网络带宽,例如:proxy_ignore_headers Set-Cookie Expires Cache-Control; 可以忽略这些响应头字段。
proxy_cache_valid: 缓存有效时间,可以设置缓存多长时间后过期,例如:proxy_cache_valid 200 1h; 表示缓存200状态码的响应1小时过期。
proxy_cache_bypass: 缓存绕过规则,可以设置某些请求不走缓存,例如:proxy_cache_bypass http_pragma; 表示如果请求头中带有Pragma字段,则不走缓存。 proxy_cache_key: 缓存键名,可以根据请求URL和一些请求头字段生成缓存键名,例如:proxy_cache_key "schemerequest_methodhost$request_uri"; 表示根据请求URL生成缓存键名。
proxy_cache_path: 缓存目录配置,可以设置缓存目录的位置、大小和清理规则等参数,例如:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m; 表示将缓存目录设置为/var/cache/nginx,并设置缓存大小和清理规则。
proxy_next_upstream: 设置当后端服务器出现错误时,nginx应该重试哪些服务器,例如:proxy_next_upstream error timeout http_500 http_502 http_503 http_504; 表示当出现错误、超时、500、502、503、504状态码时,nginx会尝试下一个后端服务器。

proxy_connect_timeout: 连接后端服务器的超时时间,例如:proxy_connect_timeout 5s; 表示连接后端服务器超时时间为5秒。
proxy_read_timeout: 读取后端服务器响应的超时时间,例如:proxy_read_timeout 10s; 表示读取后端服务器响应超时时间为10秒。
proxy_send_timeout: 发送请求到后端服务器的超时时间,例如:proxy_send_timeout 5s; 表示发送请求到后端服务器超时时间为5秒。
proxy_buffer_size: 缓存响应的大小,可以提高响应速度,例如:proxy_buffer_size 4k; 表示缓存响应大小为4KB。
proxy_buffers: 缓存响应的缓冲区大小和数量,可以提高响应速度,例如:proxy_buffers 4 32k; 表示使用4个32KB大小的缓冲区缓存响应。
proxy_busy_buffers_size: 缓存响应时,如果缓冲区被占满了,nginx应该如何处理,例如:proxy_busy_buffers_size 64k; 表示如果缓冲区被占满了,nginx会等待响应被写入到磁盘中。
proxy_temp_file_write_size: 缓存响应时,如果缓冲区被占满了,nginx会将响应写入到临时文件中,该参数设置临时文件的大小,例如:proxy_temp_file_write_size 64k; 表示临时文件的大小为64KB。

proxy_redirect: 当后端服务器返回重定向时,nginx会根据该参数进行处理,例如:proxy_redirect default; 表示使用默认的重定向方式处理。
proxy_set_header: 设置请求头的值,例如:proxy_set_header Host $host; 表示将请求头的Host字段设置为当前的主机名。
proxy_pass_request_headers: 是否传递请求头给后端服务器,例如:proxy_pass_request_headers on; 表示传递请求头给后端服务器。
proxy_pass_request_body: 是否传递请求体给后端服务器,例如:proxy_pass_request_body on; 表示传递请求体给后端服务器。
proxy_method: 指定使用的HTTP方法,例如:proxy_method POST; 表示使用POST方法。
proxy_cookie_domain: 修改请求头中Cookie域的值,例如:proxy_cookie_domain localhost example.com; 表示将请求头中的Cookie域从localhost修改为example.com。

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

推荐阅读更多精彩内容

  • Nginx负载均衡 1、负载均衡的作用 如果你的nginx服务器给2台web服务器做代理,负载均衡算法采用轮询,那...
    漫步云端vv阅读 533评论 0 1
  • 一、负载均衡 负载均衡是一种集群技术,旨在解决高并发场景下的服务问题。其硬件环境模型可以由一台前置服务器和多台服务...
    大鱼炖海棠阅读 411评论 0 8
  • 负载均衡 将用户的请求均匀的或者按照一定的优先级分配到一组服务器中的一台上,而接收到请求的服务器独立的处理请求并返...
    大乔是个美少女阅读 451评论 0 0
  • linux负载均衡总结性说明(四层负载/七层负载) 一,什么是负载均衡1)负载均衡(Load Balance)建立...
    phpdi阅读 390评论 0 0
  • day49Nginx负载均衡实战集群开机顺序:1、从后往前开。 编译安装nginx负载均衡下载:mkdir -p ...
    国王12阅读 291评论 0 0