|
Log akses web (access_log) mencatat perilaku akses semua klien eksternal ke server web, termasuk informasi penting seperti IP klien, tanggal akses, sumber daya URL yang diakses, kode status HTTP yang dikembalikan oleh server, dan sebagainya. Log akses web biasa terlihat seperti ini: 112.97.37.90 - - [14/Sep/2013:14:37:39 +0800] "DAPATKAN / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; Lenovo A326 Build/GRK39F) Versi AppleWebKit/533.1 (KHTML, seperti Gecko)/Safari Seluler 4.0/533.1 MicroMessenger/4.5.1.259" -
Perencanaan: 1. Untuk memecahkan masalah: Ketika situs web memiliki jumlah kunjungan yang banyak, akan ada banyak data log, dan jika semuanya ditulis ke dalam file log, file akan menjadi semakin besar. Kecepatan file besar akan melambat, seperti ratusan megabyte file. Saat menulis log, itu memengaruhi kecepatan operasi. Juga, jika saya ingin melihat log akses, file beberapa ratus megabit lambat untuk diunduh dan dibuka. Dengan menggunakan alat analisis log gratis pihak ketiga - Log Treasure, Anda dapat mengunggah file log dari nginx, apache, dan iis, yang membantu menganalisis aspek keamanan situs web. Lagi pula, spesialisasi lebih profesional. Log Bao juga memiliki batas ukuran untuk file yang diunggah, tidak lebih dari 50m.
2. Nignx tidak memiliki mekanisme untuk secara otomatis memisahkan file dan menyimpan log. Karena nginx tidak secara otomatis menyimpan file untuk Anda. Oleh karena itu, Anda perlu menulis skrip Anda sendiri untuk menerapkannya.
File skrip shell nginx_log_division.sh konten berikut:
# /bin/bash logs_path="/data/wwwlogs/" #以前的日志文件. log_name="xxx.log" pid_path="/usr/local/nginx/logs/nginx.pid"
mv ${logs_path}${log_name} ${logs_path}${log_name}_$(date --date="LAST WEEK" +"%Y-%m-d").log
bunuh -USR1 'kucing ${pid_path}'
Prinsip dari skrip shell di atas adalah terlebih dahulu memindahkan dan mengganti nama file log sebelumnya menjadi satu, tujuannya adalah untuk mencadangkan. Menurut nama Senin lalu, ketika skrip dijalankan pada titik waktu "2013-09-16", maka nama file yang dihasilkan adalah "xxx.log_ 20130909.log". Bahkan jika perintah mv telah dijalankan pada file sebelum kill -USR1 'cat ${{pid_path}' dieksekusiNama file yang diubah, nginx masih akan menulis data log ke file yang baru diberi nama "xxx.log_20130909" seperti biasa. Alasannya adalah bahwa dalam sistem Linux, kernel mencari file berdasarkan deskriptor file.
---------------- pemahaman tentang deskriptor file Linux
Deskriptor file adalah pengidentifikasi bilangan bulat yang diberi nama kernel Linux untuk setiap file terbuka. Kernel Linux menghasilkan (atau memelihara) "Tabel Deskriptor FileTabel deskriptor file ini mencatat "file yang dibuka oleh proses ini (diidentifikasi)". Dalam lingkungan ini, nginx adalah proses yang sedang berjalan yang telah membuka file log dan mencatat file dalam tabel deskriptor file. Bahkan jika jalur file log telah berubah, itu masih dapat ditemukan (dapat ditemukan sesuai dengan tabel deskriptor file). ---------------------------------------------- Saat menjalankan perintah "kill -USR1 'cat ${pid_path}'", yang disimpan dalam file nginx.pid sebenarnya adalah angka (Anda dapat membukanya dan melihatnya, saya 894 di sini), dan nginx menulis pid (nomor proses) dari proses utamanya ke file nginx.pid, sehingga Anda dapat langsung mendapatkan nomor proses utamanya melalui perintah cat dan langsung mengoperasikan nomor proses yang ditentukan.
kill -USR1 'cat ${pid_path}' setara dengan kill –USR1 894 #指定发信号 (USR1) sinyal untuk memberi nomor proses ini.
Dalam sistem Linux, Linux berkomunikasi dengan "proses yang sedang berjalan" melalui sinyal. Dalam sistem Linux, ada juga banyak sinyal yang telah ditentukan sebelumnya, seperti SIGHUP. USR1 adalah sinyal yang ditentukan pengguna. Ini dapat dipahami sebagai proses itu sendiri yang menentukan apa yang harus dilakukan ketika menerima sinyal ini (yaitu, penulis proses sendiri memutuskan apakah akan menerima sinyal ini atau tidak melakukan apa-apa, dan menyerahkannya sepenuhnya kepada pengembang untuk memutuskan). Di nginx, ia menulis kodenya sendiri untuk menangani penanganan agar nginx membuka kembali file log ketika saya menerima sinyal USR1. Prinsip spesifiknya adalah sebagai berikut: 1. Proses utama nginx menerima sinyal USR1 dan akan membuka kembali file log (dinamai sesuai nama log dalam file konfigurasi nginx, yang merupakan nilai yang ditetapkan oleh item access_log dalam file konfigurasi, dan jika file tidak ada, file baru xxx.log akan dibuat secara otomatis).
2. Kemudian ubah pemilik file log menjadi "proses pekerja", sehingga proses pekerja memiliki izin baca dan tulis ke file log (master dan pekerja biasanya berjalan sebagai pengguna yang berbeda, sehingga pemiliknya perlu diubah).
3. Proses utama nginx akan menutup file log duplikat (yaitu, file yang diganti namanya menjadi xxx.log_ 20130909.log menggunakan perintah mv barusan),dan memberi tahu proses pekerja untuk menggunakan file log yang baru dibuka(xxx.log file yang baru saja dibuka oleh proses utama). Implementasi spesifik lebih rinci, proses utama mengirimkan sinyal USR1 ke pekerja, dan setelah menerima sinyal ini, pekerja akan membuka kembali file log (yaitu, xxx.log yang disepakati dalam file konfigurasi)
=================================== Eksekusi skrip secara berkala
Atur file skrip shell di atas untuk ditambahkan ke tugas terjadwal. crontab adalah proses tugas terjadwal di bawah Linux. Proses ini akan dimulai saat Anda menyalakannya, dan akan masuk ke daftarnya sesekali untuk melihat apakah ada tugas yang perlu dilakukan.
crontab -e
* 04 * * 1 /data/wwwlogs/nginx_log_division.sh
Sebuah file akan terbuka dengan kode di atas ditambahkan Formatnya adalah "Jalur file shell yang akan dieksekusi". * dapat dipahami sebagai "setiap", setiap menit, setiap jam, setiap bulan, dll. Saya menyiapkan skrip untuk menjalankan nginx_log_division.sh pada pukul 4 pagi pada hari Senin, dan isi skrip adalah untuk membuat ulang file log baru.
Terlampir:MengaturnginxCara log dikonfigurasi
log_format situs '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for';
access_log /data/wwwlogs/xxxx.com.log #第二个参数表示使用那个日志格式, nama diidentifikasi untuk setiap format log, dan situs sesuai dengan nama di log_format
Di atas melibatkan penggunaan pengelola tugas terjadwal crontab.
Ada juga tempat di mana tidak ada pemahaman dan kesalahan yang lengkap. Berharap untuk memperbarui di masa mendatang.
|