一、upstream的作用:
upstream可使nginx跨越单机的限制,完成网络数据的接收、处理和转发
二、语法
upstream语法:
# nginx.conf:
http {
....
# 在配置文件的http下建立
upstream custName {
server address [parameters]
...
}
}
# upstream中server指令语法如下:
# address必选,可以是主机名、域名、ip或unix socket,也可以指定端口号。
# parameters是可选参数,可以是如下参数:
# down:表示当前server已停用
# backup:表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求。
# weight:表示当前server负载权重,权重越大被请求几率越大。默认是1.
# max_fails和fail_timeout:一般会关联使用,如果某台server在fail_timeout时间内出现了max_fails次连接失败,那么Nginx会认为其已经挂掉了,从而在fail_timeout时间内不再去请求它,fail_timeout默认是10s,max_fails默认是1,即默认情况是只要发生错误就认为服务器挂掉了,如果将max_fails设置为0,则表示取消这项检查。
# 示例:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
三、upstream基础设置:单个upstream用于自动负载均衡
自动负载均衡分配方式5种分配方式
其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式:
1、轮询
轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,
如果某个后端服务器down掉后,能自动剔除。
upstream backend {
server 192.168.1.101:8888;
server 192.168.1.102:8888;
server 192.168.1.103:8888;
}
2、weight
轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。
upstream backend {
server 192.168.1.101 weight=1;
server 192.168.1.102 weight=2;
server 192.168.1.103 weight=3;
}
3、ip_hash
每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,
这样每个访客会固定访问一个后端服务器,可以解决session一致问题。
upstream backend {
ip_hash;
server 192.168.1.101:7777;
server 192.168.1.102:8888;
server 192.168.1.103:9999;
}
4、fair
fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,
响应时间短即rt小的后端服务器优先分配请求。
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
fair;
}
5、url_hash
与ip_hash类似,但是按照访问url的hash结果来分配请求,
使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
hash $request_uri;
hash_method crc32;
}
其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。
四、使upstream在反向代理中生效
前面的upstream只是设置好了其选项,要使其生效,需要靠nginx反向代理功能。
# 和其他反向代理的用法基本一致。
# 被代理的地址直接使用:http://upstreamName,如下:
location /router/
{
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 以下可以解决只有一个合法的业务域名的问题(需结合上面的配置)
location /test/router
{
proxy_pass http: //www.xxx.com/router;
proxy_set_header Host $host;
proxy_set_header X - Real_IP $remote_addr;
proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for;
}
五、upstream分组,用于自定义负载均衡
upstream分组后,可以通过在location 中指定upstream分组,从而实现自定义负载均衡。
示例:nginx实现MySQL读写分离
一、nginx反向代理,读写分离
编辑conf/nginx.conf文件
# 设置权重weight
# 192.168.0.2 读操作
# 192.168.0.2 写操作
####读服务器组 B
upstream read {
server 192.168.0.1:88 weight=2 max_fails=2 fail_timeout=2;
server 192.168.0.2:88 weight=3 max_fails=2 fail_timeout=2;
}
####写服务器组 A
upstream write {
server 192.168.0.2:88;
server 127.0.0.1:80 backup;
}
二、配置接口server
server {
listen 80;
server_name www.xxx.com;
location / {
proxy_pass http://read;
if ( $request_method = "POST" ){ ####在这里判断用户是否执行的是写操作
proxy_pass http://write;
}
index index.html index.htm;
#nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 2s;
#nginx发送给上游服务器(真实访问的服务器)超时时间
proxy_send_timeout 2s;
#nginx接受上游服务器(真实访问的服务器)超时时间
proxy_read_timeout 2s;
}
}
注:此方法是通过POST/GET判断是否为读写,不一定准确。
同理,可以通过url等变量,来实现自定义。