Hal pertama:cari tahu dari mana permintaan ini berasal. Itu harus merupakan proses lokal, tidak ada lagi yang mungkin dapat memalsukan jabat tangan TCP pada platform Linux modern (tidak ada, yaitu, yang kemudian akan buang suatu prestasi dalam meminta gambar acak).
Jika ada URL berulang, Anda dapat membayanginya di balik RewriteRule
sehingga permintaan semacam itu akan benar-benar memicu skrip . Dalam skrip Anda dapat menjalankan pemeriksaan tambahan untuk melihat apakah permintaan itu sah (dan Anda kemudian akan menampilkan header yang tepat seolah-olah itu adalah gambar yang diharapkan oleh klien yang sah), atau jika itu adalah salah satu permintaan palsu. Terhadap permintaan palsu Anda dapat login mis. pelabuhan masuk. Berbekal itu, Anda dapat meminta netstat
dan cari tahu prosesnya. Anda juga dapat menjalankan ps
dan periksa semua proses aktif dalam sekejap permintaan palsu.
Saya cukup yakin bahwa pelakunya akan terbukti menjadi Apache itu sendiri (Saya pernah memiliki skrip "cache priming" yang nakal karena modifikasi vhost - saya lupa meletakkan skrip di crontab - dan mendapatkan gejala yang sangat aneh, agak seperti milik Anda, sampai semuanya kembali kepada saya; tetapi kasus Anda terasa berbeda).
Untuk menyempurnakan pemandangan lebih lanjut sambil menahan biaya, Anda dapat menambahkan PID/TID ke CustomLog
Apache . Kemudian Anda akan dapat memeriksa ulang permintaan yang diterima dari anak Apache yang nakal.
Kemungkinan lain adalah menentukan dengan tepat bagaimana permintaan ini dibuat. Jika melalui Apache, ini berarti fopen_wrappers, cURL, fungsi soket, atau mungkin utilitas shell (keduanya akan muncul di ps
output dan menghasilkan server yang jauh lebih masif, meskipun). Anda dapat menyiapkan serangkaian skrip yang akan:
- mulai ulang Apache dengan anggun tanpa perubahan apa pun
- " " , menonaktifkan sementara salah satu fungsi tersebut
- " " , mengaktifkan kembali sama
Setelah memverifikasi (hanya untuk memastikan) bahwa restart tidak memperbaiki masalah (jika ya, itu akan menjadi kaleng cacing yang sangat berbeda), Anda dapat melanjutkan untuk menonaktifkan sementara - masing-masing beberapa lusin detik, tidak lebih - satu fungsi demi satu. Misalkan penonaktifan curl menyebabkan sistem segera kembali normal:maka Anda dapat membatasi penyelidikan ke skrip menggunakan cURL, dan bahkan mungkin wrap fungsi cURL dengan pembungkus logging.
Jika pihak yang bersalah ternyata bukan Apache, Anda tetap dapat menentukan apa sedang melakukan ini; kemudian instal ulang program yang terpengaruh (bahkan jika saya merasa tidak mungkin ada anomali acak untuk mengubah program menjadi permintaan ulang-HTTP-GET) atau periksa konfigurasinya, file data tambahan, skrip, dan seterusnya, mencari untuk perbedaan apa pun dari instalasi bersih yang diketahui. Karena saya biasanya tidak percaya pada gremlin, saya berharap beberapa perbedaan akan menonjol pada akhirnya.
Unix (dan Linux) memiliki banyak alat untuk menganalisis hal-hal seperti ini. Perhentian pertama saya adalah mengambil output dari netstat -nap mis. di mesin lokal saya...
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
...
tcp 0 0 192.168.0.2:80 192.168.0.2:59875 ESTABLISHED 5281/httpd
...
tcp 0 0 192.168.0.2:59875 192.168.0.2:80 ESTABLISHED 32588/chrome
...
Di sini saya dapat melihat dari chrome (pid 32588) terhubung ke port 80 / httpd (pid 5281). Karena ini adalah instalasi apache pra-fork, saya bisa mendapatkan informasi lebih lanjut tentang proses httpd dengan mencatat %P atau dengan melihat /proc/5281/fd (yang terakhir mungkin memerlukan skrip untuk mengambil data pada saat permintaan ).
Ini akan memungkinkan Anda mengidentifikasi proses klien.
Kandidat yang paling mungkin adalah proxy yang dikonfigurasi dengan buruk atau kode buggy.
Jika ini adalah server saya, saya akan menjalankan strace
di Apache. Menjalankan ini pada setiap proses anak dalam mode prefork bisa sangat intensif, terutama ketika server Anda sudah kelebihan beban. Anda juga harus mengawasi ruang disk Anda, karena jika habis, Apache berhenti melayani permintaan.
Pastikan Anda menggunakan panjang snap yang cukup panjang untuk menangkap seluruh permintaan:-s 400
harus dilakukan.
Jika Apache membuat permintaan untuk dirinya sendiri, setiap string GET akan muncul di strace dump untuk dua PID yang berbeda:satu yang membuat permintaan dan satu yang menerimanya. Di salah satu yang membuat permintaan, Anda ingin menemukan permintaan yang diterima dan sedang diproses saat membuat permintaan untuk dirinya sendiri.
Saya biasanya melakukan sesuatu seperti ini:
for x in `ps -ef | grep apache | awk '{print $2}'`; do strace -s 2000 -p $x -o trace.$x & done
Jika Anda ingin membatasi diri Anda pada subkumpulan turunan Apache karena alasan kinerja, tambahkan head
di sana:
for x in `ps -ef | grep apache | head | awk '{print $2}'`; do strace -s 2000 -p $x -o trace.$x & done
Namun perlu diketahui bahwa hal ini membuat Anda tidak dapat menangkap apa yang sedang terjadi.
Pastikan Anda membuka dua sesi SSH karena semua tugas latar belakang tersebut masih dapat menulis ke sesi Anda. Saat Anda ingin menghentikan stracing, mulai ulang Apache atau jalankan ini di yang lain:
for x in `ps -ef | grep strace | awk '{print $2}'`; do kill $x; done
Firasat saya yang satu ini adalah modul "statis" yang ditulis dalam PHP yang memproses gambar sebelumnya (mengubah ukurannya misalnya) sebelum mengirimnya ke klien dan melakukannya dengan include($image)
. Jika $image
kebetulan berisi URL gambar dari situs Anda sendiri, bukan jalur file dari sistem file lokal, hasilnya adalah permintaan rekursif.
Itu bisa menggunakan curl()
fungsi daripada include()
.