是否可以配置 nginx 在错误日志中输出文件路径的指定部分?Fe:
2017/09/16 19:59:28 [error] 10656#10656: *1702 open() "/home/user/www/favicon.ico" failed (2: No such file or directory), client: 256.256.256.256, server: example.com, request: "GET /favicon.ico HTTP/1.1", host: "example.com", referrer: "http://example.com/"
用户在“/home/user/”上进行了 chroot,因此该用户的“favicon.ico”具有以下路径:“/www/favicon.ico”。文件的实际路径有点令人困惑。
答案1
此错误消息由 PHP FastCGI 服务器输出。要使其使用相对于 chroot 的路径,请在 chroot 中运行 FastCGI 服务器。(这还会对 PHP 脚本进行沙盒处理,这可能是一件好事!)
答案2
您可以报告访问日志中缺少的 URI,而不是在错误日志中报告缺少的路径名。
例如:
try_files $uri $uri/ =404;
除记录缺失的 URI 时外,上述语句的行为应nginx
与其默认行为几乎相同。
看这个文件了解更多信息。
答案3
如果有人遇到类似的问题,这就是我解决问题的方法(它不能被标记为正确的问题,因为这是一种解决方法):
inotifywait -m -e modify --format "%w%f" /home/user/log/nginx/example.com.error.log | while read f; do if [[ $(grep "/home/user" $f | wc -c) != 0 ]] ; then sed 's/\/home\/user//g' $f > $f\t ; cat $f\t > $f ; fi done
在哪里通知等待(inotify-tools 包)是处于监视模式的文件监视程序,当文件发生修改时触发:
inotifywait -m -e modify --format "%w%f"
然后,我们需要在 while 循环中运行 2 个命令,但首先检查文件的新修改是否包含特定字符串,以避免陷入无限循环:
if [[ $(grep "/home/user" $f | wc -c) != 0 ]]
如果命令的结果grep“/home/user”$f通过厕所这是字符串的平均长度!= 0然后修改文件,替换所有/主页/用户到 0 长度字符串//,将输出保存在临时文件中,并最终将临时文件的输出写入 nginx 错误日志文件猫 $f\t > $f
sed 's/\/home\/user//g' $f > $f\t; cat $f\t > $f;done