NGINX: upstream timed out (110: Connection timed out) saat membaca header respon dari upstream

130

Saya menjalankan Puma sebagai server aplikasi upstream dan Riak sebagai cluster db latar belakang saya. Ketika saya mengirim permintaan bahwa peta-mengurangi sebagian data untuk sekitar 25K pengguna dan mengembalikannya dari Riak ke aplikasi, saya mendapatkan kesalahan di log Nginx:

upstream timed out (110: Connection timed out) saat membaca header respons dari upstream

Jika saya menanyakan upstream saya secara langsung tanpa proxy nginx, dengan permintaan yang sama, saya mendapatkan data yang diperlukan.

Batas waktu Nginx terjadi setelah proxy dimasukkan.

**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 memiliki banyak arahan batas waktu. Saya tidak tahu apakah saya melewatkan sesuatu yang penting. Bantuan apa pun akan sangat dihargai ....

pengguna2768537
sumber
Seharusnya hanya batas waktu setelah 600-an bukan? Anda dapat memalsukan waktunya dengan menyiapkan server tcp di 127.0.0.1:3000 yang hanya menerima koneksi dan tidak melakukan apa pun dengannya, untuk melihat berapa lama. Seharusnya 600-an ...
rogerdpack

Jawaban:

47

Ini terjadi karena upstream Anda membutuhkan terlalu banyak waktu untuk menjawab permintaan dan NGINX menganggap upstream telah gagal memproses permintaan, sehingga ia merespons dengan kesalahan. Cukup sertakan dan tingkatkan proxy_read_timeout di locationblok konfigurasi. Hal yang sama terjadi pada saya dan saya menggunakan waktu tunggu 1 jam untuk aplikasi internal di tempat kerja:

proxy_read_timeout 3600;

Dengan ini, NGINX akan menunggu selama satu jam (3600s) untuk upstreamnya mengembalikan sesuatu.

Sergio Gonzalez
sumber
6
Perhatikan bahwa memiliki proxy_read_timeoutbagian http mungkin tidak membantu. Saya memiliki proxy_passarahan di bagian lokasi dan hanya di sana proxy_read_timeoutpengaturannya membuat perbedaan. (nginx 1.16.0)
JonnyJD
Tampaknya berfungsi di http / server / lokasi bagi saya ... mungkin ada yang berubah :)
rogerdpack
39

Anda harus selalu menahan diri untuk tidak menambah waktu tunggu, saya ragu waktu respons server backend Anda adalah masalah di sini.

Saya mengatasi masalah ini dengan menghapus tanda koneksi tetap hidup dan menentukan versi http sesuai jawabannya di sini: 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;
    }
}

Sayangnya saya tidak dapat menjelaskan mengapa ini berhasil dan tidak berhasil menguraikannya dari dokumen yang disebutkan dalam jawaban yang ditautkan, jadi jika ada yang memiliki penjelasan, saya akan sangat tertarik untuk mendengarnya.

Almund
sumber
1
Mengapa Anda tidak menyesuaikan proxy_read_timeoutjika Anda tahu bahwa proxy (bahkan jika untuk URL tertentu) membutuhkan lebih banyak waktu pemrosesan?
Josh
Hai! Saya tidak ingat masalah sebenarnya lagi tetapi saya pikir itu tidak terkait dengan waktu sebenarnya untuk url melainkan karena batas waktu tidak diproses dengan benar tanpa pengaturan ini.
Almund
@magicbacon ini bertahun-tahun yang lalu jadi saya hampir tidak ingat kasusnya lagi tetapi, Anda mengubah $http_hosthak? Saya menduga itu tidak akan terbang untuk https. Mungkin pengaturan tambahan juga diperlukan untuk proxy permintaan https.
Almund
+1 ... ini terlihat seperti peretasan yang canggung tetapi sebenarnya ini dari dokumen resmi :) nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive Saya memiliki masalah yang sedikit berbeda "koneksi hulu yang ditutup sebelum waktunya saat membaca tanggapan header from upstream "ketika saya menggunakan arahan upstream dengan keepalive dan menggunakan dua baris ini tampaknya memperbaikinya.
Karussell
1
@TimDavis Saya mengerti, mungkin itu lebih baik. Saya kira itu mungkin tergantung pada lalu lintas, seperti di posting ini yang mengatakan itu diperlukan untuk WebSockets: serverlab.ca/tutorials/linux/web-servers-linux/…
Almund
26

Pertama cari tahu hulu mana yang melambat dengan berkonsultasi dengan file log kesalahan nginx dan menyesuaikan waktu baca yang sesuai dalam kasus saya itu fastCGI

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"

