Bazı nginx ters proxy yapılandırmaları günde bir kez çalışmayı durdurur


12

Bir dış amazon ELB'den dahili ELB'lere istekleri olan bir nginx ters proxy var.

İstekleri işleyen 6 arka uç örneğim var. Site etkin yapılandırmalar buna benzer, ancak farklı bağlantı noktası numaraları ve proxy_pass vardır. Diğer her şey aynı:

server {
    listen 3000;
    location / {
            proxy_pass http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000;
            include /etc/nginx/proxy.conf;
    }

}

Yaklaşık her 24 saatte bir yapılandırmalardan biri çalışmayı durdurur. Diğer tüm proxy'ler sorunsuz çalışır. Nginx'i yeniden başlatırsam tüm yapılandırmalar tekrar çalışır. Error.log dosyasında, erişim günlüğünde, syslog dosyasında veya dmesg'de tuhaf bir şey yoktur.

Bu bilinen bir şey mi? Proxy yapılandırmalarımda yanlış bir şey mi yaptım? Bakabileceğim başka günlükler var mı?



Yanıtlar:


22

Bu sorunun cevabı, ELB'lerin bazen ip adreslerini değiştirmesi ve nginx'in başlatma sırasında ad çözümlemesi yapmasıdır.

Bunu düzeltmek için VPC'nizde her zaman 0.2'de bir DNS sunucusu vardır. Yerel ip CIDR 10.0.0.0/16 ise DNS sunucusu 10.0.0.2'de.

Bunu nginx yapılandırmasına ekleyin.

resolver 10.0.0.2 valid=10s;

Proxy_pass öğesinin de bir değişken olarak tanımlanması gerekir, aksi takdirde nginx bunu yalnızca bir kez çözer. Yani yukarıdaki yapılandırmaya dayanarak bu doğru yapılandırmadır:

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;
    }
}

kimse proxy_pass ayarında nginx sürümünün değişkenleri desteklediğini biliyor mu? elastik beanstalk (nginx sürüm 1.6.2) üzerinde çalışıyorum ve zaten koymak değişken kabul etmek istemiyor.
Stephen C

Bunun için teşekkür ederim, tam anlamıyla bir aydır bizi deli ediyor!
Jim.R

Nginx bloğu tekrarlarıyla ilgili bu makale de bu yapılandırmayı yansıtıyor. nginx.com/blog/dns-service-discovery-nginx-plus
Morgan Christiansson

1

Proxy_pass'ınız, örneğin gösterdiği gibi bir URL'ye doğrudan geçmediyse ( http://amazonaws.com ), bunun yerine aşağıdaki gibi bir proxy yukarı akış grubuna geçmediyse :

upstream my_upstream {
 server1 127.0.0.1:1337;
 server2 127.0.0.1:1338; 
}
location / {
 proxy_pass         http://my_upstream;
}

Ardından, geçici olarak başarısız olan yukarı akışlardan biri hakkında daha az endişe duyarsınız. Çünkü hepsi aynı işi yapacak. Eğer biri cevap vermezse, bir sonraki cevap için proksiye edilir. İç huzur.

Nginx, arızalı bir makineyi otomatik olarak x saniye atlayacaktır. Tamir edene kadar veya kendi kendine dönene kadar. ( http://wiki.nginx.org/HttpUpstreamModule )

Kesintilerinizin nedeni ne olursa olsun, onları bir yukarı akış çiftliğine dağıtarak, daha kolay bir kuruluma dönüşür.


Cevabın için teşekkürler! Garip bir şey, doğrudan arka uç örneğine bir istek yapabilmem, ancak nginx aracılığıyla değil. Ben sadece nginx yeniden başlatmak eğer istek tekrar proxy. Bu zaten üretim ortamında olduğundan gerçekten yapılandırmalardan birinin neden "kaldırılmış" gibi göründüğünü veya nginx'in gerçekten perde arkasında ne yaptığını nasıl bulacağımı öğrenmek istiyorum.
user202172

O zaman daha fazla nginx günlük bilgisi avlamak isteyebilirsiniz. Bu, birisinin sizin gibi "aralıklı sorunlar [...] Proxy veriyorum" hakkında daha fazla bilgi edinmeye çalıştığı bir konudur stackoverflow.com/questions/9914792/… Daha alakalı günlükleri çekmenin bir yolunu tanımlar. Umarım yardımcı olur.
user18099
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.