[每周一更]-(第78期):Nginx负载均衡proxy_pass代理模块常用参数配置

news/2024/7/7 21:42:30 标签: nginx, 负载均衡, 运维

在这里插入图片描述

0、负载均衡的策略

使用场景示例

# 定义要包含在负载均衡方案中的服务器。
# 最好使用服务器的私有IP以获得更好的性能和安全性。
http {

  upstream backend {
    server 10.1.0.101;
    server 10.1.0.102;
    server 10.1.0.103;
  }

  server{
  server_name game1.test.com;
  listen 80;
  location / {
        proxy_pass http://backend

        # 用户请求的时候HOST的值是game1.test.com, 那么代理服务会像后端传递请求的还是game1.test.com
        proxy_set_header Host $http_host;
        # 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
        proxy_set_header X-Real-IP $remote_addr;
        # 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # nginx代理与后端服务器连接超时时间(代理连接超时)
        proxy_connect_timeout 10s;
        # nginx代理等待后端服务器的响应时间
        proxy_read_timeout 10s;
        # 后端服务器数据回传给nginx代理超时时间
        proxy_send_timeout 10s;
        # nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传,不是全部接收完再传给客户
        proxy_buffering on;
        # 设置nginx代理保存用户头信息的缓冲区大小
        proxy_buffer_size  8k;
        # proxy_buffers 缓冲区
        proxy_buffers 8 8k;
        # 状态标记
        proxy_next_upstream http_404  http_500  http_502  http_503  http_504  http_403;
      }
  }
}

0.1、内置策略

0.1.1、轮询策略
  • 该策略就是服务器将每个前端请求按顺序(时间顺序和排列次序)逐一分配到不同的后端服务器节点。如果后端服务器出现问题,即down掉,那么就会被自动剔除。

如下:

