Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
Nginx upstream bağlantı hatalarını araştırırken önce Nginx hata günlüğündeki tam mesajı bulun, ardından aynı upstream adresine Nginx dışından bağlanmayı deneyin. connect() failed, connection refused, timed out ve no live upstreams farklı arızalara işaret eder. Bağlantı testini Nginx ile aynı ağ ad alanından ve mümkün olduğunca aynı erişim koşullarından yapın. Aşağıdaki curl örnekleri HTTP upstream içindir; FastCGI/PHP-FPM portuna normal HTTP isteği göndermek geçerli bir FPM testi değildir. Yapılandırmayı nginx -t ile doğrulayın; başarılı testten sonra ilgili servisin çalıştığını, dinlediği adresi ve Nginx’in o adrese erişebildiğini kontrol edin.

Upstream hatası ne anlama gelir?​


Nginx, istemci isteğini uygulama sunucusuna veya başka bir HTTP servisine aktarıyorsa bu hedefe upstream denir. Örneğin Nginx 127.0.0.1:8080 üzerindeki uygulamaya bağlanamıyorsa istemciye genellikle 502 veya 504 döner. Hata kodu yalnızca sonucu gösterir; asıl ipucu yapılandırılmış error_log kaydındadır. /var/log/nginx/error.log yaygın bir yoldur; kurulumunuz dosyaya,stderr veya syslog’a yazıyor olabilir.

En sık görülen anlamlar şunlardır:

Tablodaki mesajı hata günlüğünde zaman aralığıyla birlikte arayın. Aynı dakikadaki access log kaydı, hatanın hangi URL ve istemci isteği sırasında oluştuğunu gösterir.

Uygulanabilir teşhis sırası​


Aşağıdaki örnekte upstream hedefi 127.0.0.1:8080 olarak varsayılmıştır. Kendi yapılandırmanızdaki adresi bunun yerine kullanın.

  1. Nginx yapılandırmasını test edin: sudo nginx -t. Başarı çıktısında yapılandırma sözdiziminin doğru olduğu belirtilir. Hata alırsanız reload yapmayın. Diskteki hatalı yeni yapılandırma ile hâlâ çalışan önceki yapılandırmayı ayırın; okuma yetkisi hatasını sözdizimi hatası sanmayın.
  2. Hata kaydını izleyin: sudo tail -n 50 /var/log/nginx/error.log. connect() failed, timed out veya host not found bölümünü tam olarak not alın. Mesajın yalnızca son kısmını değil, hedef adresi de kaydedin.
  3. Uygulama servisinin durumunu kontrol edin: sudo systemctl status uygulama-servisi. Servis yoksa veya durmuşsa sudo systemctl restart uygulama-servisi komutunu yalnızca uygulamanın normal başlatma prosedürünü biliyorsanız çalıştırın. Başlatma başarısızsa servis günlüğünü inceleyin; Nginx ayarını değiştirmek sorunu çözmez.
  4. Hedefin gerçekten dinlediğini kontrol edin: sudo ss -Hltnp 'sport = :8080'. Komut başarılı fakat satır yoksa incelenen ağ ad alanında bu TCP portu dinlenmiyordur. Uygulama başka bir portta dinliyorsa upstream tanımını ona göre düzeltin. Başka bir adrese bağlıysa Nginx’in kullandığı localhost ile aynı adres ailesine erişebildiğini doğrulayın.
  5. Nginx sunucusundan doğrudan istek gönderin: curl -i --max-time 5 http://127.0.0.1:8080/. HTTP yanıtı alırsanız curl işleminin temel ağ bağlantısı kuruluyor demektir; bu, Nginx worker’ın aynı izin/ağgüvenlik koşullarına sahip olduğunu kanıtlamaz. sonraki inceleme uygulamanın belirli URL’si, başlıkları, yetkilendirmesi veya yanıt süresidir. Connection refused alırsanız dinleme, servis veya port yanlıştır. Zaman aşımı alırsanız uygulama günlüğü, kaynak kullanımı ve bağımlı servisleri inceleyin.
  6. Düzeltmeden sonra tekrar sudo nginx -t çalıştırın ve başarılıysa sudo systemctl reload nginx uygulayın. Ardından aynı isteği dışarıdan tekrarlayıp access ve error log kayıtlarını birlikte karşılaştırın.

