我正在使用以下Nginx反向代理配置。
server {
listen 80;
listen [::]:80;
server_name www.test.com;
access_log /var/log/nginx/www.test.com.access.log;
error_log /var/log/nginx/www.test.com.error.log warn;
location / {
proxy_pass http://12.23.45.78:8080;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
}
通過添加access_log
和error_log
參數,它將記錄訪問日志。
現在我想跳過一些日志記錄,例如不記錄favicon.ico
和apple-touch-icon.png
,所以我添加了以下配置。
location ~* ^/(?:favicon|apple-touch-icon) {
log_not_found off;
access_log off;
}
但問題是,當我這樣做時,http://www.test.com/favicon.ico
將無法正確訪問,它會提示“404 Not Found
”錯誤。
這似乎表明反向代理主機正在接管favicon.ico
訪問,而沒有將其轉發到上游進行處理,請問這是正常的Nginx行為嗎?
如果這是正常行為,我應該如何設置不記錄給定資源的日志?
提前感謝您的幫助!
每個請求都會在某個位置結束(如果之前沒有完成)。每個位置都使用自己的內容處理程序。除非您通過內容處理程序聲明指令明確指定某些內容(例如,位不限于
proxy_pass
、fastcgi_pass
、uwsgi_pass
、etc.)),否則它將是一個靜態內容處理程序,用于從本地文件系統提供請求的內容。請查看我的服務器故障答案(1、2)以了解更多詳細信息。在某些情況下,這樣的任務可以使用
map
塊來解決,例如:。當您需要實現條件基本身份驗證(示例)時,這種方法可以工作。不幸的是,它不能與
access_log
指令一起工作-相反,nginx將為圖標請求創建第二個名為off
的日志文件。因此,如果您希望將每個請求傳遞到12.23.45.78
上游,我看不到任何其他方法,只能為這兩個位置復制內容處理程序聲明。但是,每一個其他使用的指令都可以上移一級,從而被兩個位置繼承:另一方面,沒有什么可以阻止您在本地提供這兩個文件,并且不將這些請求傳遞到任何地方。只需將它們放在某個專用目錄中,并使用帶有靜態內容處理程序的位置: