respons hulu di buffer ke file sementara

61

Saya memiliki aplikasi web yang agak besar dan lambat (data kompleks, antarmuka rumit) dibangun RoRdan dilayani Pumadengan nginxsebagai proxy terbalik. Melihat nginxlog kesalahan, saya melihat beberapa entri seperti:

2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file 
    /var/lib/nginx/proxy/8/47/0000038478 while reading upstream, 
    client: 5.144.169.242, server: engagement-console.foo.it, 
    request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0", 
    upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2", 
    host: "ec.reputationmonitor.it", 
    referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3"

Saya agak ingin tahu karena sangat tidak mungkin bahwa halaman tetap sama untuk pengguna yang berbeda dan interaksi pengguna yang berbeda, dan saya tidak akan berpikir bahwa buffering respon pada disk diperlukan / berguna.

Saya tahu tentang proxy_max_temp_file_sizedan mengaturnya ke 0, tetapi bagi saya agak canggung (proxy saya mencoba untuk buffer tetapi tidak memiliki file di mana buffer ke ... bagaimana bisa lebih cepat?).

Pertanyaan saya adalah:

  1. Bagaimana saya bisa menghapus [memperingatkan] dan menghindari tanggapan buffering? Apakah lebih baik mematikan proxy_bufferingatau mengatur proxy_max_temp_file_sizeke 0? Mengapa?

  2. Jika nginxmenyangga respons: Kapan respons melayani buffer, kepada siapa, dan mengapa?

  3. Mengapa nginxdihidupkan proxy_bufferingsecara default dan kemudian [memperingatkan] apakah Anda benar-benar memberikan respons?

  4. Kapan respons memicu opsi itu? Kapan dibutuhkan> beberapa detik (berapa banyak?) Untuk melayani tanggapan? Apakah ini dapat dikonfigurasi?

TIA, ngw.

ngw
sumber
1
Saya punya perasaan bahwa Anda membingungkan buffering dengan caching. Buffer adalah prosedur yang memungkinkan memuat lebih banyak data daripada yang diizinkan oleh alokasi memori.
Slavia

Jawaban:

75

1) Bagaimana saya bisa menghapus [memperingatkan] dan menghindari tanggapan buffering? Apakah lebih baik mematikan proxy_buffering atau mengatur proxy_max_temp_file_size ke 0? Mengapa?

Anda harus mengatur proxy_max_temp_file_sizeke 0 untuk menghapusnya. The proxy_bufferingdirektif tidak langsung berkaitan dengan peringatan. Anda dapat mematikannya untuk menghentikan buffering sama sekali tetapi itu tidak dianjurkan secara umum (kecuali jika diperlukan untuk Komet ).

2) Jika nginx memberikan respons, kapan ngguan melayani respons yang di-buffer, kepada siapa dan mengapa?

Ini server segera, tetapi klien biasanya memiliki koneksi yang lebih lambat dan tidak dapat mengkonsumsi data respons secepat yang dihasilkan oleh aplikasi Anda. Nginx mencoba untuk buffer seluruh respons untuk melepaskan aplikasi Anda ASAP.

Lihat juga: http://aosabook.org/en/nginx.html

3) Mengapa nginx mengaktifkan proxy_buffering secara default dan kemudian [memperingatkan] apakah Anda benar-benar memberikan respons?

Seperti yang sudah saya sebutkan, proxy_bufferingtidak secara langsung terkait dengan peringatan. Ini umumnya diperlukan untuk operasi proxy yang dioptimalkan dan mematikannya menurunkan kinerja dan throughput.

Nginx hanya memperingatkan Anda ketika respons tidak sesuai dengan buffer memori yang dikonfigurasi. Anda dapat mengabaikan peringatan itu jika tidak masalah untuk Anda.

4) Kapan respons memicu opsi itu? Kapan dibutuhkan> dari beberapa detik (berapa banyak?) Untuk melayani tanggapan? Apakah ini dapat dikonfigurasi?

Ini memicu ketika buffer memori penuh. Tolong, lihat dokumen, seluruh mekanisme dijelaskan: http://nginx.org/r/proxy_max_temp_file_size

Anda mungkin ingin menambah buffer memori.

VBart
sumber
5
Untuk # 1, bagaimana cara menghapus batas ukuran file sementara mencegah peringatan buffering? Saya rasa ini tidak benar karena saya menetapkan arahan ini ke 0 dan masih mendapatkan peringatan.
Phil
Jawaban ini tidak cukup jelas, adalah lebih baik untuk kinerja untuk mengatur proxy_max_temp_file_sizeuntuk 0atau ini hanya sebuah cara untuk menghapus peringatan itu?
Offir Pe'er
12

Konfigurasi berikut berfungsi dengan baik di server saya.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;
Haluk
sumber
2
Apakah arahan kedua berlebihan, yaitu 16kdi baris pertama melakukan persis sama dengan baris kedua?
EoghanM
1
@EoghanM menurut dokumen, tidak. Proxy_Buffer_size (buffer, bukan jamak) berlaku untuk bagian pertama dari respons server proxy (alias header) Sets the size of the buffer used for reading the first part of the response received from the proxied server. This part usually contains a small response header. Proxy_buffers adalah untuk sisa tanggapan.
cde
2
Anda telah menyelamatkan sebagian rambut saya hari ini. Saya memindahkan nginx dari server kami ke sebuah buruh pelabuhan kontainer dan mulai sangat lambat. Ini "memperbaiki" nya. Tidak yakin apakah versi di server kami telah mengaktifkan ini secara default atau tidak, tetapi yang ada di wadah pasti membutuhkan pengaturan ini.
Krystian