Jadi saya harus menyesuaikan fastcgi_read_timeout di konfigurasi server saya

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

Lihat: postingan asli

Kesabaran Ruberandinda
sumber
Berikut adalah cara untuk menambahkan info waktu kegagalan untuk melihat seberapa banyak Anda "perlu" untuk meningkatkannya menjadi: stackoverflow.com/questions/18627469/… FWIW
rogerdpack
10

Dalam kasus Anda, ini membantu sedikit pengoptimalan dalam proxy, atau Anda dapat menggunakan "# pengaturan waktu habis"

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;
}
Dimitrios
sumber
Bagi saya itu membuat perbedaan memiliki pengaturan ini di bagian lokasi . Memiliki mereka di bagian http tidak membantu (mungkin karena saya juga punya proxy_passdi bagian lokasi .
JonnyJD
Apa sebenarnya yang Anda optimalkan dengan deklarasi ini?
Vlad
9

Saya pikir kesalahan ini dapat terjadi karena berbagai alasan, tetapi ini bisa khusus untuk modul yang Anda gunakan. Misalnya saya melihat ini menggunakan modul uwsgi, jadi harus menyetel "uwsgi_read_timeout".

Richard
sumber
2
Saya pikir uwsgi_read_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; bekerja untuk saya.
tyan
9

Saya akan merekomendasikan untuk melihat error_logs, khususnya di bagian hulu di mana ia menunjukkan hulu spesifik yang waktu habis.

Kemudian berdasarkan itu Anda dapat menyesuaikan proxy_read_timeout, fastcgi_read_timeoutatau uwsgi_read_timeout.

Juga pastikan konfigurasi Anda dimuat.

Detail lebih lanjut di sini Nginx upstream habis (mengapa dan bagaimana memperbaikinya)

gansbrest
sumber
4

Seperti yang telah ditunjukkan banyak orang di sini, meningkatkan pengaturan waktu tunggu untuk NGINX dapat menyelesaikan masalah Anda.

Namun, meningkatkan pengaturan waktu tunggu Anda mungkin tidak semudah yang disarankan oleh banyak dari jawaban ini. Saya sendiri menghadapi masalah ini dan mencoba mengubah pengaturan batas waktu saya di file /etc/nginx/nginx.conf , seperti yang disarankan oleh hampir semua orang di utas ini. Ini tidak membantu saya sedikit pun; tidak ada perubahan yang jelas dalam pengaturan batas waktu NGINX. Sekarang, beberapa jam kemudian, saya akhirnya berhasil memperbaiki masalah ini.

Solusinya terletak pada utas forum ini , dan yang dikatakannya adalah Anda harus meletakkan pengaturan batas waktu di /etc/nginx/conf.d/timeout.conf (dan jika file ini tidak ada, Anda harus membuatnya). Saya menggunakan pengaturan yang sama seperti yang disarankan di utas:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
Andreas Forslöw
sumber
1

Saya memiliki masalah yang sama dan menghasilkan kesalahan "setiap hari" di pengontrol rel. Saya tidak tahu mengapa, tetapi dalam produksi, puma menjalankan kesalahan berulang kali menyebabkan pesan:

upstream timed out (110: Connection timed out) saat membaca header respons dari upstream

Mungkin karena Nginx mencoba mendapatkan data dari puma berulang kali. Lucunya, error tersebut menyebabkan pesan batas waktu meskipun saya memanggil tindakan yang berbeda di pengontrol, jadi, satu kesalahan ketik memblokir semua aplikasi.

Periksa file log / puma.stderr.log Anda untuk melihat apakah situasinya.

aarkerio
sumber
0

Dari sisi kami menggunakan spdy dengan cache proxy. Ketika cache kedaluwarsa kami mendapatkan kesalahan ini sampai cache telah diperbarui.

timhaak
sumber
0

Semoga ini membantu seseorang: Saya mengalami kesalahan ini dan penyebabnya adalah izin yang salah pada folder log untuk phpfpm, setelah mengubahnya sehingga phpfpm dapat menulis ke sana, semuanya baik-baik saja.

Maurício Otta
sumber
0

Untuk proxy_upstreamwaktu tunggu, saya mencoba pengaturan di atas tetapi ini tidak berhasil.

Pengaturan resolver_timeoutberfungsi untuk saya, karena saya tahu bahwa perlu waktu 30 detik untuk menghasilkan pesan batas waktu upstream. Misalnya me.atwibble.com tidak dapat diselesaikan (110: Operasi habis waktunya) .

http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver_timeout

David Mercer
sumber