Nginx反向代理与负载均衡

时间:2022-03-27 13:25:39

一、简介

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

反向代理负载均衡技术是把将来自internet上的连接请求以反向代理的方式动态地转发给内部网络上的多台服务器进行处理,从而达到负载均衡的目的。

二、常见使用场景

1. 反向代理:(如图2-3所示)

Nginx反向代理与负载均衡

a. Web浏览器向前端Nginx发送HTTP请求

b. 如果请求的资源是静态资源,则前端Nginx服务器直接将静态资源返回给Web浏览器;

c. 如果请求的资源是动态页面,则前端Nginx服务器通过反向代理,将请求转发给上游服务器(Tomcat\Apache等),上游服务器处理完毕动态请求后返回给前端Nginx服务器,前端Nginx服务器再转发动态页面应答给Web浏览器

2. 负载均衡使用场景

当Nginx前端接收到大量的HTTP请求后,通过一定的策略,尽量把请求平均地分布到每台上游服务器上,以避免单个服务器被压爆。

Nginx反向代理与负载均衡

三、配置说明:

1. 负载均衡的基本配置

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

语法: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默认为10秒。

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

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

例如:

upstream backend{

      server backend1.example.com weight=5;

      server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;

      server unix:/tmp/backend3

}

3)ip_hash

语法:ip_hash

配置块:upstream

在有些场景下,我们可能会希望来自某一个用户的请求始终落到固定的一台上游服务器上。例如:假设上游服务器会缓存一些信息,如果同一个用户的请求任意地转发到集群中的任一台上游服务器上,那么每一台上游服务器都有可能会缓存同一份信息,这既会造成资源浪费,也会难以有效地管理缓存信息。ip_hash就是用以解决上述问题的。

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_status

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

$upstream_response_time

上游服务器的响应时间,精确到毫秒

$upstream_http_$HEADER

HTTP的头部,如upstream_http_host

2.反向代理的基本配置

1)proxy_pass

语法:proxy_pass URL;

配置块:location、if

此配置项将当前的请求反向代理到URL参数指定的服务器上,URL可以是主机名或IP地址端口形式,例如:

proxy_pass http://localhost:8000/uri/;

还可以直接使用upstream块,例如:

upstream backend{

            ……

      }

      server {

            location / {

            proxy_pass http://bakend

      }

}

默认情况下反向代理是不会转发请求中的host头部的。如果需要转发,那么必须加上配置:

proxy_set_headerHost $host;

2)proxy_method

语法:proxy_methodmethod

配置块:http、server、location

此配置项表示转发时的协议方法名。例如设置为:

proxy_method POST;

那么客户端发来的GET请求在转发时方法名也会改为POST。

3)proxy_hide_header

语法:proxy_hide_header the_header;

配置块:http、server、location

Nginx会将上游服务器的响应转发给客户端,但默认不会转发一下HTTP头部字段:Date、Server、X-Pad和X-Accel-*。使用proxy_hide_header后可以任意指定哪些HTTP头部字段不能被转发,例如:

proxy_hide_headerCache-Control;

proxy_hide_headerMicrosoftOfficeWebServer;

3)proxy_pass_header

语法:proxy_pass_headerthe_header;

配置块:http、server、location

与proxy_hide_header功能相反,proxy_pass_header会将原来禁止转发的header设置为允许转发。

4)proxy_pass_request_body

语法:proxy_pass_request_bodyon|off;

配置块:http、server、location

作用为确定是否向上游服务器转发HTTP包体部分。

5)proxy_pass_requst_headers

语法:proxy_pass_requst_headerson|off;

配置块:http、server、location

作用为确定是否向上游服务器转发HTTP头部。

6)proxy_redirect

语法:proxy_redirect[default|off|redirect replacement];

配置块:http、server、location

当上游服务器返回的响应是重定向或者刷新请求(如301或302),proxy_direct可以重设HTTP头部的location或refresh字段。例如:

proxy_direct http://localhost:8000/two http://frontend/one;

如果上游服务器发出的响应是302重定向请求,location字段的URL是http://localhost:8000/two/some/uri/,那么经过以上配置,实际转发给客户端的locationhttp://frontend/one/some/uri/

3.反向代理和负载均衡的配置实例文件

负载均衡:

 

worker_processes 1;

    events {

    worker_connections 1024;

    }

    http{

          upstream lxx {//默认是80端口

          server 192.168.0.62 weight=2;

          server 192.168.0.161 weight=3;

          }

          server {

                 listen 80;

                 location / {

                 proxy_pass http://lxx;

           }

     }

}

 

反向代理:

 

worker_processes 1;

      events {

      worker_connections 1024;

      }

      http{

            upstream lxx {//默认是80端口

            server 192.168.0.62 weight=2;

            server 192.168.0.161 weight=3;

      }

      server {

            listen 80;

            location / {

                  proxy_pass http://lxx;

                  #Proxy Settings

                  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;

                  proxy_next_upstream errortimeout invalid_header http_500 http_502 http_503 http_504;

                  proxy_max_temp_file_size 0;

                  proxy_connect_timeout 90;

                  proxy_send_timeout90;

                  proxy_read_timeout 90;

                  proxy_buffer_size 4k;

                  proxy_buffers 432k;

                  proxy_busy_buffers_size 64k;

                  proxy_temp_file_write_size 64k;

            }

      }

}