我有一个简单的双节点服务器群集,在localhost:8001
和localhost:8002
上运行,使用NGINX进行负载平衡。以下是我nginx.conf
的http上下文。
http {
include mime.types;
default_type application/octet-stream;
upstream backend {
ip_hash;
server localhost:8001;
server localhost:8002;
}
log_format upstreamlog 'upstream: $upstream_addr: $request upstream-response-status: $upstream_status';
server {
listen 80;
listen [::]:80;
server_name localhost;
access_log logs/access.log upstreamlog;
location / {
proxy_pass http://backend/;
}
}
}
最初,对http://localhost/的所有请求都被重定向到在端口8001上运行的上游服务器。
- 记录
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET /favicon.ico HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET /favicon.ico HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET /favicon.ico HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET /favicon.ico HTTP/1.1 upstream-response-status: 200
----
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET /favicon.ico HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET /favicon.ico HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET /favicon.ico HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: 200
upstream: [::1]:8001: GET /favicon.ico HTTP/1.1 upstream-response-status: 200
现在,为了测试此设置的故障转移,我停止了在端口8001上运行的服务器。但是故障转移不起作用,所有后续请求也被转发到端口8001的服务器。
- 记录
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
----
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
----
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
upstream: [::1]:8001: GET / HTTP/1.1 upstream-response-status: -
upstream: [::1]:8001, 127.0.0.1:8001, [::1]:8002: GET / HTTP/1.1 upstream-response-status: 504, 504, 200
NGINX花了很长时间,大约3分钟,切换到8002端口的另一个节点。我在配置中缺少什么?我知道默认max_fails
为1
,fail_timeout
为10 seconds
。如何使NGINX切换到其他服务器节点,停机时间为零?
(注意:ip_hash
必须用于会话亲和力和其他目的)