Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Bagaimana untuk menatal fail log nginx dalam docker

Bagaimana untuk menatal fail log nginx dalam docker

WBOY
WBOYke hadapan
2023-05-28 20:22:041074semak imbas

penggunaan docker

 1. docker ps to view running containers

 2. docker images to view docker images

 3. docker rm id (ID kontena) Padamkan bekas (ID kontena boleh dilihat melalui docker ps, bekas mesti dihentikan sebelum ia boleh dipadamkan)

 3.1 Padam semua bekas docker rm `docker ps -a -q`

7. docker run -it ubuntu:16.04 Cipta dan jalankan bekas kontena

-t bermaksud untuk menentukan terminal atau terminal pseudo dalam yang baharu bekas

-i bermaksud benarkan kami Berinteraksi dengan (stdin) dalam bekas

-p menentukan port yang dipetakan

-d menjalankan bekas di latar belakang dan mencetak bekas id

7.1 docker run -dit ubuntu:16.04 Cipta dan jalankan bekas di latar belakang

 7.2 docker run -ditp 8080:8080 (host port: container port) ubuntu:16.04 Cipta dan jalankan bekas di latar belakang dan petakan pelabuhan kontena

8. id lampiran docker (id kontena) Masukkan persekitaran kontena yang sedang berjalan

9. Keluar dari kontena

9.1 keluar Keluar dari bekas terus dan tamatkan bekas berjalan

9.2 [ctrl+p]+[ ctrl+q] (kekunci pintasan) Keluar dari bekas, tetapi ia tidak akan menamatkan bekas berjalan

10. docker commit -m'version idification' id (id kontena) ubuntu:16.04 (imej dan nombor versi) Serahkan imej dan Jana imej (anda boleh menggunakan arahan ini untuk membungkus bekas yang dibina ke dalam imej baharu atau menulis ganti yang asal imej (iaitu, mengubah suai kandungan imej asal, dan nama imej yang dijana boleh ditimpa terus jika nama imej yang dijana adalah sama dengan nombor versi))


Berfikir

Bagaimana untuk menatal fail log nginx dalam dockernginx official sebenarnya memberi arahan tentang cara memutar log:

memusingkan fail log untuk memutar fail log, mereka perlu dinamakan semula terlebih dahulu selepas itu isyarat usr1 harus dihantar ke proses induk kemudiannya akan membuka semula semua fail log yang sedang dibuka dan menetapkannya sebagai pengguna yang tidak mempunyai hak di mana proses pekerja sedang berjalan. seorang pemilik. selepas berjaya membuka semula, proses induk menutup semua fail yang terbuka dan menghantar mesej kepada proses pekerja untuk meminta mereka membuka semula fail yang baru dan menutup fail lama dengan serta-merta fail hampir serta-merta tersedia untuk pemprosesan pos, seperti pemampatan.


Idea umum huraian ini ialah: Namakan semula fail log

•Kemudian hantar isyarat usr1 ke proses induk nginx

•Proses induk nginx akan melakukan beberapa pemprosesan selepas menerima isyarat, dan kemudian meminta proses pekerja membuka semula fail log
•Proses pekerja membuka fail log baharu dan menutup fail log lama

Malah, satu-satunya kerja yang perlu kita lakukan ialah dua mata pertama!


Buat persekitaran ujian

Dengan mengandaikan bahawa docker telah dipasang dalam sistem anda, di sini kami menjalankan bekas nginx secara langsung:

$ docker run -d \
 -p 80:80 \
 -v $(pwd)/logs/nginx:/var/log/nginx \
 --restart=always \
 --name=mynginx \
 nginx:1.11.3

Perhatikan bahawa kami mengikat log nginx Dipasang pada direktori log dalam direktori semasa.

Simpan kandungan berikut ke dalam fail test.sh:

#!/bin/bash
for ((i=1;i<=100000;i++))
do
 curl http://localhost > /dev/null
 sleep 1
done

Kemudian jalankan skrip ini untuk mensimulasikan pengelogan berterusan.

Skrip untuk mencipta log bergolek

Buat fail rotatelog.sh dengan kandungan berikut:

