Использование одного и того же файла журнала доступа для двух из множества виртуальных хостов

По какой-то причине мне нужно определить один и тот же файл журнала доступа для двух из многих виртуальных хостов Apache. Поддерживается ли он технически веб-сервером Apache? Возникнет ли конфликт при использовании того же файла журнала?

<VirtualHost A>
...
CustomLog logs/AB_access_log common
...
</Virtualhost>

<VirtualHost B>
...
CustomLog logs/AB_access_log common
...
</Virtualhost>
0
задан 25 May 2019 в 21:09
1 ответ

Краткий ответ

Практически да.

Незначительное пояснение

Возможные условия гонки не могут возникнуть между виртуальными хостами. Они могут происходить между дочерними процессами (потоками) apache.

Если несколько виртуальных хостов apache будут входить в один и тот же файл, используя один и тот же дочерний процесс / поток apache, это не будет означать реальный источник проблем, потому что один процесс / поток обслуживает только один запрос одновременно.

Проблема гонки может возникнуть, если несколько запросов, таким образом, несколько дочерних процессов / потоков одновременно регистрируются в одном и том же файле. Однако это может происходить на одном виртуальном хосте - и, следовательно, в одном и том же файле журнала - если он обслуживает одновременно несколько запросов и, таким образом, может одновременно добавлять файл журнала. Это может произойти даже с одним файлом журнала на одном виртуальном хосте.

Параллелизм в ведении журнала Apache

В исходном коде директив общего журнала ясно видно, что ведение журнала происходит с apr_file_write_full () Вызов API из внутреннего буфера в файл журнала (см. flush_log () около строки 1135).

Более глубокий анализ источника показывает, в случае если одно событие журнала приведет к появлению нескольких строк, тогда одновременные записи могут смешивать строки, но не содержимое. Однако в обычных директивах CustomLog это невозможно.

Кроме того, проверяя низкоуровневое поведение, мы также можем обнаружить, что библиотека apr - внутренний кросс-платформенный API apache - использует apr_file_write () , который вызывает уже атомарные вызовы write () . Это происходит в размерах блоков, эти блоки, вероятно, такие же, как размеры системной страницы, то есть 4096. Обычные директивы CustomLog практически никогда не становятся такими длинными.

Если вы каким-то образом обманете ведение журнала Apache, чтобы создать чрезвычайно дерьмовые записи журнала, со строками длиннее, чем размер страницы (4096), я бы не стал исключать некоторую вероятность взломанного журнала. Однако я почти уверен, что apache что-то делает против.

0
ответ дан 23 November 2019 в 23:44

Теги

Похожие вопросы