1.upstream模块
upstream模块介绍
Nginx的负载均衡功能依赖于ngx_http_upstream_module,所支持的代理方式有proxy_pass,fastcgi_pass,memcached_pass。
upstream模块例子:
upstream web_pools{
server 172.16.10.52:80 weight=1;
server 172.16.10.53:80 weight=3;
}
upstream模块应该放于http{}标签内
默认算法是wrr轮询
upstream内部参数说明:
参数 | 说明 |
---|---|
server 172.16.10.52:80 | server后面接需要代理的主机,可以不接端口号,默认是80 |
weight | 权重 |
backup | 当所用的RS失效后会启用它 |
max_fails=2 | 最大失败尝试次数,建议2-3次 |
fail_timeout=20 | 失败超时时间,默认是10s,常规业务一般设置为2-3秒 |
down | 表示服务不可用,一般配合ip_hash一起使用。 |
max_conns=number | 最大连接数目。 |
slow_start=time | 从不可用转换至可用的时间。 |
upstream调度算法:
1,rr轮询
类似于lvs的rr算法,如果后端服务器宕机(默认只监控80端口,如果后端报包502,404,403,503还是会返回错误给用户。),机器则会自动剔除。
2,weight权重
权重和访问轮询成正比,权重越大则转发请求越多。
配置:
server 192.168.10.10:80 weight=1;
3,ip_hash
每个请求按访问的ip的hash结果进行分配,只要hash值向同就会把相同的ip地址的请求分配到同一个服务端,该调度算法可以解决session共享问题,但是也有可能使请求分配不均匀,
注意:必须是最前端的服务器,多数情况下不能和weight,bakcup选项一起使用。(session共享问题可以通过设置单独存储session的存储来解决。)
配置:
ip_hash;
4,fair动态算法(三方),
按照后端服务器的响应时间来分配请求,响应时间短的优先分配,比上面算法更加智能的算法,这是Nginx的第三方算法,使用时必须下载upstream_fair模块。
配置:
fair;
5,url_hash(三方)
按照访问url的hash结果来分配请求,让每个url定到相同的服务器,后端服务器为缓存服务器时效果显著,在upstream加入hash语句,server不能写入weight等其他参数。
url_hash。按访问的url hash结果来分配请求,使每个url定向至特定的服务器,可以进一步提高后台缓存服务器的命中效率,nginx本身不支持这种,必须要安装nginx的hash软件包。
配置:
hash $request_url;
hash_method crc32;
2.ngx_http_proxy_module模块
参数 | 说明 |
---|---|
proxy_pass http://blog_server_pool | 指定反向代理服务池 |
proxy_set_header Host $host | 当后端web服务器上有多个虚拟主机时,需要用该header来区分主机名称。 |
proxy_set_header X-Real-IP $remote_addr; | 如果后端程序需要从用户获取IP,从该报文header获取。 |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for | 获取连接代理端的IP地址,多级代理中会有多个值,一般最前面的值时客户端IP地址 |
client_body_buffer_size | 用于指定客户端,请求主机缓冲区大小,可以理解为先保存至本地,再传给客户端。 |
proxy_connect_timeout | 表示和后端服务器连接的超时时间。 |
proxy_send_timeout | 后端服务器数据回传时间,即在规定时间内,后端必须传完所有数据,否则断开连接 |
proxy_buffer_size | 设置缓冲区大小,该缓冲区大小等于proxy_buffer设置的大小。 |
proxy_buffers | 设置缓冲区的数量的大小,nginx从代理的后端服务器获取的响应信息。 |
proxy_pass指令,此模块可以将请求发送至另外一台服务器,
配置:
location /name/ {
proxy_pass http://127.0.0.1/remote/;
}
proxy_pass参数说明:
参数 | 说明 |
---|---|
proxy_pass http://blog_server_pool | 指定反向代理服务池 |
proxy_set_header Host $host | 当后端web服务器上有多个虚拟主机时,需要用该header来区分主机名称。 |
proxy_set_header X-Real-IP $remote_addr; | 如果后端程序需要从用户获取IP,从该报文header获取。 |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for | 获取连接代理端的IP地址,多级代理中会有多个值,一般最前面的值时客户端IP地址 |
client_body_buffer_size | 用于指定客户端,请求主机缓冲区大小,可以理解为先保存至本地,再传给客户端。 |
proxy_connect_timeout | 表示和后端服务器连接的超时时间。 |
proxy_send_timeout | 后端服务器数据回传时间,即在规定时间内,后端必须传完所有数据,否则断开连接 |
proxy_buffer_size | 设置缓冲区大小,该缓冲区大小等于proxy_buffer设置的大小。 |
proxy_buffers | 设置缓冲区的数量的大小,nginx从代理的后端服务器获取的响应信息。 |
X-Real-IP和X-Forwarded-For 区别
X-Forwarded-For是一个可叠加的过程,后面的代理会把前面代理的IP加入X-Forwarded-For
X-Real-IP只是个变量会被替换
$remote_addr代表的是他的前面的代理服务器或者客户端的IP地址。
多重代理要想全面了解流程,需要打印日志下面的几个参数。
$remote_addr |$http_x_real_ip |$http_x_forwarded_for
下面有几个案例写的比较清晰,可以参考理解一下:
https://blog.csdn.net/broadview2006/article/details/54570943
配置例子:
location / {
proxy_pass http://localhost:8000
#判断请求出错,会咨询下一个服务器请求
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504
include proxy.conf;
}
[root@localhost conf]# cat proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
Nginx实现动静分离
方案一:
根据访问的url实现动静分离。
location /static/ {
}
location /dyamic/{
}
方案二:
根据扩展名称实现动静分离
location ~ .*\.(css|jpg|png|js|imag)
{
proxy_pass http://static_pools
}
根据使用客户端$http_user_agent,跳转不同试用页面页面
IE浏览器(MSIE),火狐(Firefox)。
if ($http_user_agent ~* “android”)
{
proxy_pass http://android_pools
}
if ($http_user_agent ~* “iphone”)
{
proxy_pass http://iphone_pools
}
参考链接:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass