Nginx反向代理与负载均衡应用实战(三)

一、Nginx负载均衡核心组件介绍

1、Nginx upstream 模块介绍

Nginx的负载均衡功能依赖于ngx_http_upstream_module模块,所支持的代理方式包括proxy_pass、fastcgi_pass、memcached_pass等。

2、upstream模块语法

upstream模块的语法相当简单。

基本的upstream配置:

upstream www_server_pools {  
             server 10.0.0.9:80  weight=1;
             server 10.0.0.10:80 weight=1;
    }

备注:www_server_pools作为upstream集群组的名字,可以自己起名字,调用的时候就用这个。

较完整的upstream配置案例:

upstream www_server_pools {  
             server 10.0.0.5; #这一行标签和下一行是等价的
             server 10.0.0.6:80  weight=1 max_fails=1 dail_timeout=10s;
             server 10.0.0.7:80 weight=1 max_fails=2 dail_timeout=20s backup;
             server 10.0.0.8:80 weight=1 max_fails=2 dail_timeout=20s backup;
    }

Nginx反向代理与负载均衡应用实战(三)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

二、Nginx负载均衡反向代理实践

1、利用upstream定义一组WWW服务器池

先定义一个名字为“www_server_pools”的服务池,里面有两台Web服务器

#这里定义web服务器池,包含了7,8两个web节点
    upstream www_server_pools {  
             server 10.0.0.7:80 weight=1;
             server 10.0.0.8:80 weight=1;

}

注意:默认调度算法是weighted round-robin,即权重轮询算法。

           upstream仅仅是定义服务器池,并不会直接处理用户请求,必须要有其它方式将请求转给这个服务器池才行.

           虽然定义的是WWW服务器池,但是这个服务器池也可以作为BBS等业务的服务器池。因为节点服务器的虚拟主机都是根据访问的主机头字段区分的。

2、配置WWW服务的虚拟主机Server负载代理

下面是Nginx反向代理WWW服务的虚拟主机配置:

Nginx反向代理与负载均衡应用实战(三)

三、反向代理多虚拟主机节点服务器企业案例

上一节代理的结果不对,究其原因是当用户访问域名是确实时携带了www.etiantian.org主机头请求Nginx反向代理服务器,但是反向代理向下面节点重新发起请求时,默认并没有在请求里告诉节点服务器要找那台虚拟机,所以WEB节点服务器接收到请求后发现没有主机头信息。因此就把节点服务器的第一个虚拟主机发给了反向代理。

解决这个问题的办法,就是当反向代理向后重新发起请求时,要携带主机头信息,以明确告诉节点服务器要找那个虚拟机。

具体的配置办法:proxy_set_header Host  $host;

在代理向后端服务器发送的http请求头中加入host字段信息后,若后端服务器配置有多个虚拟主机,他就可以识别代理的是那个虚拟机.这是节点服务器多虚拟机时的关键配置。

整个Nginx代理配置:

Nginx反向代理与负载均衡应用实战(三)

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    #这里定义web服务器池,包含了9,10两个web节点
    upstream www_server_pools {  
             server 10.0.0.7:80 weight=1;
             server 10.0.0.8:80 weight=1;
    }
    server {
        listen       80;
        server_name  www.etiantian.org;
        location / {
        proxy_pass http://www_server_pools;####访问www.etiantian.org,请求发送给www_server_pools里面的节点
        proxy_set_header Host $host;
        }
        access_log off;                     
    }   
}  

再次访问,访问的域名就可以就完全可以对应上了,这样代理多虚拟主机节点服务器就不会出现问题了。

解决:反向代理后的节点服务器记录用户IP企业案例

解决反向代理时,节点服务器获取用户真实IP的必要功能配置:

proxy_set_header  X-Forwarded-For  $remote_addr;

Nginx反向代理与负载均衡应用实战(三)

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    #这里定义web服务器池,包含了9,10两个web节点
    upstream www_server_pools {  
             server 10.0.0.7:80 weight=1;
             server 10.0.0.8:80 weight=1;
    }
    server {
        listen       80;
        server_name  www.etiantian.org;
        location / {
        proxy_pass http://www_server_pools;####访问www.etiantian.org,请求发送给www_server_pools里面的节点
        proxy_set_header Host $host;

proxy_set_header  X-Forwarded-For  $remote_addr;
        }
        access_log off;                     
    }   
}  

注意:修改完配置文件后重新启动加载。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

特别注意:虽然反向代理这块已经配置好了,但是节点服务器需要的访问日志如果要记录用户真实IP,还必须进行日志格式配置,这样才能把代理传过来的X-Forwarded-For头信息记录下来,具体配置为:

Nginx反向代理与负载均衡应用实战(三)

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent  "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"'; ##就是这个<$http_x_forwarded_for>参数,如果希望在第一行显示,可以替>换掉第一行$remote_addr变量,这个日志格式前面章节已经详细讲解了。

    }
    server {
        listen       80;
        server_name  www.etiantian.org;
        location / {
        proxy_pass http://www_server_pools;####访问www.etiantian.org,请求发送给www_server_pools里面的节点
        proxy_set_header Host $host;

proxy_set_header  X-Forwarded-For  $remote_addr;
        }
        access_log off;                     
    }