upstream backend { server backend1.example.com weight=5 max_fails=3 fail_timeout=30s; server backend2.example.com:8080; } server { location / { proxy_pass http://backend; } }
语法: server name [parameters]
weight=NUMBER :用于设置服务器的权重。如果没有设置,那么它将会等于1
max_fails=NUMBER:用于设置在一定的时间内对同一后台服务器进行尝试连接的次数,通过这个次数之后仍然没有连接成功,那么服务将会看做无效,如果没有设置改参数,尝试的次数是1,设置为0,将关闭检测
fail_timeout=TIME:用于设置客户端尝试连接后台服务器的时间,在这个时间内,可能会完成由max_fails设置的最多次数。如果没有设置改参数,那么默认是10秒
down:标记这台server将永久离线,通常和ip_hash一同使用
backup:它是一个备用的标志,即如果出现所有非备份服务器都宕机或繁忙无法接收连接时,才会使用本服务器,改参数无法和ip_hash一同使用
问题
如果我们在upstream中仅设置了一个server,那么Nginx会在内部变量中设置为1,这就意味着max_fails和fail_timeout将不会被处理
结果:如果Nginx不能连接到上游服务器,那么请求将会失败
解决:多次使用同一台服务器
upstream backend { server backend1.example.com weight=5; server backend1.example.com max_fails=3 fail_timeout=30s; server backend1.example.com; }
ip_hash
upstream backend { ip_hash; server backend1.example.com max_fails=3 fail_timeout=30s; server backend2.example.com down; }
如果使用了该指令,那么将会导致客户端的请求以客户端的ip地址分布在upstream中的server之间,它的关键技术在于对这个请求客户端ip地址进行哈希计算,这种方式保证了客户端总是能够传递到同一台后台服务器,但是如果该服务器被认定为无效,那么这个客户端的请求将会被传递到其他服务器。因此这种机制是一个高概率将客户端请求总是连接到同一台服务器
如果使用这个指令,就不能使用weight方法,如果一个upstream中指定一台s的erver,这个服务器需要移除,那么需要在该IP或者机器名之后添加down参数。