关于在使用Nginx反向代理设置ALB、S3等路由时出现499错误的事情

首先

みなさん、こんにちは。Nginxでリバースプロキシを立ててパスベースルーティングなどでALBやS3などのURLへ振り分け設定をしていたところ、Nginxが499を返してくるという事象が発生したので、今回はこちらの事象の原因と解決方法について紹介していきたいと思います。

499的发生原因是什么?

当事象发生时,反向代理的配置如下定义。然而,根据这个定义,我们发现在Nginx启动时,通过proxy_pass指定的URL进行名称解析,但之后会持续使用该IP地址,这是我们发现的其行为。

server {
    :
  (省略)
    :

  location /api/ {
    proxy_pass http://XXXXXXXX.ap-northeast-1.elb.amazonaws.com/;
  }
}

因此,由于某种原因,如ALB或S3的IP地址发生了更改,但是Nginx无法跟随这些更改,并继续将请求发送到旧的IP地址,导致返回499错误。

解决方法的意思是找到一种方式或途径来解决问题。

由于将名称解析限制在仅在Nginx启动时进行是问题的根源,因此可以通过定义resolver指令并使用valid选项适当调整缓存时间来解决这个问题。真是太好了。

server {
    :
  (省略)
    :

  location ~ /api/(.*) {
    resolver    ${NAMESERVER} valid=30s;
    set         $endpoint_url http://XXXXXXXX.ap-northeast-1.elb.amazonaws.com/;
    proxy_pass  $endpoint_url$1$is_args$args;
  }
}
使用set进行变量化的原因是,由于需要以变量的形式指定给proxy_pass,否则无法进行名称解析,所以我们使用set来进行变量化。
location和proxy_pass的指定值发生改变的原因是使用set将它变量化了,导致所有”/api/”之后的字符串都被忽略了,为了解决这个问题,我们改变了location和proxy_pass的指定值。

结束

如果您在使用Nginx设置反向代理时遇到原因不明的499错误,我建议您参考以下内容。以上是关于在使用Nginx反向代理配置ALB或S3路由时遇到的499错误的原因和解决方法的介绍。


    • AWS は、米国その他の諸国における Amazon.com, Inc. またはその関連会社の商標です。

 

    • NGINX は NGINX, Inc. の登録商標です。

 

    その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。
bannerAds