Nginx

nginx沒有將錯誤記錄到日誌文件中

  • September 6, 2019

我最近將我的 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 語法在這裡是正確的,所以問題與伺服器環境有關。您可以執行以下操作來調試它。

  1. 模擬 Web 伺服器會做什麼。嘗試使用 Web 伺服器將使用的同一使用者寫入文件。如果 Web 伺服器使用者是 nginx,則以 root 身份嘗試: su -m nginx -c 'echo "testing">>/var/www/example.com/logs/example.com_error.log'
  2. 觀察 Web 伺服器在做什麼。作為臨時調試措施,在 Nginx 配置的頂層添加daemon off. 然後停止 Nginx 並開始使用它strace nginx | tee nginx-output.txt。然後它將在前台執行並將它發出的所有系統呼叫發送到 STDOUT,這也將在 nginx-output.txt 中擷取。做一些事情來觸發錯誤,然後你可以停止 Nginx,刪除“守護程序”行並在查看調試日誌時正常啟動它。在其中搜尋有關文件名的提及。也許您會在那裡找到它,系統呼叫會返回一個錯誤,試圖訪問該文件。

另一種可能性是您不同意 Nginx 關於錯誤日誌中應該出現的內容。如果nginx -V | grep debug得到結果,那麼您可以將最後一個參數更改為error_logfrom errorto debug。重新載入 Nginx 並點擊域中不存在的 URL,這應該會生成大量日誌記錄。完成後關閉debug日誌記錄。

引用自:https://serverfault.com/questions/735704