Haruskah saya mengaktifkan keepAlive di Apache2?

25

Dalam instalasi default apa pun, Apache 2 hadir dengan keepAlive off, tetapi ketika melihat server lain, modul keepAlive dihidupkan.

Jadi, bagaimana saya tahu jika keepAlive tepat untuk saya? Di mana saya dapat menemukan beberapa contoh bagus tentang konfigurasi ini?

Gabriel Sosa
sumber

Jawaban:

31

Sudah ada 2 jawaban bagus, tetapi masalah kehidupan nyata yang mungkin paling penting belum disebutkan.

Pertama, OP mungkin ingin membaca 2 jawaban sebelumnya dan posting blog kecil ini untuk memahami apa itu keepalives. (Penulis tidak merinci pada bagian tentang TCPI / IP mendapatkan "lebih cepat" semakin lama koneksi terbuka. Memang benar, koneksi yang lebih tahan lama mendapat manfaat dari penskalaan jendela IP , tetapi efeknya tidak signifikan kecuali file-file tersebut besar, atau produk bandwidth-delay terlalu besar.)

Argumen besar terhadap HTTP Keepalive saat menggunakan Apache adalah bahwa ia memblokir proses Apache. Yaitu klien menggunakan keepalives akan mencegah proses Apache 'nya' dari melayani klien lain, sampai klien menutup koneksi atau batas waktu tercapai. Dalam rentang waktu yang sama, instance Apache ini bisa melayani banyak koneksi lainnya.

Sekarang, konfigurasi Apache yang sangat umum adalah Prefork MPM dan interpreter PHP / Perl / Python, dan kode aplikasi dalam bahasa yang disebutkan. Dalam hal ini setiap proses Apache "berat" dalam arti bahwa ia menempati beberapa megabyte RAM (Apache terkait dengan penerjemah dan kode aplikasi). Ini, bersama dengan pemblokiran setiap instance Apache keepalive'd, tidak efisien.

Solusi umum adalah menggunakan 2 server Apache (baik pada server fisik yang sama, atau pada 2 server, sesuai kebutuhan) dengan konfigurasi yang berbeda:

  • satu "berat" dengan mod_php (atau bahasa pemrograman apa pun yang digunakan) untuk konten dinamis, dengan tetap mati .
  • satu "ringan" dengan satu set modul minimal, untuk menyajikan konten statis (gambar, css, js dll), dengan terus menyala .

Anda kemudian dapat memperluas pemisahan konten dinamis dan statis ini saat diperlukan , misalnya dengan:

  • menggunakan server berbasis peristiwa untuk konten statis, seperti nginx .
  • menggunakan CDN untuk konten statis (dapat melakukan semua konten statis untuk Anda)
  • menerapkan caching konten statis dan / atau dinamis

Pendekatan lain untuk menghindari pemblokiran Apache adalah dengan menggunakan penyeimbang beban dengan penanganan koneksi yang lebih cerdas, seperti Perlbal .

.. dan banyak lagi. :-)

Jesper M
sumber
2
Apakah jawaban ini masih relevan 8 tahun kemudian?
TheStoryCoder
Ya, masih relevan jika Anda menggunakan MPM prefork. Perhatikan bahwa Apache httpd 2.4 (mis. Dalam RHEL7) menggunakan KeepAlive On secara default (tetapi tidak secara eksplisit mencantumkannya dalam konfigurasinya - setidaknya dalam RHEL7).
Cameron Kerr
5

Keepalives bisa baik dalam beberapa kasus, mereka bisa sangat buruk dalam kasus lain. Mereka mengurangi waktu dan upaya untuk menyiapkan koneksi baru, tetapi mereka mengikat sumber daya server selama durasi timeout keepalive. Contoh:

  • Halaman dengan banyak objek kecil, klien dialup - keepalive seharusnya aktif.
  • Halaman dengan beberapa objek besar - keepalive tidak akan menjadi keuntungan.
  • Server dengan jumlah pengunjung unik yang sangat tinggi - keepalive harus dimatikan (jika tidak, soket dan utas akan tersimpan di memori menunggu waktu tunggu keepalive dan tidak melayani klien baru).

Seperti yang Anda lihat, KeepAliveTimeout juga akan memainkan peran besar dalam optimalisasi kinerja server Anda.

Lihatlah pola penggunaan Anda dan putuskan sendiri.

Max Alginin
sumber
0

Anda harus menggunakan KeepAlive On.

Lihat:

http://httpd.apache.org/docs/2.0/mod/core.html#keepalive

Dengan begitu koneksi TCP tunggal akan digunakan kembali oleh browser untuk mengirim beberapa permintaan. Biasanya situs web memiliki banyak komponen (halaman HTML, kode javascript, gambar). Selama sumber daya ini berada di domain yang sama, oleh karena itu dapat dilayani oleh server yang sama, koneksi KeepAlive memberikan dorongan besar dalam kinerja karena browser tidak perlu membuat koneksi TCP baru.

Browser biasanya membuka sekitar 3 koneksi paralel ke domain. Jadi katakanlah Anda memiliki 18 objek di situs Anda. Browser akan membuka 3 koneksi, dan itu akan mengunduh 6 objek di setiap koneksi - menggunakan mode KeepAlive. Tanpa KeepAlive, itu harus membuka 18 koneksi TCP, yang sangat lambat.

Sebagian besar, atau semua browser modern sesuai dengan HTTP / 1.1 jadi ini seharusnya hanya berfungsi.

Proxy HTTP tertentu seperti Squid tidak sesuai dengan HTTP / 1.1, tetapi mereka tetap meminta penggunaan koneksi KeepAlive.

Yves Junqueira
sumber
Ini hanya dari pertimbangan sisi klien, sementara saya kira penggunaan sumber daya sisi server juga penting.
Morgan Cheng
Penggunaan sumber daya sisi server lebih penting daripada latensi yang dirasakan pengguna?
Yves Junqueira
1
Saya juga percaya untuk mengaktifkan KeepAlive On, namun batas waktu default Apache selama 15 detik terlalu baik karena menjaga proses diblokir terlalu lama. Saya biasanya mengatur batas waktu menjadi sekitar 2 detik, yang menghasilkan KeepAlive yang digunakan selama sekitar satu pageload.
Martijn Heemels