Maison  >  Article  >  Opération et maintenance  >  Comment faire défiler le fichier journal nginx dans Docker

Comment faire défiler le fichier journal nginx dans Docker

WBOY
WBOYavant
2023-05-28 20:22:041074parcourir

utilisation de Docker

 1. docker ps pour afficher les conteneurs en cours d'exécution

 2. images docker pour afficher les images docker

 3. docker rm id (identifiant du conteneur) Supprimer le conteneur (l'identifiant du conteneur peut être visualisé via docker ps, le conteneur doit être arrêté 3.1 Supprimer tous les conteneurs docker rm `docker ps -a -q`

  4. docker stop id (identifiant du conteneur) Arrêter l'exécution du conteneur

5. docker rmi id (identifiant miroir) Supprimer l'image

6 .docker pull ubuntu:16.04 (nom de l'image : numéro de version) Téléchargez l'image

 7. docker run -it ubuntu:16.04 Créer et exécuter le conteneur conteneur

  -t signifie spécifier un pseudo-terminal ou un terminal dans le nouveau conteneur

- je veux dire que nous sommes autorisés à interagir avec (stdin) dans le conteneur

  -p spécifie le port mappé

  -d exécute le conteneur en arrière-plan et imprime l'identifiant du conteneur

  7.1 docker run -dit ubuntu:16.04 Create et exécutez le conteneur en arrière-plan

  7.2 docker run -ditp 8080:8080 (port hôte : port du conteneur) ubuntu:16.04 Créez et exécutez le conteneur en arrière-plan et mappez le port du conteneur

 8. docker attach id ( ID du conteneur) Entrez dans l'environnement du conteneur en cours d'exécution

 9. Quitter le conteneur

  9.1 exit quitte directement le conteneur et met fin à l'exécution du conteneur

  9.2 [ctrl+p]+[ctrl+q] (touche de raccourci) quitte le conteneur, mais ne termine pas l'exécution du conteneur

 10. docker commit -m' version identification ' id (identifiant du conteneur) ubuntu:16.04 (image et numéro de version) Soumettez l'image et générez l'image (vous pouvez utiliser cette commande pour empaqueter le conteneur construit dans une nouvelle image ou écraser l'image d'origine (c'est-à-dire modifier le contenu de l'image d'origine, générer Si le nom de l'image est le même que le numéro de version, il peut être écrasé directement))


Comment faire défiler le fichier journal nginx dans Docker

Choses

Le responsable de nginx donne en fait des instructions sur la façon de faire pivoter les journaux :


rotation des fichiers journaux

afin de faire pivoter les fichiers journaux, ils doivent d'abord être renommés, après quoi le signal usr1 doit être envoyé au processus maître. rouvrez tous les fichiers journaux actuellement ouverts et attribuez-leur un utilisateur non privilégié sous lequel les processus de travail sont exécutés. En tant que propriétaire, après une réouverture réussie, le processus maître ferme tous les fichiers ouverts et envoie le message au processus de travail pour lui demander de le faire. les processus de réouverture des fichiers ouvrent également de nouveaux fichiers et ferment immédiatement les anciens fichiers. Par conséquent, les anciens fichiers sont presque immédiatement disponibles pour le post-traitement, comme la compression.



L'idée générale de cette description est la suivante :


• Renommez d'abord l'ancien fichier journal

•Envoyez ensuite le signal usr1 au processus maître nginx

•Le processus maître nginx reçoit le signal Ensuite, nous effectuerons un traitement, puis demanderons au processus de travail de rouvrir le fichier journal
• Le processus de travail ouvre un nouveau fichier journal et ferme l'ancien fichier journal

En fait, le seul travail que nous devons vraiment faire est les deux premiers points !

Créez un environnement de test

En supposant que Docker ait été installé sur votre système, nous exécutons ici directement un conteneur nginx :

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

Notez que nous avons lié et monté les journaux de nginx dans le répertoire des journaux dans le répertoire courant.


Enregistrez le contenu suivant dans le fichier test.sh :

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

Ensuite, exécutez ce script pour simuler la génération d'enregistrements de journaux continus.

Script pour créer un journal déroulant

Créez le fichier rotatelog.sh avec le contenu suivant :

#!/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`

La fonction getdatestring prend l'heure actuelle et la formate en une chaîne, telle que "201807241310". il est temps de nommer les fichiers. Notez que le fuseau horaire est spécifié ici via tz='asia/chongqing', car par défaut le format est l'heure UTC, ce qui est bizarre à utiliser (vous devez calculer +8 heures en temps réel). Les deux commandes mv suivantes sont utilisées pour renommer les fichiers journaux. Enfin, envoyez le signal usr1 au processus maître nginx via la commande kill.

Ajoutez des autorisations exécutables au fichier rotatelog.sh via la commande suivante et copiez-le dans le répertoire $(pwd)/logs/nginx :

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

Effectuez régulièrement des opérations de roulement

Notre nginx s'exécute dans un conteneur, nous besoin Envoyez le signal usr1 au processus maître nginx dans le conteneur. Par conséquent, nous devons exécuter le script rotatelog.sh dans le conteneur mynginx via la commande docker exec :

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

Exécutez ce qui précède commande une fois, et elle générera un lot de nouveaux fichiers journaux comme prévu : $ docker exec mynginx bash /var/log/nginx/rotatelog.sh

执行一次上面的命令,会如期产生一批新的日志文件:

Comment faire défiler le fichier journal nginx dans Docker

下面我们把这个命令配置在定时任务中,让它每天早上 1 点钟执行一次。执行 crontab -e 命令,并在文件的末尾添加下面的行:

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

Comment faire défiler le fichier journal nginx dans Docker

Ensuite, nous configurons cette commande dans la tâche planifiée et la laissons être exécutée une fois chaque matin à 1 heure. Exécutez la commande crontab -e et ajoutez les lignes suivantes à la fin du fichier : 🎜🎜* 1 * * * docker exec mynginx bash /var/log/nginx/rotatelog.sh🎜🎜🎜🎜

Enregistrez et quittez. L'image ci-dessous est l'effet d'un défilement toutes les 5 minutes lors du test de l'auteur :

Comment faire défiler le fichier journal nginx dans Docker

Pourquoi ne pas mv le fichier journal directement dans l'hôte ?

Cela est théoriquement possible, car le contenu du volume de données monté via la liaison est le même lorsqu'il est affiché depuis l'hôte et depuis le conteneur. Mais lorsque vous faites cela, vous risquez de rencontrer des problèmes d’autorisation. Dans la machine hôte, vous utilisez généralement un utilisateur ordinaire, tandis que le propriétaire du fichier journal généré dans le conteneur sera un utilisateur spécial, et généralement les autres utilisateurs ne recevront pas d'autorisations d'écriture et d'exécution :


Comment faire défiler le fichier journal nginx dans Docker

Bien sûr , si vous utilisez l'utilisateur root sur la machine hôte, il n'y aura aucun problème.

Le signal peut-il être envoyé depuis la machine hôte ?

En fait, le nom complet de cette question devrait être : un signal peut-il être envoyé de l'hôte au processus maître nginx dans le conteneur Docker ?

La réponse est oui.

Nous pouvons envoyer le signal usr1 au processus n°1 (nginx master) dans le conteneur via la commande :

$ docker container kill mynginx -s usr

(cette méthode ne peut envoyer le signal qu'au processus n°1) :

Comment faire défiler le fichier journal nginx dans Docker

Combinez les deux ci-dessus. Comme question, nous pouvons écrire une autre façon de faire défiler le journal nginx dans le docker. Cette méthode ne nécessite pas d'exécuter des commandes dans le conteneur via la commande docker exec, mais effectue toutes les opérations sur la machine hôte :

•Renommez d'abord le fichier journal dans le volume de données du conteneur
•Envoyez-le au processus n°1 dans le signal usr1 du conteneur

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer