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

Bagaimana untuk menatal log nginx dalam docker

WBOY
WBOYke hadapan
2023-05-29 21:40:041207semak 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 port kontena

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

9. Keluar dari bekas

9.1 exit Exit 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 Hasilkan imej (anda boleh menggunakan arahan ini untuk membungkus bekas yang dibina ke dalam imej baharu atau menulis ganti imej asal ( iaitu, ubah suai kandungan imej asal, dan nama imej yang dijana boleh terus ditulis ganti jika nama imej yang dihasilkan adalah sama dengan nombor versi))

Baiklah, semua orang tahu tentang Docker. Berikut adalah perkara utama artikel ini.

nginx sendiri tidak menangani masalah guling balak, ia menendang bola kepada pengguna. Biasanya, anda boleh menggunakan alat logrotate untuk menyelesaikan tugasan ini, atau jika anda mahu, anda boleh menulis pelbagai skrip untuk menyelesaikan tugas yang sama. Pengarang artikel ini memperkenalkan cara menatal fail log nginx yang berjalan di docker (gambar di bawah adalah dari Internet).


Berfikir

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

berputar log-filesuntuk memutar fail log, ia 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 fail yang tidak mempunyai hak istimewa pengguna di mana proses pekerja sedang berjalan, sebagai pemilik selepas berjaya membuka semula, proses induk menutup semua fail yang terbuka dan menghantar mesej kepada proses pekerja untuk meminta mereka membuka semula fail baru dan menutup fail pemampatan lama serta-merta. Akibatnya, fail lama hampir serta-merta tersedia untuk pemprosesan pos, seperti Namakan semula fail log lama

•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
•Pekerja Proses membuka fail log baharu dan menutup fail log lama

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

Buat persekitaran ujian

Dengan mengandaikan bahawa docker telah dipasang dalam sistem anda, di sini kami menjalankan kontena 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 kami mengkonfigurasi arahan ini dalam tugas yang dijadualkan dan biarkan ia dilaksanakan sekali setiap pagi pada pukul 1. Jalankan arahan crontab -e dan tambah baris berikut pada penghujung fail:

* 1 * * * docker exec mynginx bash /var/log/nginx/rotatelog.sh

Bagaimana untuk menatal log nginx dalam docker

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

Bagaimana untuk menatal 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 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.

Penulis memperkenalkan masalah penangkapan isyarat dalam bekas dalam artikel ini. Dalam artikel itu kami memperkenalkan perintah bunuh buruh pelabuhan yang menghantar isyarat kepada proses dalam bekas. Kita boleh menghantar isyarat usr1 untuk memproses No. 1 (master nginx) dalam bekas melalui arahan:

$ docker container kill mynginx -s usr

(kaedah ini hanya boleh menghantar isyarat untuk memproses No. 1 ):

Bagaimana untuk menatal log nginx dalam docker

Menggabungkan dua soalan di atas, kita boleh menulis cara lain untuk menatal log masuk docker nginx. 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 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