upstream backend {
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
0.1.2、加权轮询策略
  • 该策略在基本的轮询策略基础上考虑各后端服务器节点接受请求的权重,指定各后端服务器节点被轮询到的机率,主要应用于后端服务器节点性能不均的情况。
  • 例如:通过直接配置weight来设置访问机率,weight的大小和访问比率成正比。
    下面三个服务器(如果不配置weight,则默认配置为weight=1),第一个的权重是1,第二个的权重是3,第三个的权重是5,那么这三个后端服务器被访问的比率是1:3:5,即server 10.1.0.103被访问的机率最高,server 10.1.0.102次之,server server 10.1.0.101访问的机率最小。

如下:

upstream backend {
server 10.1.0.101;
server 10.1.0.102  weight=3;
server 10.1.0.103  weight=5;
}
0.1.3、ip_hash策略
  • 该策略是将前端的访问IP进行hash操作,然后根据hash结果将请求分配到不同的后端服务器节点。这样会使得每个前端访问IP会固定访问一个后端服务器节点,好处是前端用户的session只在一个后端服务器节点上,不必考虑一个session存在多台服务器节点出现session贡献问题。
    例如:因为weight是内置,所以可以直接和其他策略配合使用。
upstream backend {
ip_hash;
server 10.1.0.101;
server 10.1.0.102  weight=3;
server 10.1.0.103  weight=5;
}
0.1.4、最少连接数
  • 基于最少连接的负载平衡是另一种简单的方法。顾名思义,此方法将请求定向到当时具有最少活动连接的服务器。对于请求有时可能需要更长时间才能完成的应用程序,它比循环法更有效。
upstream backend {
least_conn;
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}

0.2、扩展策略

0.2.1、url_hash策略
  • 该策略将前端请求的url地址进行hash操作,根据hash结果将请求定向到同一后端服务器节点上,后台服务器为缓存是比较有效。一般url_hash需要配合缓冲命中来使用。
upstream backend {
  server 10.1.0.101;
  server 10.1.0.102;
  server 10.1.0.103;
  hash $request_uri;
	hash_method crc32;
}
0.2.2、fair策略
  • 该策略请求转发到负载最小的后端服务器节点上。Nginx通过后端服务器节点对响应时间来判断负载情况,响应时间最短的节点负载就相对较轻,Nginx就会将前端请求转发到此后端服务器节点上。
upstream backend {
  server 10.1.0.101;
  server 10.1.0.102;
  server 10.1.0.103;
  fair;
}
0.2.3、Sticky策略
  • 该策略在多台服务器的环境下,为了确保一个客户端只和一台服务器通讯,它会保持长连接,并在结束会话后再次选择一个服务器,保证了压力均衡。
  • 注意:如果浏览器不支持cookie,那么sticky不生效,毕竟整个模块是给予cookie实现。Sticky模块和ip_hash模块不能够同时使用。
upstream backend {
  sticky;
  server 10.1.0.101;
  server 10.1.0.102;
  server 10.1.0.103;
}

upstream 参数说明

追加在upstream中server的ip配置后的参数:

  • 1.down:表示当前的server暂时不参与负载
  • 2.weight:默认为1.weight越大,负载的权重就越大。
  • 3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
  • 4.fail_timeout:max_fails次失败后,暂停的时间。
  • 5.backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
  • 6.keepalive:连接数(keepalive的值)指定了每个工作进程中保留的持续连接到nginx负载均衡器缓存的最大值。如果超过这个设置值的闲置进程想链接到nginx负载均衡器组,最先连接的将被关闭。
  • 7.location对URL进行匹配.可以进行重定向或者进行新的代理负载均衡

注:nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

1、负载均衡实践

  • 1.1、Nginx要实现负载均衡需要用到proxy_pass代理模块配置
  • 1.2、Nginx负载均衡与Nginx代理不同地方在于,Nginx的一个location仅能代理一台服务器,而Nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池.

2、负载均衡配置模块(proxy_pass)

# ngx_http_upstream_module

#语法
Syntax: upstream name { ... }
Default:    —
Context:    http

#例子
upstream [连接池的名称] {
  [存放的IP]
  server [ip1]:[端口] [分发策略];
  server [ip2]:[端口] [分发策略];
}

server {
  ... ...
  location / {
  	proxy_pass http://[连接池的名称] ;
  }
}

3、proxy_pass代理模块配置常用参数

3.1、添加发往后端服务器的请求头信息

语法:    proxy_set_header field value;
默认:    proxy_set_header Host $http_host;
proxy_set_header Connection close;
位置:    http, server, location

# 用户请求的时候HOST的值是game1.test.com, 那么代理服务会像后端传递请求的还是game1.test.com
proxy_set_header Host $http_host;

# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;

# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

3.2、代理到后端的TCP连接、响应、返回等超时时间

#nginx代理与后端服务器连接超时时间(代理连接超时)
语法: proxy_connect_timeout time;
默认: proxy_connect_timeout 60s;
位置: http, server, location

#nginx代理等待后端服务器的响应时间
语法:    proxy_read_timeout time;
默认:    proxy_read_timeout 60s;
位置:    http, server, location

#后端服务器数据回传给nginx代理超时时间
语法: proxy_send_timeout time;
默认: proxy_send_timeout 60s;
位置: http, server, location

3.3、proxy_buffer代理缓冲区

#nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
语法: proxy_buffering on | off;
默认: proxy_buffering on;
位置: http, server, location

#设置nginx代理保存用户头信息的缓冲区大小
语法: proxy_buffer_size size;
默认: proxy_buffer_size 4k|8k;
位置: http, server, location

#proxy_buffers 缓冲区
语法: proxy_buffers number size;
默认: proxy_buffers 8 4k|8k;
位置: http, server, location

3.4、实际负载均衡项目项目的参数配置

upstream load {
  server 39.108.93.110:80;
  server 47.75.66.116:80;
}

server {
  server_name load.ifanatic.cn;
  listen 80;

  location / {
    proxy_pass http://load;
    # 用户请求的时候HOST的值是game1.test.com, 那么代理服务会像后端传递请求的还是game1.test.com
    proxy_set_header Host $http_host;
    # 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
    proxy_set_header X-Real-IP $remote_addr;
    # 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # nginx代理与后端服务器连接超时时间(代理连接超时)
    proxy_connect_timeout 10s;
    # nginx代理等待后端服务器的响应时间
    proxy_read_timeout 10s;
    # 后端服务器数据回传给nginx代理超时时间
    proxy_send_timeout 10s;
    # nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传>给客户
    proxy_buffering on;
    # 设置nginx代理保存用户头信息的缓冲区大小
    proxy_buffer_size  8k;
    # proxy_buffers 缓冲区
    proxy_buffers 8 8k;
    # 状态标记
    proxy_next_upstream http_404  http_500  http_502  http_503  http_504  http_403  http_429;
    }
}

4、 查看常用配置参数

cat /etc/nginx/proxy_params

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

http://www.niftyadmin.cn/n/5281812.html

相关文章

AI 论文精读,中文视频讲解:剖析人工智能本质 | 开源日报 No.120

mli/paper-reading Stars: 21.8k License: Apache-2.0 深度学习论文精读是一个深度学习相关论文列表,包括计算机视觉、生成模型、自然语言处理等多个领域。 该项目的核心优势和特点包括: 提供了大量关于深度学习各领域热门文章内容对不同年份发表的有较…

分类分级数据统计

主题 本文主要分享一下,涉及到以下两种数据情况,如何写统计。 情况1:一个字段包含多个级别,例如:1,2,3 。这种情况如何转化为中文 情况2:如果将多个字段合并展示,例如:字段1和字段…

百年东芝“瞄准”汽车「芯」机遇

在汽车“新四化”大变革的驱动下,汽车半导体市场进入需求暴涨的新周期。 “智能电动汽车所需要的半导体种类和数量正在急剧增加。” 东芝电子分立器件应用技术部经理成栋表示,东芝电子正在加大汽车半导体市场的布局,从而满足汽车电动化、智能…

1.反射,泛型

1.2.1 反射机制 Java的反射机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象…

3.6 POD类型

所谓POD,全称为Plain Old Data,表示普通的旧数据类型,这种类型不存在C的虚函数和许捷诚等数据,体现了其与C的兼容,可以使用用最老的memcpy()函数进行复制,使用memset()进行初始化等。 一、POD类型的条件 …

第11章 GUI Page400~402 步骤二 画直线

运行效果: 源代码: /**************************************************************** Name: wxMyPainterApp.h* Purpose: Defines Application Class* Author: yanzhenxi (3065598272qq.com)* Created: 2023-12-21* Copyright: yanzhen…

Qt中字符串转换为JS的函数执行

简介 在 QML 中,将 JavaScript 字符串转换为函数通常涉及使用 Function 构造函数或 eval() 函数。但是,QML 的环境对 JavaScript 的支持有一定的限制,因此不是所有的 JavaScript 功能都可以在 QML 中直接使用。 以下介绍都是在Qt5.12.1…

nodejs微信小程序+python+PHP医院挂号系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…