【问题标题】:What permission/user does apache2 use to write django logsapache2 使用什么权限/用户来编写 django 日志
【发布时间】:2023-03-24 01:12:01
【问题描述】:

我有一个非常好的问题,我希望专家为我发表评论。 (也许是格雷厄姆·邓普顿)

所以我有一个 Django Web 应用程序(在 ubuntu 16.04 上开发),它在 /var/log/apache2/APPNAME.log 上记录了一些故障,如下所示。

由于 /var/log/apache2 中的所有文件都有 root:adm 所有者,我以同样的方式授予了我的日志文件的所有权,并确保 www-data 是 adm 组的成员。然后我将 rwx 授予所有者组的 adm 组,我测试一切正常。

24 小时后,文件和父文件夹的权限发生了变化,我可以看到日志文件和父目录的写入权限已被撤销,导致权限被拒绝错误,因为无法写入日志文件。

如果您能提供帮助,以下是我的问题:

1) 放置 Django 日志文件的正确位置在哪里?

2) 什么用户权限下的进程写入文件?

3) 哪个进程会重置 /var/log/apache 中的权限,为什么?

非常感谢您,

我希望这个问题也对其他人有所帮助。

干杯, 迈克

views.py

from django.shortcuts import render
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django import forms
from django.core.mail import send_mail, EmailMessage
from StudioHanel.forms import ContactForm

import traceback
import time

# import the logging library
import logging
import sys

# Get an instance of a logger
#logger = logging.getLogger('APPNAME')

def contact(request):
    logger.debug('Contact Start!') 

    if request.method == 'POST':
        etc...

settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },

    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },

        'applogfile': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': os.path.join('/var/log/apache2', 'APPNAME.log'),
            'maxBytes': 1024*1024*15,  15MB
            'backupCount': 10,
        },


     },

    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        'APPNAME': {
            'handlers': ['applogfile',],
            'level': 'DEBUG',
        },
    }
}

【问题讨论】:

  • 你的操作系统是什么?
  • Ubuntu 16.04 是操作系统。 Web 服务器是 apache 2.4.18。贾格诺 1.7。如果您认为它也可以帮助其他人,请评价这个问题。干杯。

标签: python django apache mod-wsgi


【解决方案1】:

1) 放置 Django 日志文件的正确位置在哪里?

最近我在 django-users 邮件列表中发起了一个discussion,关于用于 Django 项目的目录,我得出的结论是没有标准做法。我已经决定使用/var/log/django-project-name

无论如何,/var/log/apache2 是错误的地方,因为您发现的问题,logrotate 会干扰。更多内容如下。

2) 什么用户权限下的什么进程写入文件?

如果你使用 Gunicorn,它是 gunicorn 进程,如果你使用 uWSGI,它是 uwsgi。从您对 Graham Dumpleton 的引用来看,您正在使用 mod_wsgi。所以这个进程就是 mod_wsgi 守护进程。

这些进程正在写入文件的用户是进程运行的用户。对于 mod_wsgi,您可以为 WSGIDaemonProcess 指令指定 user 选项。根据its documentation,“如果未提供此选项,则守护进程将以与 Apache 运行子进程相同的用户身份运行,并由 User 指令定义。”在 Ubuntu 中,这是www-data。我认为使用 user 选项并以不同的专用用户身份运行守护程序是个好主意。

您不应将www-data 添加到adm 组。 adm 组是有权读取日志文件的人。 www-data 不应该有这样的权限。 (读写自己的日志文件没问题,但你不希望它有读取/var/log/syslog的权限。)

3) 哪个进程会重置 /var/log/apache 中的权限,为什么?

logrotate,由cron运行;见/etc/cron.daily/logrotate/etc/logrotate.d/apache2 的配置操作与 /var/log/apache2/*.log 匹配的所有文件。 logrotate 的主要目的是轮换日志。也就是说,它每天都会创建一个新的日志文件,昨天的命名为access.log.1,昨天的命名为access.log.2.gz,以此类推,超过几天的日志被删除。这样做是为了节省空间并使日志易于管理。 logrotate 也会修复文件权限错误。

理论上你应该配置 logrotate 来轮换你的 Django 项目的日志,否则它们最终可能会填满磁盘。

【讨论】:

    【解决方案2】:

    对于 mod_wsgi,您最好将 Python 日志记录定向到 stderrstdout,以便在 Apache 错误日志中捕获它。不要像使用 Apache 日志文件那样创建单独的日志文件,诸如日志文件轮换之类的事情将自动为您处理。有关示例,请参见以下“记录 Python 异常”:

    请确保为 VirtualHost 为 Apache 配置单独的错误日志,以便您的站点日志记录单独保存到主 Apache 错误日志中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-07
      • 2015-08-31
      • 2013-09-12
      • 2011-03-12
      • 2021-03-16
      • 2011-02-12
      • 1970-01-01
      • 2012-06-03
      相关资源
      最近更新 更多