弹性搜索nginx代理超时

时间:2017-12-05 21:49:05

标签: amazon-web-services elasticsearch nginx proxy

"搜索1"是一个AWS弹性搜索服务。它有一个访问策略,只允许来自所选IP地址的流量。我的理解是AWS在VPC面前将其实现为ELB,我无法访问它。

" esproxy"是一个AWS EC2实例,用作search1的代理。在esproxy上,nginx被配置为需要(https)基本身份验证,并且任何具有该身份验证的内容都会被代理到search1。

有效。一段时间,几小时或一天。然后每个请求开始给出" 504网关超时"错误。 nginx仍会立即响应以发出401 auth所需的错误,但使用auth需要两分钟才能恢复超时。当发生这种情况并重新启动nginx时,这两方似乎都没有太多负载。实际上,通过代理的流量并不重,每天点击几千次。

尝试了解问题,我尝试使用openssl之类的telnet

openssl s_client -connect search1:443
[many ssl headers including certs shown rapidly]
GET / HTTP/1.1
Host: search1

HTTP/1.1 408 REQUEST_TIMEOUT
Content-Length:0
Connection: Close

这个408超时需要大约一分钟才能回复给我。 啊哈,我认为,此特定服务器正在发布。但后来我尝试了来自其他主机的openssl测试。同样的延迟。

然后我想,嘿,curl也可以测试https,现在我知道ssl层是snappy。好吧,curl访问工作,即使nginxopenssl在同一时间从esproxy超时。

所以我想,可能是关于标题的东西? curl的标题与我在openssl中输入的标题不同。

我修改了一个低级别的http / https工具,让我轻松发送特定的标题。我发现它似乎没有或额外的标题,但行结束。如果您使用DOS样式的行结尾(对HTTP规范更正)或Unix样式(不正确),nginx(和apache)并不在意。 search1实例(弹性搜索本身或ELB)显然非常关注。

在不了解nginx的情况下,我有以下几个问题:

  1. 我的代理超时源是否是一堆现有的连接遇到错误的请求行结尾?
    • 我怎么说?
    • 可能不是因为超时不同(一对二分钟)。
  2. 默认情况下nginx代理请求的行结尾是否正确?
    • 如果没有,可以强迫它吗?
  3. 如果行结尾是红色鲱鱼,我怎样才能让nginx帮助我解决这个问题?我在日志中看到的只是"上游超时(110:连接超时),同时从上游读取响应标题",这并没有提高我对该问题的理解。
  4. 我在调试中发现了这个问题: nginx close upstream connection after request 并且我已经修复了nginx conf以使用如此处所述的1.1代理。相关问题:

    upstream search1 {
      server search1-abcdefghijklmnopqrstuvwxyz.us-east-1.es.amazonaws.com:443;
    
      # number of connections to keep alive, not time
      keepalive 64;
    }
    
    location / {
      proxy_set_header   X-Forwarded-For $remote_addr;
      proxy_set_header   Host "search1-abcdefghijklmnopqrstuvwxyz.us-east-1.es.amazonaws.com"
      # must supress auth header from being forwarded
      proxy_set_header   Authorization "";
    
      # allow keep-alives on proxied connections
      proxy_http_version 1.1;
      proxy_set_header Connection "";
    
      proxy_pass         https://search1;
    }
    

0 个答案:

没有答案