之前一直觉的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了。
再附一张我们之前测试的一个案例: