nginx反向代理高级应用

nginx可以将客户的的请求转发至后端服务器但是无法转至特定一组的服务器,而且不能对后端服务器提供响应的服务器状态检测,但是Nginx可以基于ngx_http_upstream_module模块提供服务器分组、转发、权重分配、状态检测、调度算法等高级功能 upstream_module的官方文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.html

upstream

Syntax:	upstream name { ... }
Default:	—
Context:	http

定义一个服务器组,服务器可以监听在默认的端口上,服务器所监听的端口和unix-socket可以混合使用 Example:

upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;

    server backup1.example.com  backup;
}

在默认的情况下,用户请求会在所的服务器中轮询。在上面的例子中,如果有7个请求到达,那么第一个服务器会接受5个请求,第二服务接受一个请求,第三个服务器接受一个请求,第4台服务器做备用服务器不接受请求。如果一个请求无法被上面3台服务器所响应,则会由最后一台服务器响应。

server

Syntax:	server address [parameters];
Default:	—
Context:	upstream

定义服务器地址和相关的参数。地址可以是域名或者ip地址,加上一个端口,或者是unix-sock文件,使用unix-sock时需要在前面加上"unix:"字段。如果端口没有指定,那么将使用80端口。如果时域名将会被解析成ip地址。 paramerters定义:

weight=number #设置权重,默认为1。 
max_conns=number  #给当前server设置大活动链接数,默认为0表示没有限制。 
max_fails=number  #对后端服务器连续监测失败多少次就标记为不可用。
fail_timeout=time #对后端服务器的单次监测超时时间,默认为10秒。
backup  #设置为备份服务器,当所有服务器不可用时将重新启用次服务器。
down    #标记为down状态。 
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx

hash KEY consistent;

基于指定key做hash计算,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器 (如varnish)时使用,consistent定义使用一致性hash运算,一致性hash基于取模运算。 所谓取模运算,就是计算两个数相除之后的余数,比如10%7=3, 7%4=3

hash $request_uri consistent; #基于用户请求的uri做hash

ip hash;

源地址hash调度方法,基于的客户端的remote_addr(源地址)做hash计算,以实现会话保持

least_conn;

少连接调度算法,优先将客户端请求调度到当前连接少的后端服务器


以upstream 分组的方式实现http反向代理

nginx为反向代理服务器,2台apache为后端服务器主机

主机 IP
nginx 172.20.27.10
apahce1 172.20.27.20
apache2 172.20.27.21

反向代理端配置

1.在nginx配置文件中定义upstream分组,定义在http字段中

[root@nginx ~]# vim /apps/nginx/conf/nginx.conf
http {
        ......
    upstream app {
        server 172.20.27.21:80 weight=1 max_fails=3 fail_timeout=5s;
        server 172.20.27.20:80 weight=1 max_fails=3 fail_timeout=5s;
        #ip_hash;
        #根据源地址做hash,同一个地址来的请求发往后台同一台服务器
        #least_conn;
        #最少连接调度算法,将用户的请求发往后台连接数较少的服务器上
        #hash $request_uri connsistent;
        #当用户第一次访问某uri时,服务器对uri做hash,然后将其保存至缓存服务器,当有用户再次访问此uri时将直接访问缓存服务器
    } 

}

2.在配置文件中调用分组

[root@nginx ~]# vim /apps/nginx/conf/servers/vs.conf

server {
    server_name www.mylinuxops.com;
    listen 80;
    location /app {
        proxy_pass http://app;
        proxy_hide_header ETag;
        proxy_set_header X-Forwardde-For $remote_addr;
        #proxy_cache proxycache;
        #proxy_cache_key $request_uri;
        #proxy_cache_valid 200 302 301 307 1h;
        #proxy_cache_valid any 1m;
        #此处不开启缓存否则无法测试出是否轮询调度
    }
}

http服务器配置

1.安装httpd

yum install httpd -y

2.分别为每台http服务器创建测试页面 apache1

[root@apahce1 ~]# mkdir /var/www/html/app
[root@apahce1 ~]# echo 172.20.27.20 > /var/www/html/app/index.html

apache2

[root@apahce2 ~]# mkdir /var/www/html/app
[root@apahce2 ~]# echo 172.20.27.21 > /var/www/html/app/index.html

测试

对站点进行访问测试

[root@localhost ~]# curl -L www.mylinuxops.com/app/
172.20.27.20
[root@localhost ~]# curl -L www.mylinuxops.com/app/
172.20.27.21
[root@localhost ~]# curl -L www.mylinuxops.com/app/
172.20.27.20
[root@localhost ~]# curl -L www.mylinuxops.com/app/
172.20.27.21