nginx: Log lengkap permintaan / respons dengan semua tajuk?

44

Kami memiliki server aplikasi yang terkadang hang. Kami menduga itu karena permintaan yang buruk dari klien.

Bisakah nginx mencatat permintaan / respons lengkap (seperti tangkapan fiddler) ke file, sehingga kita dapat melihat permintaan yang dikirim sebelum hang?

(Kita mungkin perlu menghindari pcap dan pendekatan itu dan melakukan semuanya di nginx)

Jika nginx bukan alat yang tepat untuk ini, apa (selain penganalisa jaringan) yang mungkin?

samsmith
sumber
1
mitmproxy dalam mode proksi terbalik harus melakukan apa yang Anda cari.
Vivek Thomas
@VivekThomas ini adalah pertanyaan nginx .... kami sudah menggunakan nginx dan tidak akan berubah.
samsmith
3
@smithmith Pertanyaan lama, tapi mungkin ini membantu orang lain: Anda tidak harus menyerah nginx. Bergantung pada situasinya, Anda dapat merutekan kembali nginx ke port lain sementara, untuk memungkinkan mitmproxy untuk mencegat lalu lintas dan mendukung debugging. Kemudian, setelah selesai, Anda bisa merutekan kembali nginx ke port asli dan mematikan mitmproxy.
Per Lundberg
1
Anda dapat menggunakan modul modsecurity, yang dapat mencatat permintaan / tanggapan penuh, lihat nginx.com/blog/modsecurity-logging-and-debugging
Willem

Jawaban:

44

Untuk mendapatkan badan permintaan yang dikirim oleh pengunjung, gunakan client_body_in_file_only on;dan catat file "sementara" yang ditulisnya dalam log dengan menambahkan var $request_body_fileke format log. File "Sementara" akan ditempatkan di direktori client_temp secara default.

Anda juga dapat mencatat tajuk permintaan $http_<header>dan mengirim tajuk $sent_http_<header>.

Jika Anda memiliki badan dan tajuk permintaan, Anda harus dapat memutar ulang dan mendapatkan respons yang dimiliki pengunjung Anda.

Juga sesuatu seperti gor harus sangat dipertimbangkan sehingga Anda dapat memutar ulang lalu lintas di lingkungan lain di mana Anda dapat membiarkan nginx menulis file sementara ini tanpa menyebabkan masalah IO dalam produksi (nginx tidak akan membersihkannya dengan onnilai karena itu bukan "sementara" pada kasus ini).

Xavier Lucas
sumber
1
@ jwadsack Baca jawabannya dengan cermat.
Xavier Lucas
4
@ XavierLucas Saya pikir Anda memberikan dua pendekatan yang berbeda. Saya tidak menyadari Anda mengatakan keduanya client_body_in_file_only dan $http_<header>akan dibutuhkan. Saya mengerti sekarang.
jwadsack
5
Bisakah Anda membagikan kode yang lebih tepat?
Velkan
3
Tentunya $ http <header> hanya berguna jika Anda tahu semua nama header di muka
Ed Randall
2
Tolong, bisakah seseorang berbagi fragmen nginx config yang sebenarnya?
Sekarang,
17

mitmproxy tampaknya menjadi alat yang tepat untuk melakukan apa yang Anda minta.

mitmproxy adalah proxy man-in-the-middle proxy untuk HTTP yang interaktif dengan antarmuka konsol.

mitmdump adalah versi perintah-baris dari mitmproxy. Pikirkan tcpdump untuk HTTP.

fitur

  • Mencegah permintaan dan tanggapan HTTP dan memodifikasinya dengan cepat.
  • Simpan percakapan HTTP lengkap untuk replay dan analisis nanti.
  • Putar ulang sisi klien dari percakapan HTTP. Putar ulang respons HTTP dari server yang sebelumnya direkam.
  • Membalikkan mode proxy untuk meneruskan lalu lintas ke server yang ditentukan.
  • Mode proxy transparan pada OSX dan Linux.
  • Buat perubahan skrip pada lalu lintas HTTP menggunakan Python.
  • Sertifikat SSL untuk intersepsi dihasilkan dengan cepat.

Mode reverse proxy akan memungkinkan Anda menangkap permintaan dan respons seperti yang dilakukan Fiddler.

Vivek Thomas
sumber