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