"搜索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
访问工作,即使nginx
和openssl
在同一时间从esproxy超时。
所以我想,可能是关于标题的东西? curl
的标题与我在openssl
中输入的标题不同。
我修改了一个低级别的http / https工具,让我轻松发送特定的标题。我发现它似乎没有或额外的标题,但行结束。如果您使用DOS样式的行结尾(对HTTP规范更正)或Unix样式(不正确),nginx
(和apache
)并不在意。 search1实例(弹性搜索本身或ELB)显然非常关注。
在不了解nginx
的情况下,我有以下几个问题:
nginx
代理请求的行结尾是否正确?
nginx
帮助我解决这个问题?我在日志中看到的只是"上游超时(110:连接超时),同时从上游读取响应标题",这并没有提高我对该问题的理解。我在调试中发现了这个问题:
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;
}