외부 아마존 ELB에서 내부 ELB로 요청을 프록시하는 nginx 리버스 프록시가 있습니다.
요청을 처리하는 6 개의 백엔드 인스턴스가 있습니다. 사이트 사용 구성은 다음과 같지만 포트 번호와 proxy_pass가 다릅니다. 다른 모든 것은 동일합니다.
server {
listen 3000;
location / {
proxy_pass http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000;
include /etc/nginx/proxy.conf;
}
}
약 24 시간마다 구성 중 하나가 작동을 멈 춥니 다. 다른 모든 프록시는 정상적으로 작동합니다. nginx를 다시 시작하면 모든 구성이 다시 작동합니다. error.log에는 액세스 로그, syslog 또는 dmesg에 이상한 것이 없습니다.
이것이 알려진 것입니까? 프록시 구성에 문제가 있습니까? 내가 볼 수있는 다른 로그가 있습니까?
답변
이 질문에 대한 답변은 ELB가 때때로 IP 주소를 변경하고 nginx가 시작 중에 이름을 확인한다는 것입니다.
이 문제를 해결하려면 VPC에 항상 0.2의 DNS 서버가 있습니다. 따라서 로컬 IP CIDR이 10.0.0.0/16이면 DNS 서버는 10.0.0.2입니다.
이것을 nginx 설정에 추가하십시오.
resolver 10.0.0.2 valid=10s;
proxy_pass도 변수로 정의해야합니다. 그렇지 않으면 nginx는 한 번만 해결합니다. 따라서 위의 구성을 기반으로 올바른 구성입니다.
server {
listen 3000;
location / {
resolver 10.0.0.2 valid=10s;
set $backend "http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000"
proxy_pass $backend;
include /etc/nginx/proxy.conf;
}
}
답변
proxy_pass가 예제 ( http://amazonaws.com ) 와 같이 하나의 URL로 직접 전달되지 않고 대신 다음과 같은 프록시 업스트림 팜으로 전달 된 경우 :
upstream my_upstream {
server1 127.0.0.1:1337;
server2 127.0.0.1:1338;
}
location / {
proxy_pass http://my_upstream;
}
그러면 업스트림 중 하나가 일시적으로 실패하는 것에 대해 걱정하지 않아도됩니다. 그들은 모두 같은 일을 할 것이기 때문입니다. 응답하지 않으면 다음 응답이 해당 응답에 프록시됩니다. 마음의 평화.
Nginx는 자동으로 x 초 동안 실패한 머신을 건너 뜁니다. 수리 할 때까지 또는 자체적으로 복구 될 때까지. ( http://wiki.nginx.org/HttpUpstreamModule )
따라서 중단의 원인이 무엇이든간에 업스트림 팜에 배포하면 더 쉬운 설정으로 변환됩니다.