#!/bin/bash
getdatestring()
{
 tz=&#39;asia/chongqing&#39; date "+%y%m%d%h%m"
}
datestring=$(getdatestring)
mv /var/log/nginx/access.log /var/log/nginx/access.${datestring}.log
mv /var/log/nginx/error.log /var/log/nginx/error.${datestring}.log
kill -usr1 `cat /var/run/nginx.pid`

fungsi getdatestring mengambil masa semasa dan memformatkannya menjadi rentetan, seperti " 201807241310 ", penulis lebih suka menamakan fail dengan tarikh dan masa. Ambil perhatian bahawa zon waktu ditentukan di sini melalui tz='asia/chongqing', kerana secara lalai formatnya ialah waktu UTC, yang pelik untuk digunakan (anda perlu memikirkan +8 jam dalam masa nyata). Dua arahan mv berikut digunakan untuk menamakan semula fail log. Akhir sekali, hantar isyarat usr1 ke proses induk nginx melalui arahan bunuh.

Tambahkan kebenaran boleh laku pada fail rotatelog.sh melalui arahan berikut dan salin ke direktori $(pwd)/logs/nginx:

$ chmod +x rotatelog.sh
$ sudo cp rotatelog.sh $(pwd)/logs/nginx

Lakukan operasi rolling dengan kerap

Nginx kami berjalan dalam bekas, jadi kami perlu menghantar isyarat usr1 ke proses induk nginx dalam bekas. Oleh itu, kita perlu melaksanakan skrip rotatelog.sh dalam bekas mynginx melalui arahan docker exec:

Melaksanakan arahan di atas sekali akan menghasilkan sekumpulan fail log baharu sebagai dijadualkan:

Seterusnya kita mengkonfigurasi arahan ini dalam tugas yang dijadualkan dan biarkan ia dilaksanakan sekali setiap pagi pada jam 1. Jalankan arahan crontab -e dan tambah baris berikut pada penghujung fail:

$ docker exec mynginx bash /var/log/nginx/rotatelog.sh

Bagaimana untuk menatal fail log nginx dalam docker

Hanya simpan dan keluar. Gambar di bawah adalah kesan tatal setiap 5 minit semasa ujian pengarang:

Bagaimana untuk menatal fail log nginx dalam docker

Mengapa tidak mv fail log terus dalam hos?

Secara teorinya ini mungkin, kerana kandungan volum data yang dipasang melalui bind adalah sama apabila dilihat dari hos dan dari bekas. Tetapi apabila anda benar-benar melakukan ini, anda mungkin menghadapi masalah kebenaran. Dalam mesin hos, anda biasanya menggunakan pengguna biasa, dan pemilik fail log yang dijana dalam bekas akan menjadi pengguna khas, dan secara amnya pengguna lain tidak akan diberikan kebenaran menulis dan melaksanakan:


Bagaimana untuk menatal fail log nginx dalam docker

Sudah tentu, jika anda menggunakan pengguna root pada mesin hos, tidak akan ada masalah.

Bolehkah isyarat dihantar dari mesin hos?

Malah, nama penuh soalan ini sepatutnya: Bolehkah isyarat dihantar dari hos ke proses induk nginx dalam bekas docker?

Jawapannya, ya.

Kita boleh menggunakan arahan:

$ docker container kill mynginx -s usr

untuk menghantar isyarat usr1 untuk memproses No. 1 (nginx master) dalam bekas (kaedah ini hanya boleh menghantar Proses No. 1 menghantar isyarat):

Bagaimana untuk menatal fail log nginx dalam docker

Menggabungkan dua masalah di atas, kita boleh menulis cara lain untuk menatal log masuk nginx docker. Kaedah ini tidak memerlukan pelaksanaan perintah dalam bekas melalui arahan docker exec, tetapi melengkapkan semua operasi pada mesin hos:

•Namakan semula fail log dahulu dalam volum data kontena
• Hantar isyarat usr1 untuk memproses No. 1 dalam bekas

Atas ialah kandungan terperinci Bagaimana untuk menatal fail log nginx dalam docker. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam