Nginx代理与负载均衡

代理

代理有正向代理和反向代理。

image

正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

image

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

Nginx代理服务支持的协议

  • ngx_http_uwsgi_module模块 :支持Python
  • ngx_http_fastcgi_module模块 : 支持支持PHP
  • ngx_http_scgi_module模块 : 支持Java
  • ngx_http_v2_module模块 : 支持Golang
  • ngx_http_proxy_module模块 : 支持HTTP

Nginx反向代理

首先在虚拟机192.168.15.5自定义配置文件(/etc/nginx/conf.d/mario.conf)中加入以下配置;

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://192.168.15.7:80;
    }
}

反向代理的ip地址是192.168.15.7,因此启动此ip机器的nginx。以下是此ip地址机器的nginx配置及其mario文件目录;

image

image

启动完成后,使用浏览器访问192.168.15.5,反向代理成功。

image

Nginx代理常用参数

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

Syntax:     proxy_set_header field value;
Default:    proxy_set_header Host $http_host;
            proxy_set_header Connection close;
Context:    http, server, location

# 用户请求的时候HOST的值是linux.proxy.com, 那么代理服务会像后端传递请求的还是linux.proxy.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;

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

#nginx代理与后端服务器连接超时时间(代理连接超时)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location

#nginx代理等待后端服务器的响应时间
Syntax:    proxy_read_timeout time;
Default:    proxy_read_timeout 60s;
Context:    http, server, location

#后端服务器数据回传给nginx代理超时时间
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location

#################### example ########################
proxy_connect_timeout 1s;
proxy_read_timeout 3s;
proxy_send_timeout 3s;

3、代理缓冲区

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

#设置nginx代理保存用户头信息的缓冲区大小
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location

#proxy_buffers 缓冲区
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location

负载均衡

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。

image

负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。

负载均衡实现

# 1. 创建IP连接池
upstream [连接池名称] {
    server [ip]:[port];
    server [ip]:[port];
    server [ip]:[port];
}

# 2. 配置反向代理
server {
   listen 80;
   server_name _;
   location / {
        proxy_pass http://[连接池];
        # 以下代理参数可以写入参数文件/ect/nginx/proxy_params,通过include导入
        include /ect/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_connect_timeout 10s;
        # proxy_read_timeout 10s;
        # proxy_send_timeout 10s;
        # proxy_buffering on;
        # proxy_buffer_size 8k;
        # proxy_buffers 8 8k;
   }
}

负载均衡模式

以下例子前提条件: 在ip连接池中的三个服务器上皆有mario应用,并且目录中皆有web.html,文件中内容分别为web01、web02、web03。

轮询

# 默认情况下,Nginx负载均衡是轮询状态。
upstream mario {
    server 192.168.15.7:80;
    server 192.168.15.8:80;
    server 192.168.15.9:80;
}

访问http://192.168.15.5/web.html结果如下,

image

image

image

访问结果循环为web02 -> web01 -> web03,这便是负载均衡默认的轮询模式。

权重

在创建ip连接池的ip后添加weight=权重配置负载均衡的比例。

# Nginx中的权重0-100,数字越大,权重越高
upstream mario {
        server 192.168.15.7:80 weight=9;
        server 192.168.15.8:80 weight=5;
        server 192.168.15.9:80 weight=1;
}

以上的配置会明显导致访问192.168.15.7这台机器比例最高,192.168.15.9这台机器比例最小。

ip_hash

# 每一个IP固定访问某一个后端。
upstream mario {
    server 192.168.15.7:80;
    server 192.168.15.8:80;
    server 192.168.15.9:80;
    ip_hash;
}

以上配置在客户端第一次访问被分配到一个后端后,后续访问皆访问此后端。

负载均衡后端状态

状态 概述
down 当前的server暂时不参与负载均衡
backup 预留的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后, 服务暂停时间

down

配置 down 的 server 不参与负载均衡,即使其他 server 全部宕机也无用。以下配置表示只有192.168.15.8192.168.15.9参与负载均衡。

upstream mario {
    server 192.168.15.7:80 down;
    server 192.168.15.8:80;
    server 192.168.15.9:80;
}

backup

配置 backup 的 server 表示预留的备份服务器,当其他服务器全部宕机后才会分配给它。

upstream mario {
    server 192.168.15.7:80 backup;
    server 192.168.15.8:80;
    server 192.168.15.9:80;
}

max_fails、fail_timeout

一般 max_fails 和 fail_timeout 一起使用,并且在location中需要proxy_next_upstream模块配合使用。proxy_next_upstream是后端错误标识,负载均衡分配给指定的服务器报错到达max_fails阈值时,根据fail_timeout定义的时间内,此服务器不再参与负载均衡。

upstream mario {
    server 192.168.15.7:80 max_fails=3 fail_timeout=3s;
    server 192.168.15.8:80 max_fails=3 fail_timeout=3s;
    server 192.168.15.9:80 max_fails=3 fail_timeout=3s;
}

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://mario;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404;
        include /etc/nginx/proxy_params;
    }
}

proxy_next_upstream 支持的所有错误标识

error             # 与服务器建立连接,向其传递请求或读取响应头时发生错误;
timeout           # 在与服务器建立连接,向其传递请求或读取响应头时发生超时;
invalid_header    # 服务器返回空的或无效的响应;
http_500          # 服务器返回代码为500的响应;
http_502          # 服务器返回代码为502的响应;
http_503          # 服务器返回代码为503的响应;
http_504          # 服务器返回代码504的响应;
http_403          # 服务器返回代码为403的响应;
http_404          # 服务器返回代码为404的响应;
http_429          # 服务器返回代码为429的响应(1.11.13);
non_idempotent    # 通常,请求与 非幂等 方法(POST,LOCK,PATCH)不传递到请求是否已被发送到上游服务器(1.9.13)的下一个服务器; 启用此选项显式允许重试此类请求;
off               # 禁用将请求传递给下一个服务器。
posted @ 2022-01-06 19:58  它叫鸮  阅读(182)  评论(1编辑  收藏  举报