У меня почти 200 поддоменов на NGINX и есть директива
access_log /var/log/nginx/$host-access.log;
Проблема в том, что ни один из файлов журнала доступа к поддомену на самом деле не существует, поэтому журнал ошибок загружается с такими ошибками, как
(13: Permission denied) while logging request...
Это установка Wordpress Multisite, поэтому субдомены создаются внутри базы данных WP. NGINX ничего не знает, пока не поступит запрос.
Как с этим справиться? Я думал о написании PHP-скрипта, который анализирует URI и проверяет наличие файла журнала, записывая его, если он не существует. Мне все равно, если не будет зарегистрирован самый первый запрос. Или есть способ, чтобы NGINX изначально создавал файл журнала, если он не существует? Я знаю, что из-за неверных запросов будет создано несколько файлов журнала мусора. Сценарий PHP позволит этого избежать. Любой совет приветствуется!
С помощью $host
в имени файла - не лучший подход. Это означает, что ваш веб-сервер может быть атакован, отправив запросы с миллионами различных Host:
содержимое заголовка. Это может привести к исчерпанию inode в вашей файловой системе.
Чтобы этого не произошло, все ваши поддомены должны быть перечислены в nginx. server_name
директива, а затем используйте $server_name
в качестве переменной в имени файла журнала. Для виртуального хоста по умолчанию вы можете использовать один файл журнала или вообще не использовать файл журнала.
Однако, чтобы решить вашу текущую проблему с разрешениями, вы должны убедиться, что у пользователя, запускающего nginx, есть права на запись в каталог журнала nginx.
Например, следует применить следующее:
/var/log/nginx
www-data
www-data
пользователь