Nginx

使用 nginx 的主動/被動反向代理

  • February 20, 2015

我有兩台 Websocket 伺服器,它們使用Zookeeper&Curator作為主動/被動,如果一台伺服器出現故障,那麼第二個後端就會活躍起來。

我通過以下方式配置它:

upstream backend  {
 server 172.31.9.1:8080 max_fails=1 fail_timeout=5s;
 server 172.31.9.0:8080 max_fails=1 fail_timeout=5s;
}

server {
   listen 443;

   # host name to respond to
   server_name xxxxxx.compute.amazonaws.com;

   ssl on;
   ssl_certificate /etc/ssl/certs/wildcard.dev.xxxx.net.crt;
   ssl_certificate_key /etc/ssl/certs/wildcard.dev.xxxx.net.key;

   location / {
       # switch off logging
       access_log off;

       proxy_pass http://backend;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

       # WebSocket support (nginx 1.4)
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
   }
}

我期望的是當主動和被動伺服器交換位置時,Nginx 將需要 5 秒來辨識故障並將所有流量重定向到主動伺服器。

實際發生的情況是,辨識活動伺服器並切換所有流量最多需要 25 秒。

在實際場景中,我可以在重定向之間處理長達 10 秒的停機時間。

我錯過了什麼?

fail_timeout來自 NGINX 文件:

套:

  • 與伺服器通信的指定次數的不成功嘗試碰巧認為伺服器不可用的時間;
  • 以及伺服器將被視為不可用的時間段。

所以設置為 5 意味著總共 10 秒(5 超時,5 等待再次聯繫)

順便說一句,預設值max_fails已經是 1,所以你不需要設置它。


如果你真的想要一個主動/被動設置,你應該使用這個配置:

upstream backend  {
 server 172.31.9.1:8080;
 server 172.31.9.0:8080 backup;
}

引用自:https://serverfault.com/questions/669869