Nginx 静态资源代理和日志优化配置

在 Nginx 配置中,有时我们需要对某些特定文件(如 favicon.icorobots.txt)关闭访问日志(access_log)和错误日志( error_log)记录,以减少不必要的日志输出。

通常的做法是使用 location 指令匹配这些文件,并通过 access_log offlog_not_found off 来关闭日志记录。例如:

server {
    # ...

    # 主要路由配置
    location / {
        proxy_pass http://127.0.0.1:30021; # 前端项目
        proxy_hide_header X-Powered-By;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
}

然而,这种配置方式存在一个问题:当访问 /favicon.ico/robots.txt 时会直接返回 404 错误,因为这些文件应该通过代理服务器获取。

为了解决这个问题,我们可以使用命名位置(named location)@app 来复用代理配置:

server {
    # ...

    # 定义可复用的命名位置配置
+    location @app {
+        proxy_pass http://127.0.0.1:30021;        # 将请求代理到本地 30021 端口
+        proxy_hide_header X-Powered-By;           # 隐藏后端服务器信息,提高安全性
+    }

    # 主要路由配置
    location / {
-        proxy_pass http://127.0.0.1:30021; # frontend project
-        proxy_hide_header X-Powered-By;
+        try_files $uri @app;    # 先尝试访问文件,如果不存在则代理到后端应用
    }

-    location = /favicon.ico { access_log off; log_not_found off; }
    # favicon.ico 处理
+    location = /favicon.ico {
+        access_log off;         # 关闭访问日志
+        log_not_found off;      # 关闭 404 错误日志
+        try_files $uri @app;    # 本地不存在则从代理获取
+    }

-    location = /robots.txt  { access_log off; log_not_found off; }
    # robots.txt 处理
+    location = /robots.txt {
+        access_log off;         # 关闭访问日志
+        log_not_found off;      # 关闭 404 错误日志
+        try_files $uri @app;    # 本地不存在则从代理获取
+    }
}

通过这种配置方式,不仅可以关闭这些文件的日志记录,还能确保它们能够正确地从代理服务器获取内容。