1、反向代理
可以说负载均衡是nginx的核心功能之一,而根据我的理解,反向代理则是实现负载均衡的手段。
要说反向代理,则自然要先说正向代理,正向代理指客户端经代理访问指定的服务器,而该服务器只能获取到代理服务器的信息,而无法得知是哪个客户端发出的请求,像是VPN就采用类似的形式。类似的,反向代理则是客户端访问代理服务器,代理服务器根据规则将请求转发给名下多台服务器中的任一服务器处理,而对于客户端来说,是哪一个服务器处理的请求,这是无法得知的。
nginx如何配置反向代理:
#http://192.168.1.5:10006的请求转发给服务器192.168.1.6处理
server{
listen 10006;
server_name localhost;
location / {
proxy_pass http://192.168.1.6;
}
}
#http://192.168.1.5:10007的请求转发给服务器192.168.1.7处理
server{
listen 10007;
server_name localhost;
location / {
proxy_pass http://192.168.1.7;
}
}
效果:
其他常用的反向代理指令
指令 | 说明 |
---|---|
proxy_set_header | 将客户端的请求发送给后端服务器之前,更改来自客户端的请求头信息 |
proxy_connect_timeout | 配置nginx与后端代理服务器尝试建立连接的超时时间 |
proxy_read_timeout | 配置nginx向后端服务器组发出read请求后,等待响应的超时时间 |
proxy_send_timeout | 配置nginx向后端服务器组发出write请求后,等待响应的超时时间 |
proxy_redirect | 用于修改后端服务器返回的响应头中的Location和Refresh |
2、负载均衡配置
负载均衡的策略有几种:一般轮询负载均衡、加权轮询负载均衡、ip_hash负载均衡、第三方模块负载均衡,这里会挨个说明。
一般轮询负载均衡)
server{
listen 8080;
server_name localhost;
location / {
proxy_pass http://web_server_group;
}
}
#配置负载均衡服务器组
upstream web_server_group{
server 192.168.1.6;
server 192.168.1.7;
}
访问http://192.168.1.5:8080/ 不断刷新,即可看到效果。
加权轮询负载均衡)
server{
listen 8080;
server_name localhost;
location / {
proxy_pass http://web_server_group;
}
}
upstream web_server_group{
server 192.168.1.6 weight=1;
server 192.168.1.7 weight=3;
}
经测试,刷新四次界面,有3次负载到192.168.1.7上,有1次负载到192.168.1.6上(注:并不是说负载到192.168.1.6之后就一定会连续3次负载到192.168.1.7,实际负载的时候是根据算法分散执行)。
除了weight表示权重的设置之外,还可以设定每台web服务器在负载均衡调度中的状态,如下:
配置项 | 说明 |
---|---|
max_fails | 允许请求失败的次数,默认为1。当超过此次数时,返回proxy_next_upstream指令定义的错误 |
fail_timeout | 在经历max_fails次失败后,暂停服务的时间。实际应用中max_fails常与此配置一起使用 |
backup | 预留的备份机器,当后台服务器暂停服务时,便启用该服务器为用户服务。 |
down | 表示此服务器暂不参与负载均衡 |
ip_hash负载均衡)
ip_hash方式的负载均衡,是将每个请求按照IP的hash结果分配,这样就可以使来自同一个IP的客户端用户固定访问一台web服务器,有效解决了动态网页存在的Session共享问题。
server{
listen 8080;
server_name localhost;
location / {
proxy_pass http://web_server_group;
}
}
upstream web_server_group{
ip_hash;
server 192.168.1.6;
server 192.168.1.7;
}
此负载方式不能使用weight和backup设置,而且可能会造成负载不均的问题。故建议只在必要情况下使用。
第三方模块负载均衡)
不同的第三方组件使用方式不一样,这里使用fair进行负载均衡。fair按照服务器的响应时间进行负载均衡,采用响应时间短的服务器优先的策略。
1)首先下载fair 下载地址
2)解压到根目录下,命名为nginx-upstream-fair
3)在nginx文件的解压目录下,重新编译安装nginx
./configure --prefix=/usr/local/nginx --with-http_ssl_module --add-module=/nginx-upstream-fair
make && make install
在安装的过程中出现了错误:error:‘ngx_http_upstream_srv_conf_t’ has no member named ‘default_port’
查阅了资料,应该是我用的nginx是最新版的原因,因为api有所变动而fair未及时更新导致的问题,有网友建议更改nginx的版本为旧版,以匹配fair,认真想了想,还是决定直接修改fair的代码,毕竟因为第三方组件的原因而使用旧版本nginx让人有种因噎废食的感觉(主要还是觉得重新安装nginx麻烦)。
要修改的文件是fair的ngx_http_upstream_fair_module.c文件,直接将里面的default_port改成80(只有两处需要修改),然后重新安装即可安装成功。
server{
listen 8080;
server_name localhost;
location / {
proxy_pass http://web_server_group;
}
}
#配置的时候加上fair指令即可
upstream web_server_group{
server 192.168.1.6;
server 192.168.1.7;
fair;
}
按理说测试该方法的效果,需要令其中一台服务器的响应时间延长,但是目前我的虚拟机上未安装任何后台语言的环境,为了测试此效果专门搭个环境未免太耗时间,这里就暂时不做响应时间的测试了,如果有朋友尝试此方法得到了结果欢迎与我分享。