python - apache2用什么权限/用户写django日志

标签 python django apache mod-wsgi

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

所以我有一个 Django 网络应用程序(在 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 中的权限,为什么?

非常感谢您,

我希望这个问题也能帮助到其他人。

干杯, 迈克

View .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...

设置.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',
        },
    }
}

最佳答案

1) Django 日志文件放在哪里合适?

最近我发起了一个discussion在关于用于 Django 项目的目录的 django-users 邮件列表中,我得出的结论是没有标准做法。我已经决定使用 /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 项目的日志,否则它们最终可能会填满磁盘。

关于python - apache2用什么权限/用户写django日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40714691/

相关文章:

php - 如何使用 PHP 获取服务器的本地 IP 地址?

python - 为什么可变实体不能是字典键?

python - 检查 python 列表/numpy ndarray 中是否存在重复项的最快方法

python - Django - 了解 X-Sendfile

python - Apache 2.4 无法在 Yosemite 上加载 mod_wsgi.so

apache - 即使我的浏览器尝试下载 .pl 脚本,如何执行它?

python - 何时以及为什么应该使用命名元组而不是字典?

Python 函数意外修改外部函数中的变量

django - Google Authenticator (Android) + Django 即使在时间同步之后也说无效 token

javascript - 如何为一组在 Django 中创建的 for 循环中重复的 html 代码运行 JavaScript 代码?