但行好事
莫论前程❤

Nginx负载均衡和反向代理

负载均衡

​ 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求.均衡负载能够平均分配客户请求到服务器阵列,籍此快速获取重要数据,解决大量并发访问服务问题.这种集群技术可以用最少的投资获取接近于大型主机的性能.

反向代理

反向代理(Reverse Proxy)是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外表现为一个服务器.

​ 通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中.由于外部网络上的主机并不会配置并使用这个代理服务器,普通代理服务器也被设计为在Internet上搜寻多个不确定的服务器,而不是针对Internet上多个客户机的请求访问某一个固定的服务器,因此普通的Web代理服务器不支持外部对内部网络的访问请求.当一个代理服务器能够代理外部网络上的主机访问内部网络时,这种代理服务的方式被称之为反向代理服务.此时代理服务器对外就表现为一个Web服务器,外部网络就可以简单把它当做一个标准的Web服务器而不需要特定的配置.不同之处在于,这个服务器没有保存任何网页的真实数据,所有的静态网页或CGI程序,都保存在内部的Web服务器上.因此对反向代理服务器的攻击并不会使网页信息遭到破坏,这样就增强了Web服务器的安全性.

​ 反向代理方式和包过滤方式或普通代理方式并无冲突.因此可以在防火墙设备中同时使用这两种方式,其中反向代理用于外部网络访问内部网络时使用,正向代理或包过滤方式用于拒绝其他外部访问方式并提供内部网络对外 部网络的访问能力。因此可以结合这些方式提供最佳的安全访问方式。

正向代理和反向代理的区别  

正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。

  反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。

区别

  正向代理需要你主动设置代理服务器ip或者域名进行访问,由设置的服务器ip或者域名去获取访问内容并返回;而反向代理不需要你做任何设置,直接访问服务器真实ip或者域名,但是服务器内部会自动根据访问内容进行跳转及内容返回,你不知道它最终访问的是哪些机器。

  正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见;而反向代理是代理服务器端,为服务器收发请求,使真实服务器对客户端不可见。

  从上面的描述也能看得出来正向代理和反向代理最关键的两点区别:

  • 是否指定目标服务器
  • 客户端是否要做设置
    下面用一张图来表示两者的差异:

    img

    Nginx反向代理的配置文件

use nginx nginx;

worker_processes 10;

error_log  logs/error.log crit;

pid        logs/nginx.pid;

worker_rlimit_nofile 51200;

events{
    use epoll;
    worker_connections  51200;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # charset utf-8;

    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;

    sendfile on;
    #tcp_nopush on;

    keeplive_timeout 65;
    tcp_nodelay on;
    ...

    # 重点
    ## 配置上游服务器组,并命名为 apache
    upstream php_server_pool {
        server 127.0.0.1:80 weight=4 max_fails=2 fail_timeout=30s;     
        server 127.0.0.2:80 weight=4 max_fails=2 fail_timeout=30s;     
        server 127.0.0.3:80 weight=2 max_fails=2 fail_timeout=30s;     
    }

    upstream message_server_pool {
        server 127.0.0.4:3245;     
        server 127.0.0.5:3245 down;     
    }

    upstream bbs_server_pool {
        server 127.0.0.11:80 weight=1 max_fails=2 fail_timeout=30s;     
        server 127.0.0.12:80 weight=1 max_fails=2 fail_timeout=30s;     
        server 127.0.0.13:80 weight=1 max_fails=2 fail_timeout=30s;    
        server 127.0.0.13:80 weight=1 max_fails=2 fail_timeout=30s;    
    }

# 第一个虚拟主机,反向代理php_server_pool这组服务器.
## 虚拟主机配置
    server {
        listen       80;            # 监听端口
        server_name  www.yourdomain.com;   # 监听域名

        # 匹配所有 url
        location / {

            proxy_pass          http://php_server_pool;          # 设置代理
            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, ...",记录整个代理链

重载 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 请求;

upstream php_server_pool {
    server 127.0.0.1:8080;  # 服务器 1
    server 127.0.0.1:8081;  # 服务器 2
    server 127.0.0.1:8082;  # 服务器 3
}

调度算法

  • 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

配置例子

## rr 轮询,设置 weight
upstream httpd {
    server 127.0.0.1:8080 weight=1;
    server 127.0.0.1:8081 weight=1;
}

## rr 轮询,设置 weight、max_fails、fail_timeout
upstream httpd {
    server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=2;
    server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=2;
}

## rr 轮询,设置 weight、max_fails、fail_timeout、backup
upstream httpd {
    server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=2;
    server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=2;
    server 127.0.0.1:8082 backup;
}

## ip_hash,不能有 backup
upstream httpd {
    ip_hash;
    server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=2;
    server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=2;
    # server 127.0.0.1:8082 backup;
}
赞(1) 打赏
未经允许不得转载:刘鹏博客 » Nginx负载均衡和反向代理
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