NGINX: yukarı akıştan yanıt başlığını okurken yukarı akış zaman aşımına uğradı (110: Bağlantı zaman aşımına uğradı)


130

Yukarı akış uygulama sunucusu olarak Puma ve arka plan veritabanı kümem olarak Riak çalıştırıyorum. Yaklaşık 25 bin kullanıcı için bir veri yığınını eşleştiren ve bunu Riak'tan uygulamaya döndüren bir istek gönderdiğimde, Nginx günlüğünde bir hata alıyorum:

Yukarı akıştan yanıt üstbilgisini okurken yukarı akış zaman aşımına uğradı (110: Bağlantı zaman aşımına uğradı)

Yukarı akışımı doğrudan nginx proxy olmadan aynı istekle sorguladığımda gerekli verileri alırım.

Nginx zaman aşımı, proxy yerleştirildikten sonra gerçekleşir.

**nginx.conf**

http {
    keepalive_timeout 10m;
    proxy_connect_timeout  600s;
    proxy_send_timeout  600s;
    proxy_read_timeout  600s;
    fastcgi_send_timeout 600s;
    fastcgi_read_timeout 600s;
    include /etc/nginx/sites-enabled/*.conf;
}

**virtual host conf**

upstream ss_api {
  server 127.0.0.1:3000 max_fails=0  fail_timeout=600;
}

server {
  listen 81;
  server_name xxxxx.com; # change to match your URL

  location / {
    # match the name of upstream directive which is defined above
    proxy_pass http://ss_api; 
    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_cache cloud;
    proxy_cache_valid  200 302  60m;
    proxy_cache_valid  404      1m;
    proxy_cache_bypass $http_authorization;
    proxy_cache_bypass http://ss_api/account/;
    add_header X-Cache-Status $upstream_cache_status;
  }
}

Nginx'in bir sürü zaman aşımı yönergesi vardır. Önemli bir şeyi kaçırıp kaçırmadığımı bilmiyorum. Herhangi bir yardım çok takdir edilecektir ....


Sadece 600 saniye sonra zaman aşımına uğrayabilir mi? 127.0.0.1:3000 üzerinde sadece bağlantıları kabul eden ve onlarla hiçbir şey yapmayan, ne kadar sürdüğünü görmek için bir tcp sunucusu kurarak zamanını taklit edebilirsiniz. 600 olmalı ...
rogerdpack

Yanıtlar:


47

Bunun nedeni, yukarı akışınızın isteği yanıtlamak için çok fazla zaman alması ve NGINX'in yukarı akışın isteği işlerken zaten başarısız olduğunu düşünmesi ve bu nedenle bir hata ile yanıt vermesidir. locationYapılandırma bloğuna proxy_read_timeout ekleyin ve artırın . Aynı şey bana da oldu ve işte dahili bir uygulama için 1 saat zaman aşımı kullandım:

proxy_read_timeout 3600;

Bununla NGINX, yukarı akışının bir şey döndürmesi için bir saat (3600s) bekleyecektir.


6
Sahip unutmayın proxy_read_timeoutiçinde http bölümünde yardım olmayabilir. Ben proxy_passde yönergesi konumu bölümü ve sadece orada proxy_read_timeoutayar bir fark yarattı. (nginx
1.16.0

Benim için http / server / location içinde çalışıyor gibi görünüyor ... belki işler değişti :)
rogerdpack

39

Zaman aşımlarını artırmaktan her zaman kaçınmalısınız, arka uç sunucu yanıt sürenizin her durumda buradaki sorun olduğundan şüpheliyim.

Bu sorunu, bağlantı canlı tutma bayrağını temizleyerek ve buradaki yanıta göre http sürümünü belirterek aştım: https://stackoverflow.com/a/36589120/479632

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;

        # these two lines here
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        proxy_pass http://localhost:5000;
    }
}

Maalesef bunun neden işe yaradığını açıklayamıyorum ve yanıtta belirtilen belgelerden deşifre edemedi, bu yüzden herhangi birinin bir açıklaması varsa onu duymak isterim.


1
proxy_read_timeoutProxy'nin (belirli bir URL için bile olsa) daha fazla işlem süresi gerektirdiğini biliyorsanız neden ayarlamayasınız ?
Josh M.

Selam! Artık sorunun tam olarak ne olduğunu hatırlamıyorum ancak bunun url'nin gerçek zamanıyla ilgili olmadığını, bunun yerine zaman aşımının bu ayarlar olmadan doğru şekilde işlenmediğini düşünüyorum.
Almund

@magicbacon bu yıllar önceydi, bu yüzden davayı artık zar zor hatırlıyorum ama sen $http_hostdoğru mu değiştirdin ? Sanırım bu https için uçmaz. Https isteklerinde proxy yapmak için ek ayarlar gerekli olabilir.
Almund

+1 ... bu garip bir hack gibi görünüyor ama aslında bu resmi belgelerden :) nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive Biraz farklı bir sorunum var "yanıtı okurken yukarı akış erken kapalı bağlantı upstream yönergesini keepalive ile kullandığımda ve bu iki satırı kullandığımda upstream'den başlık "düzeltiyor gibi görünüyor.
Karussell

1
@TimDavis Anlıyorum, belki bu daha iyi. Sanırım trafiğe bağlı olabilir, bu
gönderide

26

İlk olarak nginx hata günlüğü dosyasına başvurarak hangi yukarı akışın yavaşladığını bulun ve benim durumumda okuma zaman aşımını buna göre ayarlayın, bu hızlı CGI idi

2017/09/27 13:34:03 [error] 16559#16559: *14381 upstream timed out (110: Connection timed out) while reading response header from upstream, client:xxxxxxxxxxxxxxxxxxxxxxxxx", upstream: "fastcgi://unix:/var/run/php/php5.6-fpm.sock", host: "xxxxxxxxxxxxxxx", referrer: "xxxxxxxxxxxxxxxxxxxx"

Bu yüzden sunucu yapılandırmamda fastcgi_read_timeout'u ayarlamam gerekiyor

 location ~ \.php$ {
     fastcgi_read_timeout 240;
     ...
 }

Bakın: orijinal gönderi


İşte zamanlama bilgisi eklemenin bir yolu, onu ne kadar yükseltmek için "ihtiyacınız olduğunu" görmeme hatası: stackoverflow.com/questions/18627469/… FWIW
rogerdpack

10

Sizin durumunuzda, proxy'de biraz optimizasyona yardımcı olur veya "# zaman aşımı ayarlarını" kullanabilirsiniz

location / 
{        

  # time out settings
  proxy_connect_timeout 159s;
  proxy_send_timeout   600;
  proxy_read_timeout   600;
  proxy_buffer_size    64k;
  proxy_buffers     16 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;
  proxy_pass_header Set-Cookie;
  proxy_redirect     off;
  proxy_hide_header  Vary;
  proxy_set_header   Accept-Encoding '';
  proxy_ignore_headers Cache-Control Expires;
  proxy_set_header   Referer $http_referer;
  proxy_set_header   Host   $host;
  proxy_set_header   Cookie $http_cookie;
  proxy_set_header   X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Benim için konum bölümünde bu ayarların olması bir fark yaratıyor . Onları http bölümünde bulundurmak yardımcı olmadı (muhtemelen konum bölümünde proxy_passde bulunduğum için .
JonnyJD

Bu bildirimlerle tam olarak neyi optimize ediyorsunuz?
Vlad

9

Bu hatanın çeşitli nedenlerle olabileceğini düşünüyorum, ancak kullandığınız modüle özel olabilir. Örneğin bunu uwsgi modülünü kullanarak gördüm, bu yüzden "uwsgi_read_timeout" u ayarlamak zorunda kaldım.


2
Sanırım uwsgi_read_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; benim için çalışıyor.
tyan


4

Diğerlerinin burada belirttiği gibi, NGINX için zaman aşımı ayarlarını artırmak sorununuzu çözebilir.

Ancak, zaman aşımı ayarlarınızı artırmak, bu yanıtların çoğunun önerdiği kadar kolay olmayabilir. Ben kendim bu sorunla karşılaştım ve /etc/nginx/nginx.conf dosyasındaki zaman aşımı ayarlarımı , bu iş parçacıklarındaki hemen hemen herkesin önerdiği gibi değiştirmeye çalıştım . Bu bana hiç yardımcı olmadı; NGINX'in zaman aşımı ayarlarında görünür bir değişiklik yoktu. Şimdi, saatler sonra nihayet bu sorunu çözmeyi başardım.

Çözüm bu forum başlığında yatıyor ve söylediği şey, zaman aşımı ayarlarınızı /etc/nginx/conf.d/timeout.conf içine koymanız gerektiğidir (ve bu dosya yoksa, onu oluşturmalısınız). Konu başlığında önerilenle aynı ayarları kullandım:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

1

Aynı sorunu yaşadım ve bunun raylar denetleyicisinde bir "her gün" hatasıyla sonuçlandı. Nedenini bilmiyorum ama üretimde puma, hatayı tekrar tekrar çalıştırarak şu mesaja neden oluyor:

Yukarı akıştan yanıt üstbilgisini okurken yukarı akış zaman aşımına uğradı (110: Bağlantı zaman aşımına uğradı)

Muhtemelen Nginx, verileri tekrar tekrar puma'dan almaya çalıştığı için. Komik olan şey, denetleyicide farklı bir eylem çağırıyor olsam bile hatanın zaman aşımı mesajına neden olması, bu nedenle tek bir yazım hatası tüm uygulamayı bloke ediyor.

Durumun bu olup olmadığını görmek için log / puma.stderr.log dosyanızı kontrol edin.


0

Bizim tarafımızdan proxy önbelleği ile spdy kullanıyordu. Önbelleğin süresi dolduğunda, önbellek güncellenene kadar bu hatayı alıyoruz.


0

Umarım birisine yardımcı olur: Bu hatayla karşılaştım ve nedeni phpfpm için günlük klasöründe yanlış izin oldu, değiştirdikten sonra phpfpm yazabilsin, her şey yolundaydı.


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.