Недавно я переместил свою машину с CentOS 7 с Apache на nginx, и я все еще работаю над различиями. Одна проблема, которую я заметил только для одного из моих серверных блоков, заключается в том, что файлы журнала доступа и ошибок на самом деле не регистрируются, что затрудняет устранение потенциальных проблем.
Серверный блок моего сайта выглядит следующим образом:
server {
listen 80;
server_name example.com;
root /var/www/example.com/public_html;
index index.php;
access_log /var/www/example.com/logs/example.com_access.log;
error_log /var/www/example.com/logs/example.com_error.log error;
location / {
index index.php index.html;
}
location /reports {
autoindex on;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
error_page 404 /var/www/html/404.html;
error_page 500 502 503 504 /var/www/html/50x.html;
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
location /robots.txt {
#access_log off;
#log_not_found off;
}
location ~ /\.ht {
deny all;
}
}
Я не уверен, почему журналы не хранятся. Я сравнил права доступа к файлам в моих серверных блоках, и все они имеют одинаковые разрешения.
-rw-r--r--. 1 nginx root 0 Nov 7 02:54 example.com_access.log
-rw-r--r--. 1 nginx root 0 Nov 7 02:54 example.com_error.log
В чем может быть проблема, почему журналы не сохраняются?
Синтаксис Nginx здесь правильный, поэтому проблема связана с серверной средой. Вот несколько вещей, которые вы можете сделать для его отладки.
Смоделируйте, что будет делать веб-сервер. Попытка записать в файл того же пользователя, что и веб-сервер. Если пользователь веб-сервера - nginx, попробуйте это как root: su -m nginx -c 'echo "testing">>/var/www/example.com/logs/example.com_error.log'
Посмотрите, что делает веб-сервер. В качестве временной меры отладки на верхнем уровне конфигурации Nginx добавьте daemon off
. Затем остановите Nginx и начните с него strace nginx | tee nginx-output.txt
. Затем он будет работать на переднем плане и передавать все системные вызовы, которые он выполняет, в STDOUT, который также будет записан в nginx-output.txt. Сделайте что-нибудь, чтобы вызвать ошибку, а затем вы можете остановить Nginx, удалить строку «демон» и запустить его в обычном режиме, пока вы просматриваете журнал отладки. Найдите в нем упоминания о названии файла, о котором идет речь. Возможно, вы найдете его там, с ошибкой, возвращаемой системным вызовом при попытке доступа к файлу.
Другая возможность заключается в том, что вы не согласны с Nginx относительно того, что должно отображаться в журнале ошибок. Если nginx -V | grep debug
получает результат, то вы можете изменить последний аргумент на error_log
из error
к debug
. Перезагрузите Nginx и выберите URL-адрес, который не существует в домене, это должно вызвать большое количество журналов. Выключить debug
регистрация, когда закончите.