![Nginx 通配符子域名自动创建访问日志文件](https://linux22.com/image/745123/Nginx%20%E9%80%9A%E9%85%8D%E7%AC%A6%E5%AD%90%E5%9F%9F%E5%90%8D%E8%87%AA%E5%8A%A8%E5%88%9B%E5%BB%BA%E8%AE%BF%E9%97%AE%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6.png)
我在 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-data
nginx 以用户身份运行- 日志目录权限为0755