nginx的代理服务和负载均衡

发表时间:2017-07-18 21:30:29 浏览量( 40 ) 留言数( 0 )

学习目标:

1、搭建一个简易的代理服务

2、了解nginx的负载均衡原理

3、掌握搭建nginx代理服务器和负载均衡


学习过程:

一、反向代理服务器

    nginx 常常用来作为代理服务器,这代表着服务器接收请求,然后将它们传递给被代理服务器,得到请求的响应,再将它们发送给客户端。比如我们之前搭建了一个jetty服务器,配置的端口时8089,我们当然可以在浏览器上面直接访问jetty服务器,我们也可以使用nginx作为代理服务器。

    可能你会问为什么需要这样做呢?第一、上一节课讲了nginx作为静态服务器效率时比较高的。nginx可以处理图片文件或者静态html的请求,这样对jetty的压力就会比较小,而且效率也高,其他动态jsp等其他操作就可以交给jetty等被代理的服务器处理。第二、就是我们本节课讲的负载均衡和高可用性搭建了,这个我们后面再讲了。

server {

        listen       80;

        server_name  localhost;

        charset utf-8;

        access_log  logs/host.access.log  main;


        location / {       

                root /data/www;   

        }   

        location /images/ {       

                root /data/images;  

                autoindex on; 

        }


        location  /test{

            proxy_set_header        Host $host:$proxy_port;

            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_set_header        X-Real-IP $remote_addr; 

            proxy_pass http://localhost:8089/test;

            proxy_redirect default;

        }

}

    看上面的配置,前面的两个location都是上一节课的内容,重点就是第三个,这个配置的内容比较多,但是我们先重点关注proxy_pass属相放置已经添加被代理服务器的协议,名字和端口等参数的proxy_pass指令(在这里,就是http://localhost:8089/test)

它监听在80端口并且会映射所有的请求给 本地文件目录 /data/up1。创建该目录,然后添加 index.html 文件。注意,root 指令是放在 server 上下文中。当响应请求的 location 区块中,没有自己的 root 指令,上述的 root 指令才会被使用。 接着,使用前面章节中的 server 配置,然后将它改为一个代理服务配置。在第一个 location 区块中,放置已经添加被代理服务器的协议,名字和端口等参数的proxy_pass指令(在这里,就是 http://localhost:8089)。不用怀疑了,就是这么简单,这样你通过nginx的访问就会自动转到jetty的的地址了。比如你使用http://localhost/test就会映射到http://localhost:8089/test的路径了。

  为了更好的实现图片服务器。这里还是修改一下图片的location的配置。使他返回一些典型后缀的图片文件请求,现在它只会映射带有 /images/ 前缀的请求到 /data/images 目录下。修改后的 location 指令如下:

location ~ \.(gif|jpg|png)${

        root/data/images;

}

   该参数是一个正则表达式,它会匹配所有以 .gif,.jpg 或者 .png 结尾的 URIs。一个正则表达式需要以 ~ 开头。匹配到的请求会被映射到 /data/images 目录下。 当 nginx 在选择 location 去响应一个请求时,它会先检测带有前缀的 location 指令,记住先是检测带有最长前缀的 location,然后检测正则表达式。如果有一个正则的匹配的规则,nginx 会选择该 location,否则,会选择之前缓存的规则。 有关location的语法我们在后面会详细介绍。


二、负载均衡的使用

     前面我们讲了nginx只是代理了一个jetty服务器。但是再生产环境中为了保证服务能够24*7不宕机,必须保证高可用性,一台服务时不够的,就算不宕机我们也需要升级重启服务等操作,所以呢我们需要几个jetty服务器。但是对外知会提供一个入口,这时候nginx的作用就非常重要了。

    如果我们有三台电脑,分别部署了两个jetty的服务器和一个nginx服务器。如下图:


打开nginx.conf写入一下的配置:

    upstream TestUp{

        server run1.com:8081;

        server run2.com:8081;

        #server run3.com:8081;

        ip_hash;   

    }


    server {

        listen       80;

        server_name  localhost;

        charset utf-8;

        access_log  logs/host.access.log  main;

        location  /test{

            proxy_set_header        Host $host:$proxy_port;

            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_set_header        X-Real-IP $remote_addr;

            proxy_pass http://TestUp/test/;

            proxy_redirect default;

        }

   upstream 定义了需要代理的服务器地址。ip_hash时算法,我们后面再讲。然后在location的proxy_pass中使用了这个upstream。这样就完成了,是不是非常简答


三、nginx默认有集中负载均衡的算法

1、热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB.....

upstream mysvr { 

      server 127.0.0.1:7878; 

      server 192.168.10.121:3333 backup;  #热备     

    }


2、轮询:nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB....

upstream mysvr { 

      server 127.0.0.1:7878;

      server 192.168.10.121:3333;       

    }


3、加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB....

 upstream mysvr { 

      server 127.0.0.1:7878 weight=1;

      server 192.168.10.121:3333 weight=2;

}


4、ip_hash:nginx会让相同的客户端ip请求相同的服务器。

upstream mysvr { 

      server 127.0.0.1:7878; 

      server 192.168.10.121:3333;

      ip_hash;

    }

到这里你是不是感觉nginx的负载均衡配置特别简单与强大。

关于nginx负载均衡配置的几个状态参数讲解。

down,表示当前的server暂时不参与负载均衡。

backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。

max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

 upstream mysvr { 

      server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;

      server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;    

    }

到这里应该可以说nginx的内置负载均衡算法已经没有货啦。如果你像跟多更深入的了解nginx的负载均衡算法,nginx官方提供一些插件大家可以了解下。