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

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

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

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

Например, я хочу включить ID пользователя и информацию о времени в 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.

2
задан 8 April 2019 в 18:44
1 ответ

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

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

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

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

Дополнительная информация о версии Apache .

0
ответ дан 24 December 2019 в 15:12

Теги

Похожие вопросы