Nginx 通配符子域名自动创建访问日志文件

Nginx 通配符子域名自动创建访问日志文件

我在 NGINX 上有近 200 个子域名,并且有指令

access_log  /var/log/nginx/$host-access.log;

问题是,子域名访问日志文件实际上并不存在,因此错误日志中充满了类似这样的错误

(13: Permission denied) while logging request...

这是 Wordpress 多站点安装,因此子域名是在 WP 数据库内创建的。NGINX 在收到请求之前一无所知。

如何处理?我曾考虑编写一个 PHP 脚本来解析 URI 并检查日志文件是否存在,如果不存在则写入。我不在乎第一个请求是否被记录。或者有没有办法让 NGINX 首先创建日志文件(如果不存在)?我知道这会因不良请求而创建一些垃圾日志文件。PHP 脚本可以避免这种情况。任何建议都值得赞赏!

答案1

在文件名中使用$host不是一个好方法。这意味着您的 Web 服务器可能会通过发送包含数百万个不同Host:标头内容的请求而受到攻击。这可能会导致文件系统中的 inode 耗尽。

为了防止这种情况,您应该在 nginx 指令中列出所有子域server_name,然后$server_name在日志文件名中将其用作变量。对于默认 vhost,您可以使用一个日志文件或根本不使用日志文件。

但是,为了解决当前的权限问题,您应该确保运行 nginx 的用户对 nginx 日志目录具有写权限。

例如,您应该应用以下内容:

  • 日志文件目录位于/var/log/nginx
  • 日志目录所有者是www-data
  • www-datanginx 以用户身份运行
  • 日志目录权限为0755

相关内容