Открывает ли и закрывает ли Apache каждый журнал при каждом доступе?

Открывает ли и закрывает ли Apache каждый журнал при каждом доступе?

Вопрос касается журналов доступа и ошибок, особенно при наличии нескольких хостов (экземпляров Apache, установленных на нескольких серверах) и централизованном хранении журналов в сетевой файловой системе.

Закрывает ли Apache каждый файл журнала после каждой записи?

Если да, то на загруженном сервере, на котором размещено множество сайтов, каждый из которых имеет свой собственный журнал, может ли это стать потенциальным узким местом производительности?

Если нет, то каково решение, если несколько серверов записывают данные в одно место в сетевой файловой системе?

решение1

Закрывает ли Apache каждый файл журнала после каждой записи?

Используйте источник, он находится по адресу: https://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/modules/loggers/mod_log_config.c?view=markup

Вы можете прочитать из него:

251     * log_writer is NULL before the log file is opened and is
252     * set to a opaque structure (usually a fd) after it is opened.

Это своего рода намеки на то, что он открыт только один раз. Фактически, если вы посмотрите на код, он открывается рано, при инициализации, и затем никогда не закрывается, по очевидным причинам производительности.

Если нет, то каково решение, если несколько серверов записывают данные в одно место в сетевой файловой системе?

Никогда не делайте этого по двум причинам. Во-первых, не ведите удаленный журнал таким образом. Ведите локальный журнал (и отправляйте файлы журналов отдельно, например, вы можете чередовать их по часам) или используйте соответствующие демоны, которые syslogпо умолчанию знают, как отправлять содержимое журнала по UDP (или TCP), как это делают более новые решения. Не монтируйте удаленный диск и не записывайте на него файлы журналов, это убьет производительность и создаст кучу проблем (особенно если вы имеете в виду удаленный, как в "NFS").

И даже если локально каждое приложение должно вести журнал в свой собственный файл журнала, не допускайте, чтобы несколько приложений вели журнал в один и тот же файл, это обязательно приведет к возникновению всевозможных состояний гонки, перезаписи и т. д. Сам по себе Apache — это одно приложение, даже если оно разветвляется, но если у вас есть два Apache, работающих по отдельности на одном хосте с разными конфигурациями, каждый из них должен вести журнал в свой собственный файл журнала.

Или взгляните на функцию Apache по ведению журнала в каналах, но у нее тоже есть недостатки.

решение2

Насколько мне известно, несколько веб-серверов Apache не могут одновременно записывать данные в один и тот же файл журнала.

Для кластеров вы либо позволяете каждому узлу записывать данные в свой собственный файл журнала, а затем выполняете некоторую постобработку для их объединения, либо позволяете Apache генерировать события системного журнала, отправлять их на центральный сервер системного журнала, где вы можете объединить их в один файл, либо используете решение для агрегации журналов, такое как ELK Stack, Graylog, Splunk и/или другие, для отправки событий журнала со всех узлов кластера в единую базу данных больших данных.

Связанный контент