Назад | Перейти на главную страницу

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

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

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

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

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

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

Незначительное уточнение

Между виртуальными хостами не может произойти возможных условий гонки. Они могут происходить между дочерними процессами (потоками) 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 что-то делает против этого.