Nginx(3)---代理与负载均衡
一、代理简述
代理分为正向代理和反向代理,
正向代理:客户端与目标服务器之间增加一个代理服务器,客户端直接访问代理服务器,在由代理服务器访问目标服务器并返回客户端并返回 。比如夜深人静的时候访问的一些网站,其实就是代理服务器,一个代理服务器被封了还有另外的可以访问。主要用作屏蔽客户端IP、集中式缓存、解决客户端不能直连服务端的问题等,比如爬虫、FQ、maven 的nexus 服务。
反向代理:客户端访问目标服务器,在目标服务内部有一个统一接入网关将请求转发至后端真正处理的服务器并返回结果。主要用作屏蔽服务端内部实现、负载均衡、缓存。
二、Nginx代理配置
Nginx 代理只需要在 location 中配置proxy_pass 属性即可。其指向代理的服务器地址。
(本机环境准备一个tomcat服务启动)
server { #端口 listen 8079; #域名 server_name www.bluedarkni.com; #站点资源根目录 server中配置则所有location共享 root /website/test; #站点资源位置 location / { index index.html; } location /error { #alias 别名,匹配location的资源路径使用alias的值作为根 alias /website/test; index error.html; } #正向代理 location /proxy-baidu { #是否允许重定向 proxy_redirect off; #代理的域名最后一定要加上/ 否则启动的时候回报错 proxy_pass http://www.baidu.com/; } #反向代理 location /proxy-tomcat { proxy_redirect off; #本机的服务 proxy_pass http://127.0.0.1:8080/; } }
访问http://192.168.0.67:8079/proxy-tomcat 实际会访问到本机的tomcat服务
http://192.168.0.67:8079/proxy-baidu 实际会访问到百度服务
代理相关参数:
proxy_pass # 代理服务
proxy_redirect off; # 是否允许重定向
proxy_set_header Host $host; # 传 header 参数至后端服务
proxy_set_header X-Forwarded-For $remote_addr; # 设置request header 即客户端IP 地址
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;
参数详情:http://nginx.org/en/docs/http/ngx_http_proxy_module.html
三、负载均衡
通过proxy_pass 可以把请求代理至后端服务,但是为了实现更高的负载及性能, 我们的后端服务通常是多个, 这个是时候可以通过upstream 模块实现负载均衡。
准备另外的服务器。我这里准备的另外两台虚拟机启动了tomcat服务,修改了默认页面便于区分请求的是哪台机器。index页面内容“this is 192.168.0.xx”.
配置upstream 模块并且将location中的代理指向upstream 模块的值(tomcat-cluster):
配置如下:
http { include mime.types; default_type application/octet-stream; sendfile on; #资源从硬盘->内核态-应用态-网卡,开启之后:硬盘->内核态-网卡 keepalive_timeout 65; #长连接超时时间 #负载均衡集群配置 upstream tomcat-cluster { #只需要主机名和端口,不需要写协议 server 192.168.0.68:8080; server 192.168.0.69:8080; } #配置一个具体的站点server server { #端口 listen 8079; #域名 server_name www.bluedarkni.com; #站点资源根目录 server中配置则所有location共享 root /website/test; #站点资源位置 location / { index index.html; } location /error { #alias 别名,匹配location的资源路径使用alias的值作为根 alias /website/test; index error.html; } #正向代理 location /proxy-baidu { #是否允许重定向 proxy_redirect off; #代理的域名最后一定要加上/ 否则启动的时候回报错 proxy_pass http://www.baidu.com/; } #反向代理 location /proxy-tomcat { proxy_redirect off; #本机的服务 proxy_pass http://127.0.0.1:8080/; } location /tomcat { proxy_redirect off; #做负载均衡时,代理指向上面upstream属性的值 proxy_pass http://tomcat-cluster/; } } }
启动nginx服务,多次访问http://192.168.0.67:8079/tomcat
可以发现会轮询去访问到68和69两台服务器(默认的负载均衡策略是轮询)。
upstream 相关参数:
server 反向服务地址 加端口
weight 权重:服务都存活的情况下按权重来访问
upstream tomcat-cluster { server 192.168.0.68:8080 weight=3; server 192.168.0.69:8080 weight=1; }
max_fails 失败多少次 认为主机已挂掉则,踢出
fail_timeout 踢出后重新探测时间
backup 备用服务,其余节点都挂了才会使用
max_conns 允许最大连接数
slow_start 当节点恢复,不立即加入,而是等待 slow_start 后加入服务对列。
具体的各个模块的文档可以查看:http://nginx.org/en/docs/http/ngx_http_upstream_module.html
负载均衡算法:
1.轮询+权重(前面实现的就是轮询加权重)
2.ip_hash : (配置了ip_hash之后权重那些是失效的)基于Hash 计算 ,可以用于保持session 一至性。加入集群有3个节点,那么对IP进行hash之后%3,在去分发,这样同样的IP 就会请求到同一台机器上面,就不会出现分布式seesion问题,但是不推荐。现在很小区都是共用的一个对外IP,会导致这个小区所有的用户请求都分发到同一个节点上面去。而且如果这个这个节点挂了,那么这些用户的数据在其他节点上面是没有的。
upstream tomcat-cluster { #只需要主机名和端口,不需要写协议 ip_hash; server 192.168.0.68:8080 weight=3; server 192.168.0.69:8080 weight=1; }
配置好之后,重新加载配置之后,在请求http://192.168.0.67:8079/tomcat ,会发现只会访问到一台服务了。
3.least_conn 最少链接,谁连接最少就给谁。