Nginx 请求重试(Nginx - Haproxy 组合)

vai*_*hav 5 nginx haproxy

我想问一下 Nginx 请求重试的问题。我在后端运行一个 Nginx,然后将请求发送到 HaProxy,然后 HaProxy 将其传递到 Web 服务器并处理请求。我正在动态重新加载我的 Haproxy 配置以提供弹性。问题是当我重新加载 Haproxy 时请求被丢弃。所以我想要一个可以从 Nginx 重试的解决方案。我查看了http模块中的proxy_connect_timeout、proxy_next_upstream以及服务器模块中的max_fails和fail_timeout。我最初在上游连接中只有 1 个服务器,所以我现在只增加了两次,并且更少的请求被丢弃(仅当)在上游中说同一个服务器两次,如果我有相同的服务器 3-4 倍,则丢弃增加)。

所以,首先我现在想要的是,当请求无法建立从 Nginx 到 Haproxy 的连接时,因此在重新加载时,连接似乎被视为错误,并且请求会立即被丢弃。

那么我怎样才能指定失败后我想重试从 Nginx 到上游的请求的时间,或者指定 Nginx 将其视为失败请求之前的时间。

(我尝试增加 proxy_connect_timeout - 没有帮助,mail_retires,fail_timeout 并且还放置了相同的上游服务器两次(到目前为止给出了最好的结果)

Nginx 配置文件

上游 gae_sleep {

server 128.111.55.219:10000;
Run Code Online (Sandbox Code Playgroud)

}

服务器 {

listen 8080;
server_name 128.111.55.219;
root /var/apps/sleep/app;
# Uncomment these lines to enable logging, and comment out the following two
#access_log  /var/log/nginx/sleep.access.log upstream;
error_log  /var/log/nginx/sleep.error.log;
access_log off;
#error_log /dev/null crit;

rewrite_log off;
error_page 404 = /404.html;
set $cache_dir /var/apps/sleep/cache;



location / {
  proxy_set_header  X-Real-IP  $remote_addr;
  proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_redirect off;
  proxy_pass http://gae_sleep;
  client_max_body_size 2G;
  proxy_connect_timeout 30;
  client_body_timeout 30;
  proxy_read_timeout 30;
}

location /404.html {
  root /var/apps/sleep;
}

location /reserved-channel-appscale-path {
  proxy_buffering off;
  tcp_nodelay on;
  keepalive_timeout 55;
  proxy_pass http://128.111.55.219:5280/http-bind;
}
Run Code Online (Sandbox Code Playgroud)

}

Wal*_*enL 0

不完全是你要问的,但也许更重要的是:你如何重新启动 HAProxy?使用 SF 选项,您应该能够重新启动 HAProxy,而不会丢弃任何连接请求。我不相信 nginx 可以重试请求,但如果您真的愿意,您可以拥有另一个 HAProxy 实例的 HAProxy 前端。然后 HAProxy 将重试向第二个实例发出的请求。但这似乎真的很愚蠢。首先检查 SF 选项。

重新启动 HAProxy 脚本(来自评论) grep 只是为了我温暖模糊的感觉:

#!/bin/sh

ps -ef | grep haproxy
haproxy -f haproxy.cfg -sf $(cat /var/run/haproxy.pid)
ps -ef | grep haproxy
Run Code Online (Sandbox Code Playgroud)