Günlük mesajıMuhtemel nedenİlk kontrolSonraki adım
connection refusedServis çalışmıyor veya port dinlenmiyorServis durumu ve dinleme portuUygulamayı başlatın ya da Nginx portunu düzeltin
upstream timed outServis yanıt vermiyor, aşırı yavaş veya ağ erişimi engelliYerel istek ve uygulama günlükleriYükü, bağımlılıkları ve uygun zaman aşımını inceleyin
host not found in upstreamAd çözümleme başarısız veya ad yanlışYapılandırmadaki hostname ve DNS çözümlemesiDoğru adı kullanın ve çözümlemeyi düzeltin
no live upstreamsSeçim için uygun hedef kalmamış; hedefler geçici olarak başarısız sayılmış veya down işaretli olabilirHer backend hedefini ayrı test edinÇalışmayan hedefi düzeltin veya havuzdan çıkarın

Somut yapılandırma örneği​


En küçük test senaryosu, Nginx’in yerel bir HTTP uygulamasına proxy geçmesidir. Aşağıdaki upstream ve server blokları ana yapılandırmanın http kapsamında yer alır; mevcut dosyanıza ikinci bir http bloğu kopyalamayın:

Kod:
upstream app_backend {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://app_backend;
    }
}

Bu yapılandırma nginx -t ile başarıyla doğrulanır ve 127.0.0.1:8080 isteği HTTP yanıtı verirse curl kullanan sürecin hedefe eriştiği anlaşılır. Son doğrulama, isteğin Nginx üzerinden geçmesi ve worker hata kaydında yeni bağlantı sorunu bulunmamasıdır. Başarı yoksa önce Nginx’i değil, 127.0.0.1:8080 üzerinde dinleyen uygulamayı ve onun günlüklerini düzeltin. Uygulama Unix socket kullanıyorsa port testi yerine socket dosyasının varlığını, sahipliğini ve Nginx çalışan kullanıcısının erişimini kontrol edin.

Sık yapılan hatalar​


Yalnızca 502 sayfasına bakmak: 502, bağlantının kurulamadığını veya geçersiz upstream yanıtı alındığını gösterebilir; kesin neden error log’dadır.

Nginx’in bulunduğu makineyi test etmemek: Kendi bilgisayarınızdan backend’e erişebilmeniz, Nginx sunucusunun erişebildiği anlamına gelmez. curl testini Nginx’in çalıştığı makinede yapın.

Yanlış portu düzeltmeye çalışmak: Uygulamanın gerçekten hangi adreste dinlediğini ss ile görmeden port değiştirmeyin. Container, proxy veya Unix socket kullanan yapılarda görünen servis portu ile Nginx hedefi farklı olabilir.

Zaman aşımını rastgele artırmak: Bu, yavaş veya kilitlenmiş uygulamayı gizleyebilir. Önce uygulamanın neden yanıt vermediğini belirleyin; süre ayarı ancak beklenen işlem süresi ve kaynak kullanımı anlaşıldıktan sonra ele alınmalıdır.

Sık sorulan sorular​


Terminalde curl çalışırken Nginx neden bağlanamıyor olabilir?​

Terminal kullanıcısı ile worker kullanıcısının izinleri, SELinux/AppArmor politikası veya ağ ad alanı farklı olabilir. Aynı IP/port ve protokolün kullanıldığını, Unix socket varsa dizin/socket erişimini ve hata mesajındaki permission denied ayrıntısını kontrol edin. Güvenlik politikasını tümden kapatmak yerine gereken dar erişimi düzeltin.

Birden fazla upstream sunucusundan yalnızca biri bozuksa ne yapılır?​

Her hedefe Nginx sunucusundan ayrı ayrı istek gönderin. Yalnızca bir hedef başarısızsa o hedefin servis, port ve ağ durumunu düzeltin; havuz davranışını değiştirerek arızayı gizlemeyin.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.