По какой-то причине мне нужно определить один и тот же файл журнала доступа для двух из многих виртуальных хостов Apache. Поддерживается ли он технически веб-сервером Apache? Возникнет ли конфликт при использовании того же файла журнала?
<VirtualHost A>
...
CustomLog logs/AB_access_log common
...
</Virtualhost>
<VirtualHost B>
...
CustomLog logs/AB_access_log common
...
</Virtualhost>
Практически да.
Возможные условия гонки не могут возникнуть между виртуальными хостами. Они могут происходить между дочерними процессами (потоками) apache.
Если несколько виртуальных хостов apache будут входить в один и тот же файл, используя один и тот же дочерний процесс / поток apache, это не будет означать реальный источник проблем, потому что один процесс / поток обслуживает только один запрос одновременно.
Проблема гонки может возникнуть, если несколько запросов, таким образом, несколько дочерних процессов / потоков одновременно регистрируются в одном и том же файле. Однако это может происходить на одном виртуальном хосте - и, следовательно, в одном и том же файле журнала - если он обслуживает одновременно несколько запросов и, таким образом, может одновременно добавлять файл журнала. Это может произойти даже с одним файлом журнала на одном виртуальном хосте.
В исходном коде директив общего журнала ясно видно, что ведение журнала происходит с apr_file_write_full ()
Вызов API из внутреннего буфера в файл журнала (см. flush_log ()
около строки 1135).
Более глубокий анализ источника показывает, в случае если одно событие журнала приведет к появлению нескольких строк, тогда одновременные записи могут смешивать строки, но не содержимое. Однако в обычных директивах CustomLog это невозможно.
Кроме того, проверяя низкоуровневое поведение, мы также можем обнаружить, что библиотека apr - внутренний кросс-платформенный API apache - использует apr_file_write ()
, который вызывает уже атомарные вызовы write ()
. Это происходит в размерах блоков, эти блоки, вероятно, такие же, как размеры системной страницы, то есть 4096. Обычные директивы CustomLog практически никогда не становятся такими длинными.
Если вы каким-то образом обманете ведение журнала Apache, чтобы создать чрезвычайно дерьмовые записи журнала, со строками длиннее, чем размер страницы (4096), я бы не стал исключать некоторую вероятность взломанного журнала. Однако я почти уверен, что apache что-то делает против.