일부 nginx 리버스 프록시 구성이 하루에 한 번 작동을 멈춤


12

외부 아마존 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에 이상한 것이 없습니다.

이것이 알려진 것입니까? 프록시 구성에 문제가 있습니까? 내가 볼 수있는 다른 로그가 있습니까?



답변:


22

이 질문에 대한 답변은 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;
    }
}

누구든지 어떤 버전의 nginx가 proxy_pass 설정에서 변수를 지원하는지 알고 있습니까? 나는 탄력있는 콩 줄기 (nginx 버전 1.6.2)를 시도하고 있는데 어쨌든 변수를 받아들이고 싶지 않습니다.
Stephen C

이것에 감사합니다. 문자 그대로 약 한 달 동안 미치게되었습니다!
Jim.R

nginx 블록 반복에 대한이 기사는이 구성도 반영합니다. nginx.com/blog/dns-service-discovery-nginx-plus
Morgan Christiansson

1

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 )

따라서 중단의 원인이 무엇이든간에 업스트림 팜에 배포하면 더 쉬운 설정으로 변환됩니다.


답장을 보내 주셔서 감사합니다! 이상한 점은 iginx가 아닌 백엔드 인스턴스에 직접 요청을 할 수 있다는 것입니다. nginx를 다시 시작하면 요청이 다시 프록시됩니다. 이것은 이미 프로덕션 환경에 있기 때문에 구성 중 하나가 "언로드"된 이유 또는 nginx가 실제로 무대 뒤에서 무엇을하는지 알 수있는 방법을 찾고 싶습니다.
user202172

더 많은 nginx 로깅 정보를 찾고 싶을 수도 있습니다. 이것은 더 알고 싶을 때 누군가가 당신처럼, 시도 문제이다 "간헐적 인 문제를 [...] 나는 프록시하고" stackoverflow.com/questions/9914792/... 그는 더 관련 로그를 잡아 당겨하는 방법을 설명합니다. 도움이 되길 바랍니다.
user18099
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.