目录

  • 介绍 反向代理
  • 负载均衡的基本配置
  • 1)upstream块
  • 2)server (upstream 中的server 配置项重点)
  • 3) ip_hash
  • 4)记录日志时支持的变量


介绍 反向代理

       反向代理(reverse proxy)方式是指用代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络中的上游服务器,并将从上游服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外的表现就是一个Web服务器。充当反向代理服务器也是Nginx的一种常见用法;

nginx proxy 请求添加前缀 nginx-proxy_服务器


       当客户端发来HTTP请求时,Nginx并不会立刻转发到上游服务器,而是先把用户的请求(包括HTTP包体)完整地接收到Nginx所在服务器的硬盘或者内存中,然后再向上游服务器发起连接,把缓存的客户端请求转发到上游服务器。而Squid等代理服务器则采用一边接收客户端请求,一边转发到上游服务器的方式。

(对于从上游服务器返回的内容,则不会先完整地缓存到nginx代理服务器再向客户端转发,而是边接收边转发)

Nginx的这种工作方式有什么优缺点呢?

很明显,缺点是延长了一个请求的处理时间,并增加了用于缓存请求内容的内存和磁盘空间。而优点则是降低了上游服务器的负载,尽量把压力放在Nginx服务器上。

负载均衡的基本配置

1)upstream块

       作为代理服务器,一般都需要向上游服务器的集群转发请求。这里的负载均衡是指选择一种策略,尽量把请求平均地分布到每一台上游服务器上。

语法: upstream name{…}
配置块: http
upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用

upstream backend {
     server backend1.example.com;
     server backend2.example.com;
     server backend3.example.com;
}
server {
     location / {
        proxy_pass http://backend;
     }
}

2)server (upstream 中的server 配置项重点)

语法: server name[parameters]
配置块: upstream


       server配置项指定了一台上游服务器的名字,这个名字可以是域名、IP地址端口、UNIX句柄等,在其后还可以跟下列参数。

参数

说明

·weight=number

设置向这台上游服务器转发的权重,默认为1。

·max_fails=number

该选项与fail_timeout配合使用,指在fail_timeout时间段内,如果向当前的上游服务器转发失败次数超过number,则认为在当前的fail_timeout时间段内这台上游服务器不可用。max_fails默认为1,如果设置为0,则表示不检查失败次数。

·fail_timeout=time

fail_timeout表示该时间段内转发失败多少次后就认为上游服务器暂时不可用,用于优化反向代理功能。它与向上游服务器建立连接的超时时间、读取上游服务器的响应超时时间等完全无关。fail_timeout默认为10秒

down

表示所在的上游服务器永久下线,只在使用ip_hash配置项时才有用。

backup

在使用ip_hash配置项时它是无效的。它表示所在的上游服务器只是备份服务器,只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求。

upstream backend {
     server backend1.example.com weight=5;//表示权重为5 默认为1
     server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;//tcp连接失败3次后 30s后才会重新转发请求到nginx 
     server unix:/tmp/backend3;
}

3) ip_hash

语法: ip_hash;
配置块: upstream

在有些场景下,我们可能会希望来自某一个用户的请求始终落到固定的一台上游服务器中。例如,假设上游服务器会缓存一些信息,如果同一个用户的请求任意地转发到集群中的任一台上游服务器中,那么每一台上游服务器都有可能会缓存同一份信息,这既会造成资源的浪费,也会难以有效地管理缓存信息。ip_hash就是用以解决上述问题的,它首先根据客户端的IP地址计算出一个key,将key按照upstream集群里的上游服务器数量进行取模,然后以取模后的结果把请求转发到相应的上游服务器中。这样就确保了同一个客户端的请求只会转发到指定的上游服务器中。
ip_hash与weight(权重)配置不可同时使用。如果upstream集群中有一台上游服务器暂时不可用,不能直接删除该配置,而是要down参数标识,确保转发策略的一贯性。例如:

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;//表示暂时下线
    server backend4.example.com;
}

4)记录日志时支持的变量

如果需要将负载时的一些信息记录到access_log日志中,那么在定义日志格式时可以使用负载均衡功能提供的变量

变量名

意义

$upstream_addr

处理上游请求的地址

$upstream_cache_status

表示是否命中缓存,取值范围:MISS、EXPIRED、UPDATING、STALE、HIT

$upstream_response_time

上游服务器的响应时间,进度到毫秒

$upstream_status

上游服务器返回的响应中的响应码

例如:

log_format timing '$remote_addr - $remote_user [$time_local] $request '
'upstream_response_time $upstream_response_time ' 'msec $msec request_time $request_time';
log_format up_head '$remote_addr - $remote_user [$time_local] $request '
'$upstream_addr $upstream_http_content_type';

效果:

nginx proxy 请求添加前缀 nginx-proxy_nginx_02


nginx proxy 请求添加前缀 nginx-proxy_nginx proxy 请求添加前缀_03