Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 12114|Ответ: 3

[Веб] nginx автоматически пересекает логи доступа

[Скопировать ссылку]
Опубликовано 05.01.2015 20:53:57 | | |

Журнал веб-доступа (access_log) фиксирует поведение всех внешних клиентов к веб-серверу, включая важную информацию, такую как IP-адрес клиента, дата доступа, URL-ресурс с доступом, HTTP-код, возвращаемый сервером, и так далее.
Типичный журнал доступа к вебу выглядит так:


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, как Gecko) Версия/4.0 Мобильный Safari/533.1 MicroMessenger/4.5.1.259" -


Планирование:

1. Чтобы решить проблему:

Когда сайт посещает много посетителей, будет много лог-данных, и если всё записано в лог-файл, файл становится всё больше и больше. Скорость больших файлов замедляется, например, сотни мегабайт файла. При записи логов это влияет на скорость работы. Также, если посмотреть логи доступа, файл на несколько сотен мегабит медленно скачивается и открывается. Используя бесплатный сторонний инструмент анализа логов — Log Treasure, вы можете загружать файлы логов с nginx, apache и iis, которые помогают анализировать аспекты безопасности сайта. В конце концов, специализация — это более профессионально. В Log Bao также есть ограничение по размеру для загруженных файлов — не более 50 м.


2. В Nignx нет механизма для автоматического разделения файлов и хранения логов. Поскольку nginx не сохраняет файлы автоматически для вас. Поэтому вам нужно написать собственный скрипт для его реализации.


Файл shell-скрипта nginx_log_division.sh следующее содержимое:


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


убить -USR1 'cat ${pid_path}'


Принцип вышеуказанного shell-скрипта заключается в том, чтобы сначала переместить и переименовать предыдущий файл журнала в один, цель которой — сделать резервное копирование.

Согласно названию последнего понедельника, когда скрипт запускается в момент «2013-09-16», сгенерированное имя файла — «xxx.log_ 20130909.log».

Даже если команда mv была выполнена на файле до убийства -USR1, 'cat ${{pid_path}' выполняетсяИзменение имени файла, nginx по-прежнему будет записывать журнальные данные в новый названный файл «xxx.log_20130909», как обычно. Причина в том, что в системах Linux ядро ищет файлы на основе дескрипторов файлов.


---------------- понимание дескрипторов файлов Linux


Дескриптор файла — это идентификатор целых чисел, который ядро Linux называет для каждого открытого файла.

Ядро Linux генерирует (или поддерживает) "Таблица дескрипторов файловЭта таблица дескрипторов файла фиксирует «файл, открытый этим процессом (идентифицированный)».

В этой среде nginx — это запущенный процесс, который уже открыл файл журнала и записывает его в таблицу дескрипторов файлов.

Даже если путь файла журнала изменился, его всё равно можно найти (его можно найти согласно таблице дескрипторов файлов).

----------------------------------------------

При выполнении команды "kill -USR1 'cat ${pid_path}'" сохранение в файле nginx.pid на самом деле является числом (вы можете открыть его и посмотреть, у меня здесь номер 894), и nginx записывает pid (номер процесса) своего основного процесса в файл nginx.pid, чтобы вы могли напрямую получить его основной номер процесса через команду cat и напрямую управлять указанным номером процесса.


kill -USR1 'cat ${pid_path}' эквивалентен

kill –USR1 894 #指定发信号 (USR1) сигнал для нумерации этого процесса.


В системах Linux взаимодействует с «работающими процессами» через сигналы. В системах Linux также существует множество предопределённых сигналов, таких как SIGHUP. USR1 — это пользовательский сигнал. Его можно понимать как сам процесс, определяющий, что делать при получении этого сигнала (то есть сам автор процесса решает, принимать ли этот сигнал или ничего не делать, и полностью оставляет решение разработчику). В nginx он пишет собственный код, чтобы обрабатывать процесс повторного открытия файла журнала nginx при получении сигнала USR1. Конкретный принцип таков:

1. Основной процесс nginx принимает сигнал USR1 и вновь открывает файл журнала (названный по имени журнала в конфигурационном файле nginx, которое является значением, установленным элементом access_log в конфигурационном файле, и если файла нет, автоматически создаётся новый xxx.log файл).


2. Затем измените владельца файла журнала на «worker process», чтобы рабочий процесс имел права на чтение и запись в файл журнала (мастер и рабочий обычно работают как разные пользователи, поэтому нужно сменить владельца).


3. Основной процесс nginx закроет дублирующийся файл журнала (то есть файл, который был переименован в xxx.log_ 20130909.log с помощью команды mv).и уведомляет рабочий процесс использовать недавно открытый файл журнала(xxx.log файл, который только что открыл основной процесс). Конкретная реализация более детальна: основной процесс отправляет сигнал USR1 работнику, и после получения этого сигнала работник повторно открывает файл журнала (то есть xxx.log, согласованный в конфигурационном файле)



=================================== Выполнять скрипты с регулярными интервалами


Установите добавление скрипта shell выше в запланированную задачу. crontab — это запланированный процесс задач в Linux. Этот процесс начнётся, когда вы его включите, и время от времени она будет заходить в список, чтобы узнать, есть ли какие-то задачи, которые нужно выполнить.


crontab -e


* 04 * * 1 /data/wwwlogs/nginx_log_division.sh



Откроется файл с добавленным вышеуказанным кодом

Формат — «Путь к выполнению файла оболочки». * можно понимать как «каждый», каждую минуту, каждый час, каждый месяц и так далее.

Я настроил скрипт на запуск nginx_log_division.sh в 4 утра в понедельник, и содержимое скрипта предназначено для восстановления нового файла журнала.



Прилагается:УстанавливатьnginxКак настраиваются логи


log_format сайт '$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

#第二个参数表示使用那个日志格式 для каждого формата журнала определяется имя, и сайт соответствует именю в log_format



Вышеописанное включает использование диспетчера задач crontab.



Есть и места, где нет полного понимания и ошибок. Надеюсь обновить информацию в будущем.






Предыдущий:Вопросы итогового экзамена Houpu javaoop 2014 года
Следующий:Основные методы использования vi/vim
Опубликовано 06.01.2015 0:04:30 |
О, может ли ответ принести деньги?
 Хозяин| Опубликовано 06.01.2015 0:06:16 |
Джонянг опубликовано 2015-1-6 00:04
О, может ли ответ принести деньги?

Он может иметь престиж
Опубликовано 06.01.2015 0:13:44 |
admin Опубликовано 2015-1-6 00:06
Он может иметь престиж

Для чего нужен престиж?
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com