之前一直觉的nginx的反向代理和负载均衡很厉害的样子,最近有机会接触了一下公司的这方面的技术,发现技术就是一张窗户纸呀,捅破了啥都明白了!

接下来先看一下nginx的反向代理:

简单的来说就是nginx不去自己处理php相关的请求,而是将php的相关的请求转发给apache来进行处理。

 

上面就是一个比较简单的一个反向代理的流程图,其实我们也可以叫做“动静分离”,只是反向代理更加的规范。

来看一下它的一个配置:

使用proxy_pass即可进行反向代理,官方给的说明例子:

1 Syntax:    proxy_pass URL;
2 Default:    —
3 Context:    location, if in location, limit_except

我们可以使用类似于下面的这种方法来进行配置:

1 location / {
2     proxy_pass http://127.0.0.1/remote/; --- http是必须要带的不然的话  是不会生效的
3 }

上面就是反向代理的一个简单的使用配置。

 

那接下来我们来看一下负载均衡的一个概念:

其实就是多台服务器进行共同工作,反向代理的后端如果有多台服务器,那自然可以形成负载均衡,但我们考虑一下proxpy_pass如何指向多台服务器?

那我们其实可以将多台的服务器用一个upstream 上游的服务器组指定绑定在一起并起个组名,然后使用proxpy_pass指向该组即可。

我们来看一下upstream的一个简单的定义:

1 Syntax:    upstream name { ... }
2 Default:    —
3 Context:    http

来看一下下面一个简单的例子:

 1 upstream backend {
 2      server backend1.example.com weight=5; //这台机器会承担5个请求,剩下的机器会承担剩余的请求压力
 3      server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
 4      server unix:/tmp/backend3;
 5  
 6      server backup1.example.com  backup;
 7  }
 8   
 9 server {
10     location / {
11         proxy_pass http://backend;
12     }
13 }

默认的均衡的算法很简单,就是针对后端服务器的顺序,逐个请求.

上面就是一个简单的负载均衡的一个例子。

那我们打开日志发现,$remot_addr变成了nginx的IP,而不是用户客户端的原来的IP,那这时候怎么办?

 

1 Proxy_set_header X-Forwarded-For  $remote_addr;

 

在每个location中加上这么一句话,就ok了。

 再附一张我们之前测试的一个案例:

posted on 2015-07-29 17:17  shangzekai  阅读(4967)  评论(0编辑  收藏  举报