|
El registro de acceso web (access_log) registra el comportamiento de acceso de todos los clientes externos al servidor web, incluyendo información importante como la IP del cliente, fecha de acceso, recurso URL accedido, código de estado HTTP devuelto por el servidor, y así sucesivamente. Un registro típico de acceso web es así: 112.97.37.90 - - [14/Sep/2013:14:37:39 +0800] "GET / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; Lenovo A326 Build/GRK39F) AppleWebKit/533.1 (KHTML, como Gecko) Versión/4.0 Mobile Safari/533.1 MicroMessenger/4.5.1.259" -
Planificación: 1. Para resolver el problema: Cuando la web tiene un gran número de visitas, habrá muchos datos de registro, y si todos están escritos en un archivo de registro, el archivo se hará cada vez más grande. La velocidad de archivos grandes se ralentiza, como cientos de megabytes de un archivo. Al escribir registros, afecta a la velocidad de operación. Además, si quiero mirar los registros de acceso, un archivo de varios cientos de megabits tarda en descargarse y abrirse. Utilizando una herramienta gratuita de análisis de registros de terceros - Log Treasure, puedes subir archivos de log de nginx, apache e iis, que ayudan a analizar aspectos de seguridad de la web. Al fin y al cabo, especializarse es más profesional. Log Bao también tiene un límite de tamaño para archivos subidos, no superior a 50 m.
2. Nignx no dispone de un mecanismo para separar automáticamente archivos y almacenar registros. Ya que nginx no guarda archivos automáticamente para ti. Por lo tanto, necesitas escribir tu propio script para implementarlo.
El archivo de script shell nginx_log_division.sh el siguiente contenido:
# /bash/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}_$(fecha --fecha="SEMANA PASADA" +"%Y-%m-d").log
matar -USR1 'gato ${pid_path}'
El principio del script de shell anterior es primero mover y renombrar el archivo de registro anterior a uno, el propósito es hacer una copia de seguridad. Según el nombre del último lunes, cuando el script se ejecuta en el momento "2013-09-16", el nombre del archivo generado es "xxx.log_ 20130909.log". Incluso si el comando mv se ha ejecutado en el archivo antes de que se ejecute kill -USR1 'cat ${{pid_path}'Nombre de archivo cambiadonginx seguirá escribiendo los datos de registro en el archivo recién nombrado "xxx.log_20130909" como de costumbre. La razón es que en sistemas Linux, el núcleo busca archivos basándose en descriptores de archivo.
---------------- comprensión de los descriptores de archivos en Linux
Un descriptor de archivo es un identificador entero que el núcleo de Linux nombra para cada archivo abierto. El núcleo de Linux genera (o mantiene) un "Tabla de descriptores de archivosEsta tabla de descriptores de archivos registra "el archivo abierto por este proceso (identificado)". En este entorno, nginx es un proceso en ejecución que ya ha abierto un archivo de registro y registra el archivo en la tabla de descriptores del archivo. Incluso si la ruta del archivo de registro ha cambiado, aún puede encontrarse (puede localizarse según la tabla de descriptores del archivo). ---------------------------------------------- Al ejecutar el comando "kill -USR1 'cat ${pid_path}'", el guardado en el archivo nginx.pid es en realidad un número (puedes abrirlo y echar un vistazo, soy el 894 aquí), y nginx escribe el pid (número de proceso) de su proceso principal en el archivo nginx.pid, así que puedes obtener directamente su número de proceso principal a través del comando cat y operar directamente el número de proceso especificado.
kill -USR1 'cat ${pid_path}' es equivalente a kill –USR1 894 #指定发信号 (USR1) para numerar este proceso.
En los sistemas Linux, Linux se comunica con "procesos en ejecución" a través de señales. En los sistemas Linux, también existen muchas señales predefinidas, como SIGHUP. USR1 es una señal definida por el usuario. Puede entenderse como el propio proceso definiendo qué hacer cuando recibe esta señal (es decir, el propio autor del proceso decide si recibe esa señal o no hace nada, y deja completamente a criterio del desarrollador la decisión). En nginx, escribe su propio código para gestionar la gestión de que nginx reabra el archivo de registro cuando recibo una señal USR1. El principio específico es el siguiente: 1. El proceso principal de nginx recibe la señal USR1 y reabrirá el archivo de registro (nombrado así por el nombre del registro en el archivo de configuración nginx, que es el valor establecido por el elemento access_log en el archivo de configuración, y si el archivo no existe, se creará automáticamente un nuevo xxx.log de archivo).
2. Luego cambiar el propietario del archivo de registro a "proceso trabajador", de modo que el proceso trabajador tenga permisos de lectura y escritura en el archivo de registro (maestro y trabajador normalmente se ejecutan como usuarios diferentes, por lo que el propietario debe cambiarse).
3. El proceso principal nginx cerrará el archivo de registro duplicado (es decir, el archivo que fue renombrado a xxx.log_ 20130909.log usando el comando mv hace un momento),y notifica al proceso trabajador que utilice el archivo de registro recién abierto(xxx.log el archivo abierto por el proceso principal hace un momento). La implementación específica es más detallada, el proceso principal envía la señal USR1 al trabajador y, tras recibir esta señal, el trabajador volverá a abrir el archivo de registro (es decir, el xxx.log acordado en el archivo de configuración)
=================================== Ejecutar scripts a intervalos regulares
Establece el archivo de script de shell de arriba para que se añada a la tarea programada. crontab es un proceso de tarea programada bajo Linux. Este proceso comenzará cuando lo enciendas y de vez en cuando irá a su lista para ver si hay alguna tarea que deba realizarse.
crontab -e
* 04 * * 1 /data/wwwlogs/nginx_log_division.sh
Se abrirá un archivo con el código anterior añadido El formato es "Ruta de archivo de shell a ejecutar". * puede entenderse como "cada", cada minuto, cada hora, cada mes, etc. Configuré un script para ejecutarlo nginx_log_division.sh a las 4 de la mañana del lunes, y el contenido del script es regenerar un nuevo archivo de log.
Adjunto:ConstruirnginxCómo se configuran los registros
log_format sitio '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_enviados "$http_referer" ' '"$http_agent_user_» $http_x_forwarded_for';
access_log /data/wwwlogs/xxxx.com.log sitio #第二个参数表示使用那个日志格式, se identifica un nombre para cada formato de registro, y el sitio corresponde al nombre del log_format
Lo anterior implica el uso del administrador de tareas programadas de crontab.
También hay lugares donde no hay una comprensión completa y errores en los que no hay una comprensión completa. Espero poder actualizar en el futuro.
|