nginx 反向代理

nginx 不仅仅是 web 服务器,也是强大的反向代理服务器,为了理解 nginx 反向代理/负载均衡,我们就必须清楚什么是反向代理

正向、反向代理

我们不讨论这么广,就以 http 正向代理、http 反向代理为例子进行讲解。

正向代理:我们平常所说的代理都是正向代理,客户端想要使用正向代理,就必须显式的配置软件来让它走代理
反向代理反向代理服务器对于客户端来说是透明的,客户端并不知道它正在访问一个代理服务器而不是一个真正的服务器。

特别的,如果是 http 代理(正向),那么客户端会改变 HTTP 头部信息,区别如下:

nginx 反向代理

我们先来个简单的,看看如何使用 nginx 来反向代理后端的 apache 服务器(127.0.0.1:8080);

nginx 配置

## 配置上游服务器组,并命名为 apache
upstream apache {
    server 127.0.0.1:8080;      # apache 监听地址
}

## 虚拟主机配置
server {
    listen       80;            # 监听端口
    server_name  rproxy.test;   # 监听域名

    # 匹配所有 url
    location / {
        proxy_pass          http://apache;          # 设置代理
        proxy_set_header    Host $host;             # 修改 Host 头域
        proxy_set_header    X-Real-IP $remote_addr; # 设置 X-Real-IP 头域(非标)
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Forwarded-For 头域
    }
}

## 三个头域的意义
# Host,指定访问哪个虚拟主机;如果后端服务器同一端口上有多个虚拟主机,则必须设置,否则后端服务器无法区分
# X-Real-IP,非标准头域,它的本意是记录客户端的真实 IP,但是如果有多级代理,从此头域获取的 IP 是代理服务器的
# X-Forwarded-For,标准头域,它有多个值,格式为: "X-Forwarded-For: Client, Proxy1, Proxy2, ...",记录整个代理链

apache 配置
其实 apache 不需要配置什么,顶多修改一下设置,用于从X-Forwarded-For头域中获取客户端 IP。

重载 nginx
nginx -t,先检查 nginx-configuration 正确性;
systemctl reload nginx.service,然后重载 nginx 配置文件;

测试 nginx 反代
echo "127.0.0.1 rproxy.test" >> /etc/hosts,添加 hosts 条目;
curl -i http://rproxy.test/,测试 nginx 反代。

nginx 负载均衡

不要被负载均衡这个词给吓到了,其实就是上面说的反向代理,只不过在上游服务器组中配置多个后端服务器而已;
默认是轮询算法,并且权重(权重数值越大被轮询到的几率就越高)都为 1,即平均分配来自 client 的 http 请求;

调度算法

  • rr,轮询(默认),nginx 接到一个客户端请求会按照给定的权重值轮询后端服务器,如果有服务器出现故障,nginx 会临时剔除它;
  • ip_hash,计算客户端 IP 的 hash 值,然后根据 hash 的不同分配给不同的服务器,因此同一个 IP 会固定访问一个服务器,可用于解决动态网页中的 session 共享问题;
  • url_hash,同 ip_hash,只不过是针对 url 的,固定 url 访问固定的一台服务器,nginx 默认不支持此算法,需安装第三方模块;
  • fair,这是一个更智能的负载均衡算法,它可以根据页面大小、加载延时来智能选择后端服务器,nginx 默认不支持此算法,需安装第三方模块。

状态参数

  • weight:设置当前 server 的权重值,默认为 1,weight 越大,负载的权重就越大;
  • down:表示当前 server 暂时不参与负载均衡;
  • backup:表示当前 server 是备用的,当所有非 backup 服务器都无法提供服务时才会使用它;
  • max_fails:设置当前服务器允许请求失败的最大次数,默认为 1(设为 0 表示关闭检查);当超过此值后,server 暂时失效;并返回 proxy_next_upstream 模块定义的错误;
  • fail_timeout:设置 server 在 max_fails 后的失效时间,通常和 max_fails 一起使用,默认超时时间为 10 秒;

当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weightbackup

配置例子