Nginx反向代理与负载均衡

1.说明:

  • 正向代理:
    正向代理指的是客户端A为了向远端服务器C获取内容,先向代理服务器B发送一个(可能)指定目标C的请求,代理服务器B获取来自客户端A的请求后向远端服务器C发起请求,并将从C获得的数据转交给客户端A
    诸如科学上网工具SS就是基于正向代理/SOCKS5实现的。
    正向代理图示如下:

    Nginx反向代理与负载均衡_第1张图片
    图自网络

    基于上图,对于远端服务器来说,proxy和local处于同一个Lan中,所以此时local对于server是隐藏的。
    正向代理中,代理的是客户端,真实客户端对服务器不可见

  • 反向代理:
    反向代理指的是客户端A为了获取所需要的内容,向代理服务器B发起请求,B获取来自客户端A的请求后按照一定的规则向远端服务器C(或集群)获取A所需的内容,并返回给客户端A
    举个例子,各大运营商的服务电话就是很典型的反向代理:用户拨打客服电话,系统为用户分配一名客服专员,对于用户来说,并不关心最终接电话的客服是哪一位,只要能解决问题就可以,而对于客服系统内部成员,用户身份是明确的。
    反向代理图示如下:

    Nginx反向代理与负载均衡_第2张图片
    图自网络

    基于上图,对于客户端来说,proxy和server处于同一个Lan中,所以此时server对于local是隐藏的。
    反向代理中,代理的是服务器,真实服务器对客户端不可见

  • 负载均衡:
    相对而言,负载均衡的概念要好理解的多:在多个计算机(集群)、网络连接、CPU、磁碟驱动器或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
    简单来说,负责负载均衡的服务器将大量请求按照一定的规则或算法分配给服务器集群,从而避免了请求量过大时可能造成的各种问题。

结合反向代理X负载均衡的方式,一方面可以有效保护集群中的服务器,免于直接暴露在客户端的危险,另一方面有效缓解服务器压力,是时下最通用的优化策略之一。

2.使用:

以下代码在本人 nginx version: nginx/1.10.3 下可用,其它版本未知

  • 首先配置一个nginx的upstream作为负载均衡的服务器池:
upstream ng_angents{
    server 10.0.0.33:80;
    server 10.0.0.34:80;
    server 10.0.0.35:80;
    server 10.0.0.36:80;
}

关于 nginx upstream

upstream提供了多种针对负载均衡服务器池的分配方法可供选用,如轮询(默认)、weight(权重)、ip_hash(解决session问题)、fair(服务器响应时间)、url_hash(字面意思)等。

这里有一篇文章可供参考:nginx upstream的分配方式

需要注意的是,在upstream中加入hash语句,server语句中不能写入weight等其他的参数。

  • 配置nginx反向代理:
location /{
    # 关闭代理缓存
    proxy_buffering off;
    # 代理服务器集群
    proxy_pass http://ng_angents;
    # 代理服务器响应头
    proxy_redirect off;
    # 真实信息
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

关于 nginx proxy
以上内容根据实际需求灵活调整。

需要注意的是,配置反向代理时,反斜杠 "/" 的位置可能会影响代理解析结果,这里不再赘述。

  • 关于nginx keep-alive:

The first parameter assigns the timeout for keep-alive connections with the client. The server will close connections after this time.

keepalive_timeout在nginx中用于会话保持,即在指定时间内对于服务器的访问请求将被用于保持或刷新时效,直到没有新的请求并且时间结束为止。

keep-alive对于负载均衡的影响在于,对于单次的请求将会在keep-alive时效内被分发到同一台服务器上,可能会在某些场景下影响实际的业务需求,比如对于每一次请求的强制轮询或随机分发。

你可能感兴趣的:(Nginx反向代理与负载均衡)