Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 12114|Відповідь: 3

[Веб] nginx автоматично обрізає журнали доступу

[Копіювати посилання]
Опубліковано 05.01.2015 20:53:57 | | |

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


112.97.37.90 - - [14/вересня/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 Mobile 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


kill -USR1 'cat ${pid_path}'


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

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

Навіть якщо команда mv була виконана на файлі до kill -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 він пише власний код для обробки повторного відкриття log файлу nginx при отриманні сигналу USR1. Конкретний принцип такий:

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


2. Потім змінити власника файлу журналу на «worker process», щоб worker process мав права на читання та запис файлу журналу (master і worker зазвичай працюють як різні користувачі, тому власника потрібно змінити).


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



Відкриється файл із доданим вищезазначеним кодом

Формат — «Shell file path to be execute». * можна розуміти як «кожну», кожну хвилину, кожну годину, щомісяця тощо.

Я налаштував скрипт, який запускає 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 00:04:30 |
О, чи може відповідь приносити гроші?
 Орендодавець| Опубліковано 06.01.2015 00:06:16 |
Джонянг опубліковано 2015-1-6 00:04
О, чи може відповідь приносити гроші?

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

Для чого потрібен престиж?
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com