Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 12114|Jawab: 3

[Situs web] nginx secara otomatis memotong log akses

[Salin tautan]
Diposting pada 05/01/2015 20.53.57 | | |

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.






Mantan:Pertanyaan ujian akhir Houpu javaoop 2014
Depan:Metode penggunaan dasar VI/VIM
Diposting pada 06/01/2015 00.04.30 |
Oh, bisakah membalas menghasilkan uang?
 Tuan tanah| Diposting pada 06/01/2015 00.06.16 |
johnyoung dipaparkan pada 2015-1-6 00:04
Oh, bisakah membalas menghasilkan uang?

Itu bisa memiliki prestise
Diposting pada 06/01/2015 00.13.44 |
admin Dipaparkan pada 2015-1-6 00:06
Itu bisa memiliki prestise

Untuk apa prestise?
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com