Nginx - error_log для динамических хостов

Как я могу получить файл журнала ошибок для динамических виртуальных хостов?

server {
    listen 80;

    server_name ~^(?<folder>[^.]*).(?<user>[^.]*).dev.example.com;

    root /var/www/projects/dev/$user/$folder/htdocs;
    access_log /var/www/projects/dev/$user/$folder/access.log;
    error_log  /var/www/projects/dev/$user/$folder/error.log;
}

Корень и access_log работают правильно, но если я добавлю строку error_log, nginx не запустится, потому что / var / www / projects / dev / $ user / $ folder / не существует.


person 3pepe3    schedule 02.08.2018    source источник
comment
Я знаю, что это не тот ответ, на который вы надеялись, но, поскольку он отвечает на вопрос, не могли бы вы принять ответ и / или присудить награду? Если вы не выполните никаких действий в течение следующих 4 часов льготного периода, по крайней мере половина суммы вознаграждения будет безвозвратно потеряна.   -  person cnst    schedule 12.08.2018
comment
Спасибо за награду! +1!   -  person cnst    schedule 12.08.2018


Ответы (1)


Это просто не поддерживается - вы можете использовать переменные в http://nginx.org/r/access_log , но не в http://nginx.org/r/error_log.

P.S. Обратите внимание, что в целом использование переменных, вводимых пользователем, в access_log или error_log - это довольно плохая идея, поскольку вы создаете возможность для злоумышленника исчерпать inodes в вашей файловой системе, выполняя запросы со случайными строками в заголовке Host, что может привести к созданию нового файла для каждого нового запроса. Это может произойти даже случайно (без злого умысла), если кто-то просто попытается перечислить всех возможных пользователей на вашем сервере. Ваш конкретный код не обязательно страдает от этого, поскольку каталоги обычно не создаются автоматически каким-либо программным обеспечением UNIX, но это все еще не лучший способ что-то делать.

Согласно философии nginx, было бы лучше создать отдельный http://nginx.org/r/server config для каждого пользователя (поскольку nginx можно перезапустить без простоя). Учтите, что у него есть дополнительные преимущества, потому что nginx в значительной степени полагается на математически эффективные структуры данных для поиска правильного server (чего нет в конфигурациях сервера на основе регулярных выражений). Отказ от использования переменных в access_log также обеспечит буферизацию записи в access_log, что может значительно увеличить эффективную пропускную способность вашего сервера (особенно, если вы входите на жесткие диски, отличные от SSD).

По сути, в nginx уже есть много бандэдов для поддержки переменных внутри access_log (просто посмотрите список ограничений на http://nginx.org/r/access_log для случаев, когда для указания файла используются переменные), и, я думаю, было сочтено неуместным вводить еще больше таких бандажей и в error_log (особенно с учетом того, что error_log в производстве сценарии не должны быть такими большими, как access_log, поэтому при необходимости вы можете легко написать внешние инструменты, чтобы разделить их).

person cnst    schedule 04.08.2018
comment
Кстати, одну вещь я даже забыл упомянуть явно - куда вы можете ожидать появления сообщений об ошибках, если ваш error_log указывает файл в несуществующем каталоге ?! По этой и многим другим причинам переменные не поддерживаются (и не должны поддерживаться) для error_log. - person cnst; 11.08.2018