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

Добавить пользовательские переменные в журнал доступа nginx из PHP-FPM

С log_format можно включить ряд переменных, например $ http_user_agent:

http://nginx.org/en/docs/http/ngx_http_core_module.html#variables

Но можно ли включить переменную из PHP-FPM?

Например, я хотел бы включить идентификатор пользователя и информацию о времени в access_log.

Одна из возможностей - установить заголовок в PHP, а затем использовать $ sent_http_XXX:

log_format inc_info '... [$sent_http_x_user_id] ...';
access_log /var/log/nginx/access.log inc_info;

<?php
  header('X-User-ID: ' . head(USER_ID));
?>

Где вам, вероятно, следует использовать proxy_hide_header чтобы остановить отправку этих заголовков клиенту.

Но этот подход на основе заголовков не работает, если заголовки уже были отправлены. Например, я использую register_shutdown_function() в PHP для регистрации времени обработки.


Кстати, если вам просто нужно время обработки, то $ upstream_response_time может оказаться полезным.


Для сравнения, в Apache это можно сделать с помощью:

LogFormat "... [%{USER_ID}n] ..." inc_info
CustomLog /var/log/httpd/access_log inc_info

С соответствующим PHP:

if (function_exists('apache_note')) {
    apache_note('USER_ID', USER_ID);
}

Хотя apache_note() доступен только в mod_php, и не работает с PHP-FPM.

При использовании PHP-FPM вы можете отправлять только заголовки, а затем содержимое.

Итак, теперь я использую отдельный файл журнала, созданный с помощью PHP, в который можно записать в любое время - даже после отправки заголовков и содержимого.

Это особенно полезно при использовании fastcgi_finish_request(), который позволяет вам вернуть страницу пользователю (возможно, страницу "загрузки"), поскольку ваш сценарий продолжает обрабатывать данные.

Чтобы связать журнал доступа к веб-серверу с этим новым файлом журнала, я генерирую уникальный (ish) код для каждого запроса, отправляю его в виде заголовка (для регистрации в журналах доступа к веб-серверам) и записываю его в файл журнала PHP. также.

Подробнее о версии Apache.