最近实践中遇到了需要利用 nginx 进行反向代理服务器请求的需求,以前没怎么碰触过,因此花了1个多小时,快速阅览了一下nginx官网在反向代理服务中给出的基本定义:
说实话,官网给予的定义是精准的,但对于不是很了解 nginx 或者不太喜爱浪费脑细胞的童鞋来说,依旧还是云里雾里的将其定义为神仙级别的东西;
为此,今日闲来无事就把这一块进行一下总结和整理,方便自己以及有需要的人来参考:
由于本人的能力以及理解力的限制,以下的例子也只是完全结合 nginx官网中给予的定义来进行解释和整理,牛掰的大神可以完全忽略并藐视以后的所有内容了...
首先,若是要利用 nginx 做反向代理,就需要用到 ngx_stream_proxy_module 这个模块;
官网给出的解释:
The ngx_stream_proxy_module module (1.9.0) allows passing connections to another server over TCP and UNIX-domain sockets.
大概意思是说:这个 ngx_stream_proxy_module 允许在TCP和UNIX-domain Sockets之上连接到其它服务器。
那么也就是说, 只有用 ngx_stream_proxy_module 才能实现 nginx 反向代理了。
先看下面两个例子:
Example A:
proxy_pass http://www.xingzhi.com;
}
示例A 是通过域名方式进行反向的;
Example B:
proxy_pass http://192.168.1.152:15960;
}
示例B 则是通过IP进行反向的;
因此也就是说,要想通过Nginx进行反向代理的话,那么只有在配置文件中配置 proxy_pass 这节点才能够实现。
对此,nginx官网中也有给予 proxy_pass 响应的解释:
Sets the address of a proxied server. The address can be specified as a domain name or IP address, and a port:
大概意思是说:设置代理服务的地址.这个地址可以指定一个域名(domain)或IP地址和一个端口.
有时,我们不仅仅是需要设置好代理那么简单,可能还需要将通过代理请求过来的一些客户端信息传递给被代理的服务器,这个时候怎么办?
这个时候就需要用到 proxy_set_header 自定义header头来进行传送;
Example C
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #1
proxy_set_header Cookie $http_cookie; #2
proxy_set_header X-Real-IP $remote_addr; #3
}
示例C中的代码就是定义了,如何将真实header信息发送到被代理的服务器上,
#1 表示发送X-Forwarded-For(XFF, 通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。)
#2 表示发送产生的Cookie信息。
#3 表示发送客户端真实的IP地址。
注意:以上代码中的#以后的所有内容都表示被注视掉的内容。
当我们进行反向代理请求处理的时候,网站不想被一个客户端或者连接长时间的占用的时候,可以这样做:
Example D
server {
}
以上这段代码表示 超时时间处理为 10秒。proxy_timeout 给予的参数还可以是 10m 表示十分钟。
以上这些配置足以完成一个简单的反向代理功能,还有更多的高级配置可以查阅官网的说明;
附上一个完整示例,该配置采用分布式进行WEB集群反向代理:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_timeout 10s;
proxy_pass http://webserver;
}
upstream webserver {
server 192.168.0.2:8081 weight=4 max_fails=1 fail_timeout=10s;
server 192.168.0.3:8082 weight=4 max_fails=1 fail_timeout=10s;
server 192.168.0.4:8084 weight=4 max_fails=1 fail_timeout=10s;
}
提示:upstream webserver 是一组不同的WEB服务器或者集群服务器,它是以轮播模式进行代理请求的。
关于 upstream 可以参看官网中 ngx_http_upstream_module 的定义;